Аналог протокола дескриптора Python на других языках?

Есть ли что-то вроде протокола дескриптора Python, реализованного на других языках? Это кажется хорошим способом повысить модульность/инкапсуляцию без раздувания реализации вашего содержащего класса, но я никогда не слышал о подобном в других языках. Вероятно, он отсутствует в других языках из-за накладных расходов на поиск?


person cdleary    schedule 29.08.2008    source источник


Ответы (2)


Прямого аналога я тоже не слышал. Вероятно, вы могли бы добиться того же эффекта с помощью макросов, особенно в таком языке, как Lisp, который имеет чрезвычайно мощные макросы.

Я совсем не удивлюсь, если другие языки начнут включать что-то подобное, потому что это настолько мощно.

person Andrew Wilkinson    schedule 29.08.2008

И Ruby, и C# позволяют легко создавать средства доступа, указывая методы получения/установки для атрибута, как в Python. Однако это не предназначено для того, чтобы вы могли естественным образом писать код для этих методов в другом классе так, как это позволяет Python. На практике я не уверен, насколько это важно, поскольку каждый раз, когда я видел атрибут, определенный через протокол дескриптора, он был реализован в одном и том же классе.

РЕДАКТИРОВАТЬ: Черт бы побрал мою дислексию (под которой я подразумеваю небрежное чтение). По какой-то причине я всегда читаю «дескриптор» как «декоратор» и наоборот, даже когда я печатаю их оба. Я оставлю свой пост нетронутым, поскольку он содержит достоверную информацию, хотя и не имеющую абсолютно никакого отношения к вопросу.

Сам термин «декоратор» на самом деле является названием шаблона проектирования, описанного в знаменитой книге «Шаблоны проектирования». Статья в Википедии содержит множество примеров использования декораторов на разных языках программирования: http://en.wikipedia.org/wiki/Decorator_pattern

Однако декораторы в этой статье объектно-ориентированы; у них есть классы, реализующие предопределенный интерфейс, который позволяет другому существующему классу вести себя по-другому и т. д. Декораторы Python действуют функциональным образом, заменяя функцию во время выполнения другой функцией, позволяя вам эффективно изменять/заменять эту функцию, вставлять код и т. д.

В мире Java это известно как аспектно-ориентированное программирование, и компилятор AspectJ Java позволяет вам делать такие вещи и компилировать ваш код AspectJ (который является надмножеством Java) в байт-код Java.

Я недостаточно знаком с C# или Ruby, чтобы знать, какой будет их версия декораторов.

person Eli Courtwright    schedule 08.09.2008
comment
протокол дескриптора отличается от шаблон декоратора в Python. Я имею в виду возможность превратить экземпляр объекта в атрибут другого объекта, который проксируется динамически. - person cdleary; 29.08.2008