@kot-samolet

Корректно ли реализована DI?

Вводные: класс реализующий методы работы с БД и класс которому нужна БД никак не связаны между собой (не наследники).
Цель:
1) что бы класс которому нужна БД мог пользоваться ей без передачи каждый раз ему БД в явном виде
2) Параметры подключения вынесены из класса БД.
Код:
class Config
{
    public $host = 'localhost';
    public $db =   'loadbot_db'; 
    public $charset = 'utf8';
    public $user = 'user';      
    public $pass = 'qwerty'; 
}

class DB
{
    public function __construct(Config $config) {
        // тут происходит подключение к БД
    }
    // тут все остальные методы работы с БД
}

class NeedDB
{
    public $db;
    
    public function __construct() {
        $cache = new Config();
        $this->db = new DB($cache);
    }
}

$var = new NeedDB();

Корректно ли реализовано, есть ли недостатки, можно ли улучшить?
  • Вопрос задан
  • 216 просмотров
Решения вопроса 3
index0h
@index0h
PHP, Golang. https://github.com/index0h
1. Не используйте публичные свойства
2. Для описания параметров имеет смысл использовать константы
Ответ написан
@MadridianFox
Web-программист, многостаночник
В вашем коде нет DI.
Задача DI - избавиться от жёсткой связи между классами. Т.е. если вы заходите вместо класса DB в классе NeedDB использовать другой класс (ну там тесты гонять или задача такая), то вам придётся редактировать код класса NeedDB. DI - это техника, когда вы "снаружи" определяете какой класс будет использоваться.
Обычно для этого выделяется какой-нибудь ServiceLocator - объект у которого можно попросить объект нужного класса, и он отдаст его. Более радикальный способ - всегда передавать зависимости через конструктор. Этот способ идеологически более чистый, но и более навязчивый, т.к. вам надо всегда протаскивать зависимости через конструктор.
Ответ написан
qonand
@qonand
Software Engineer
1. Что-то Вы напутали, в Вашем примере нет DI. Принцип Dependency Injection говорит нам что классы не должны зависеть от реализации конкретных объектов, они должны зависеть от интерфейсов. В Вашем же случае интерфейсов нет, класс DB зависит от реализации класса Config - что само по себе являет нарушением принципа инверсии зависимости. По сути дела Ваш код сейчас - это реализация принципа Inversion of Control и не более..
2. Как сказал index0h не стоит использовать публичные свойства - эта плохая практика. Почему так не стоит делать - можно почитать в интернете, об этом написано не мало статей
3. Класс NeedDB как-то не понятно сделан. какое его назначение? создать объекты? тогда лучше использовать фабрику, либо Service Locator, либо Dependency Injection Container
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы