Есть ли что-то вроде протокола дескриптора Python, реализованного на других языках? Это кажется хорошим способом повысить модульность/инкапсуляцию без раздувания реализации вашего содержащего класса, но я никогда не слышал о подобном в других языках. Вероятно, он отсутствует в других языках из-за накладных расходов на поиск?
Аналог протокола дескриптора Python на других языках?
Ответы (2)
Прямого аналога я тоже не слышал. Вероятно, вы могли бы добиться того же эффекта с помощью макросов, особенно в таком языке, как Lisp, который имеет чрезвычайно мощные макросы.
Я совсем не удивлюсь, если другие языки начнут включать что-то подобное, потому что это настолько мощно.
И Ruby, и C# позволяют легко создавать средства доступа, указывая методы получения/установки для атрибута, как в Python. Однако это не предназначено для того, чтобы вы могли естественным образом писать код для этих методов в другом классе так, как это позволяет Python. На практике я не уверен, насколько это важно, поскольку каждый раз, когда я видел атрибут, определенный через протокол дескриптора, он был реализован в одном и том же классе.
РЕДАКТИРОВАТЬ: Черт бы побрал мою дислексию (под которой я подразумеваю небрежное чтение). По какой-то причине я всегда читаю «дескриптор» как «декоратор» и наоборот, даже когда я печатаю их оба. Я оставлю свой пост нетронутым, поскольку он содержит достоверную информацию, хотя и не имеющую абсолютно никакого отношения к вопросу.
Сам термин «декоратор» на самом деле является названием шаблона проектирования, описанного в знаменитой книге «Шаблоны проектирования». Статья в Википедии содержит множество примеров использования декораторов на разных языках программирования: http://en.wikipedia.org/wiki/Decorator_pattern
Однако декораторы в этой статье объектно-ориентированы; у них есть классы, реализующие предопределенный интерфейс, который позволяет другому существующему классу вести себя по-другому и т. д. Декораторы Python действуют функциональным образом, заменяя функцию во время выполнения другой функцией, позволяя вам эффективно изменять/заменять эту функцию, вставлять код и т. д.
В мире Java это известно как аспектно-ориентированное программирование, и компилятор AspectJ Java позволяет вам делать такие вещи и компилировать ваш код AspectJ (который является надмножеством Java) в байт-код Java.
Я недостаточно знаком с C# или Ruby, чтобы знать, какой будет их версия декораторов.