следует ли при внедрении интерфейса или расширении абстрактного класса ссылаться на абстрактный / интерфейс или реализацию?
У меня есть абстрактный класс, содержащий мои методы базы данных: 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
реализация классов, которые считывают конфигурацию из разных репозиториев и / или форматов, позволяя заменять один класс другим в соответствии с потребностями вашего приложения.