следует ли при внедрении интерфейса или расширении абстрактного класса ссылаться на абстрактный / интерфейс или реализацию?

У меня есть абстрактный класс, содержащий мои методы базы данных: abstractDatabase

Я расширил этот класс: Database

Когда я говорю об этом в другом классе, следует ли мне использовать abstractDatabase или Database?

class Config
{
    public function setDatabase(\abstractDatabase $database) {
        $this->db=$database;
        return $this
}

или должно быть написано как:

class Config
{
    public function setDatabase(\Database $database) {
        $this->db = $database;
        return $this;
}

Кроме того, при определении моего абстрактного класса следует ссылаться на abstractClass или просто Class

abstract class Database
{
    abstract function __construct(\abstractConfig $config);
}

или

abstract class Database
{
    abstract function __construct(\Config $config);
}

Тот же вопрос касается реализации интерфейсов.

1 ответ

По возможности следует полагаться на абстракции, а не на конкреции.

Это "D" принципов SOLID, а именно принцип инверсии зависимостей.

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

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

Другие вопросы по тегам