Черты хороши или плохи? - PullRequest
9 голосов
/ 12 июля 2010

Это открытый вопрос, но я хотел бы запросить некоторые мнения сообщества SO по чертам;Как вы думаете, черты в Squeak / Pharo - это хорошо, или вам следует держаться подальше от них и использовать вместо этого композицию и делегирование?Я спрашиваю, потому что, хотя я знаю, как их использовать (благодаря книге Pharo), я не совсем уверен, насколько приемлемо их использовать или где это нормально, а где нет.

Ответы [ 2 ]

6 голосов
/ 12 июля 2010

Мне не нравятся черты, потому что они вводят сильные зависимости в коде. Эти зависимости могут быть очевидными (класс, который импортирует черту, черта, которая ожидает методы), но также очень тонкими (черта, которая скрывает супер методы / переменные экземпляра). Кроме того, нет адекватной поддержки инструмента для черт.

По моему опыту делегирование дает намного лучший и более многократно используемый дизайн в динамически типизированном объектно-ориентированном языке, таком как Smalltalk.

1 голос
/ 22 июля 2010

Вещи имеют свои плюсы и минусы. Лукас справедливо упоминает о многих минусах:

  • Ввести сильные зависимости в код.
  • нет адекватной поддержки инструмента.

Хотя второй может уйти однажды, первый не уйдет.

Целью признаков является предотвращение дублирования кода, которое возникает, когда два класса, которые не разделяют суперкласс, кроме Object, совместно используют метод экземпляра. Теперь, иногда делегация может это исправить, но часто это не может. Итак, про черт:

  • Уменьшено дублирование кода.

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

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

...