From the daily archives: "Thursday, April 12, 2012"

Недавно на Хабре проскакивала статья, в которой человек описывал способы реализаиции своей «хотелки». Суть хотелки довольно путана описана в первоисточнике, поэтому я не буду ее дублировать, отсылая к оригинальной заметке, а от себя замечу, что по сути задача сводится к реализации примесей (mixins) в C#.

Конечно, решение автора не поражает изяществом. Давайте рассмотрим его проблемы несколько подробнее.

  • Интерфейс-метка IImplementor не имеет никакого семантического смысла, единственная его задача — это создавать иллюзию строгой типизации. Если мы его снимем — мы увидим то, чем он на самом деле является — голым object.
  • Необходимость сохранять функциональную связь между классами ведет к тому, что используются статические переменные, которые скрывают переменные классов-родителей. Особенно хорошо это видно в случае, если скомпилировать код — компилятор выдаст соответствующее предупреждение. Следует использовать метку new перед скрываемым полем, чтобы явно показать всю низость наших намерений.
  • Неоправданно много дублирования кода. В каждом без исключения объекте необходимо заводить статическое поле и переопределять виртуальную функцию получателя. Если по ошибке забыть это сделать — получим undefined behaviour на уровне системы, и найти ошибку в этом случае будет затруднительно.
  • Объект бизнес-логики (по постановке) обязан знать о возможности своего расширения «левым кодом», что явно нарушает SRP.
  • Необходимость сознательно соблюдать последовательность вызовоа метода — передавать в него тот же объект, от которого был запрошен исполнитель. Это очень легко нарушить непренамерено.

Автор сходу отметает решение с рефлексией, как не соответствующее духу бизнес-приложений. Предлагаемое же им решение не соответствует духу ООП в принципе. Кроме того, в .NET отказывать себе в использовании рефлексии все равно, что использовать только 300 слов из всего словаря Даля при общении. В рамках дискуссии предлагаю обобщить задачу до реализации примесей (а это по сути именно они) и в очередной раз героически ее решить.

Читать статью полностью →

PageLines