Ответы пользователя по тегу Паттерны проектирования
  • Корректно ли реализована DI?

    @MadridianFox
    Web-программист, многостаночник
    В вашем коде нет DI.
    Задача DI - избавиться от жёсткой связи между классами. Т.е. если вы заходите вместо класса DB в классе NeedDB использовать другой класс (ну там тесты гонять или задача такая), то вам придётся редактировать код класса NeedDB. DI - это техника, когда вы "снаружи" определяете какой класс будет использоваться.
    Обычно для этого выделяется какой-нибудь ServiceLocator - объект у которого можно попросить объект нужного класса, и он отдаст его. Более радикальный способ - всегда передавать зависимости через конструктор. Этот способ идеологически более чистый, но и более навязчивый, т.к. вам надо всегда протаскивать зависимости через конструктор.
    Ответ написан
  • Подход к реализации DI в проектах Yii2 - правильно или не очень?

    @MadridianFox
    Web-программист, многостаночник
    Какое-то однобокое решение:
    if (!isset($config['dependencyClass'])) {
        $this->dependencyClass = new Dependency();
    }

    Вроде как и внедрение зависимости, но всё-равно остаётся жесткая связь.

    А чем вас не устроил родной Yii сервис-локатор через конфиг?
    Можно было бы делать конфигурирование зависимости как компонента yii вот так:
    //config/web.php
    "components"=>[
        //...
        "model_deps"=>[
              "class"=>"app\components\ModelDependenciesService",
              "default_dependency"=>"app\model\model_2",
              "dependencies"=>[
                     "app\model\model_1"=>[
                            "dep_1"=>"app\model\model_3",
                            //....
                      ]
               ]
         ]
        //...
    ]
    // в базовом классе модели
    public function getDepClass($dep_name){
        retrn Yii::$app->model_deps->depClass(static,$dep_name); // не помню точно как текущий класс брать
    }
    // где-то в модели
    public function getDependencies()
    {
        return $this->hasMany($this->getDepClass($dep_name), ['modelId' => 'id']);
    }

    В классе ModelDependenciesService, естественно надо реализовать метод depClass, который будет возвращать класс зависимости или класс по умолчанию, если зависимость не определена.
    Ответ написан
    Комментировать
  • Какой тут паттерн нужен?

    @MadridianFox
    Web-программист, многостаночник
    А нужен ли тут паттерн? Возможно стоило бы описать недостатки того что есть, хотелки, и спросить как этого добиться.
    Ответ написан
    2 комментария