PHP - Логическая обработка

Мне нравится знать, какие преимущества RuleManager логику в отдельных классах, а не поместить всю логику в класс RuleManager.

Например

Разделить классы для каждой ответственности

class RuleManager {

    public function create(string $name)
    {
        return (new CreateRuleCommand($name));
    }


    public function list()
    {
        return new ListRulesCommand();
    }

}

против:

class RuleManager {

    public function create(string $name)
    {
        // Do all the create logic Here

        return $something
    }


    public function list()
    {
        // Add all the listing Logic Here

        return $something
    }

}
+1
18 мая '17 в 20:06
источник поделиться
2 ответа

В первом классе нет никаких преимуществ, потому что команды просто созданы там. Таким образом, можно легко избежать использования RuleManager (просто путем создания экземпляра командного класса вместо вызова метода create или list). Даже если мы будем использовать шаблон Factory вместо создания прямых классов, нам все равно не нужен RuleManager.

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

Другая проблема Rule Manager использует coincidental cohesion - методы, которые, вероятно, сгруппированы без каких-либо отношений. Это худший случай сплочения (например, вы можете прочитать Steve McConnel Code Complete) - так что лучше избегать этого.

Как правило, основным преимуществом сохранения логики в отдельных классах является изменение/замена этой логики и, конечно же, значительное уменьшение связи. Например, этот способ чрезвычайно распространен, когда используется шаблон Strategy - так что в этом случае мы сохраняем логику (стратегии) во внешних классах и можем легко изменить конкретную стратегию (конечно, нам нужно внедрить стратегию, а не создавать ее).

0
18 мая '17 в 22:20
источник

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

Это означает, что если одна из ваших "команд" должна изменить логику, "менеджер правил" на самом деле не затронут.

Честно говоря, мне не нравятся оба варианта. Но использование этих "командных" классов имеет логику в методах __construct() или __invoke(). Это будет довольно сложно проверить. И они действительно очень хрупкие. Небольшое изменение в зависимостях будет по-прежнему означать, что ваш "управляющий правилами" также должен быть изменен. И вы не можете расширять или заменять эти команды, не вызывая подобных изменений.

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

PS
"Управляющий" в RuleManger должен быть объявлен как "хммм".

0
18 мая '17 в 21:09
источник

Посмотрите другие вопросы по меткам или Задайте вопрос