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

StackOverflow https://stackoverflow.com/questions/34243

Вопрос

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top