Облегчение отладки с помощью сменных синглетонов? - PullRequest
0 голосов
/ 14 января 2009

У меня есть несколько классов, таких как классы, которые описывают структуру таблицы базы данных, или классы, которые описывают конфигурацию приложения, которые вообще не меняют состояние во время выполнения программы. В настоящее время у меня есть эти классы как синглтоны, и классы, которые хотят получить информацию, запрашивают экземпляры классов (например, из общего метода getInstance ()), а затем приступают к извлечению информации, которую они хотят. Хотя это работает, я надеялся дать больше модульности, когда дело доходит до конфигураций, и именно здесь я застрял.

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

Это для веб-приложения PHP, но оно не помечено как таковое, потому что, я думаю, решение, скорее всего, не будет зависеть от языка.

Редактировать: Чтобы прояснить мой вопрос, даже несмотря на то, что внедрение зависимостей щекочет мою фантазию в том, что касается ответов на мой вопрос, позвольте мне привести (возможно, упрощенный) пример.

Допустим, у меня есть оболочка для PHP-класса Mysqli, которая будет просто использовать любую информацию о соединении, указанную в синглтоне Config ...

class Mysql {
    // ...
    private $mysqli;

    public function __construct() {
        $conf = Config::getInstance(); // Get the configuration
        $this->mysqli = new Mysqli(
            $conf->getHost(),
            $conf->getUsername(),
            $conf->getPassword()
        );
        // ...
    }
    // ...
}

В этом примере класс Mysql будет принимать только те параметры, которые содержатся в Config, и невозможно использовать любую конфигурацию, кроме той, которая содержится в Config. В этом примере, возможно, имеет смысл просто вставить хост / имя пользователя / пароль / что-либо еще в конструктор, но затем он падает на клиент, использующий класс Mysql для извлечения его из синглтона Config, и проблема снова проявляется во многих больше классов. Поскольку в конечном итоге он всегда извлекает зависимости из Config, с этой настройкой невозможно легко попробовать другие настройки.

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

1 Ответ

1 голос
/ 14 января 2009

Это основной принцип внедрения зависимостей. Идея состоит в том, чтобы внедрить один экземпляр класса во время выполнения. Во время тестирования вы вводите что-то еще с тем же интерфейсом. Это может быть фиктивный класс, фиктивный объект или обычный экземпляр, созданный тестом с ожидаемым состоянием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...