Действия Struts и композиция над наследованием - PullRequest
4 голосов
/ 01 октября 2009

Когда я хочу применить принцип СУХОЙ, т.е. объединить код нескольких действий Struts для разных вариантов использования (например, роль администратора и роль оператора), одним из вариантов будет использование абстрактного базового класса «BaseAction». «для действия, а затем используйте« AdminAction расширяет BaseAction »и« OperatorAction расширяет BaseAction ». Я бы применил наследование для абстрактных NewBaseAction, UpdateBaseAction, DeleteBaseAction, ListBaseAction.

Но есть принцип, который гласит: «отдавай предпочтение композиции, а не наследованию» (http://www.artima.com/lejava/articles/designprinciples4.html).. Есть ли способ реализовать это чисто, используя интерфейсы?

Ответы [ 3 ]

2 голосов
/ 02 октября 2009

Решение "композиция в пользу наследования" может быть либо:

  1. переместить общий код в отдельный, не Action класс, используемый всеми Action, о которых идет речь, или
  2. переместите другой код в отдельный, не Action класс и получите один Action, который может использовать любое из этих поведений.

Прошло несколько лет с тех пор, как я сделал Struts, но я думаю, что для (2) вам понадобится небольшая хитрость в struts-config.xml, настроив несколько <action> одного и того же класса Action с разными параметрами и Action может загружать или выбирать другую реализацию поведения в зависимости от параметров. Кажется, это немного не Strutsy, так как он берет некоторую логику управления, которая обычно находится прямо в struts-config.xml, и скрывает ее в коде.

Но в зависимости от вашей культуры развития это может считаться хорошей вещью.

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

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

2 голосов
/ 02 октября 2009

Заявление «отдавай предпочтение композиции, а не наследованию» - это ключ к улучшению дизайна в целом. Фреймворки, подобные Struts, вводят собственную модель программирования. Поэтому вы должны написать действие Struts таким образом, чтобы оно соответствовало передовым методикам Struts.

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

Найдите варианты использования "Struts way" по принципу СУХОЙ. Дополнительные рекомендации Struts вы найдете в бесплатной книге Руководство по выживанию Struts

0 голосов
/ 02 октября 2009

В качестве примечания:

Учтите, что "new" и "update" часто являются очень, очень похожими операциями и часто могут быть одним и тем же действием с одним оператором case вместо двух разных классов, поддерживающих, например, два разных JSP.

...