khusamov
@khusamov
ReactJS, NodeJS, TypeScript, Sencha ExtJS

Как уменьшить число классов без использования декораторов?

Внизу дан пример. Он сделан на декораторах. А чем это лучше такой вот реализации:

Сделать класс ElementStyle, от которого сделать наследование в виде множества разных стилей: ElementStrikedStyle, ElementHighlightedStyle, ElementInvertedStyle.

У класса Element сделать свойство styles как массив элементов типа ElementStyle. В него можно вкладывать любое количество в любой комбинации разные стили.

В итоге мы добились такого же результата (те же 4 класса, если не считать родительский), но зато не нужно тратить время на изучение декораторов.

Вот пример на декораторах (взят отсюда andrey.moveax.ru/post/patterns-oop-structural-deco...

Пример уменьшения числа классов

Предположим, необходимо разработать класс Element, реализующий элемент блок-схемы. Есть четыре стиля его отображения, которые надо комбинировать: по-умолчанию, инвертированный (inverted), зачеркнутый (striked), выделенный (highlighted). Кроме того, необходимо в дальнейшем легко добавлять новые стили и их комбинации.

При использовании наследования получим 8 классов: от Element, ElementInverted, ElementStriked, ElementHighlighted, ElementInvertedStriked и до ElementInvertedStrikedHighlighted. Добавление еще одного стиля, например рамки (ElementBorder), увеличит число классов до 16. Назвать это удобным, простым и надежным решением навряд ли можно.

Использование шаблона Декоратор ограничит число создаваемых классов до 4: основной Element и 3 Декоратора (ElementInvert, ElementStrike, ElementHighlight). В дальнейшем возможно их вкладывать один в другой для достижения нужного результата. Кроме того, такой подход более гибкий в работе. Например, можно сначала инвертировать, а потом подсветить или наоборот. Да и поддерживать такой код проще.


Вот и вопрос. Зачем нужны декораторы, если ту же задачу можно решить более простым и понятным способом на ООП?

И плюс решение более гибкое. Декораторы не имеют возможности наследоваться. А тут мы можем спокойно сделать потомка, например класса ElementHighlightedStyle (например ElementColorHighlightedStyle).
  • Вопрос задан
  • 164 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы