Что слишком много для передачи данных через внедрение зависимостей?
Тема внедрения зависимостей уже некоторое время обсуждается в кругах объектно-ориентированного программирования. Иногда мы видим это в WordPress; иногда нет.
Я фанат этого, но, честно говоря, я не всегда уверен, сколько информации вводить в класс. Я имею в виду, предположим, что у нас есть два класса, и один содержит информацию, которая нужна другому.
- Мы не внедряем класс в другой класс?
- Вводим ли мы только часть информации (будь то строка, целое число, структура данных или что-то еще) в другой класс?
Я не думаю, что для этого существует жесткое и быстрое правило, но, вероятно, можно с уверенностью сказать, что лучше вводить только те данные, которые вам нужны. Но тогда возникает вопрос, как подготовить данные для ввода в данный класс?
- Вы создаете метод в одном классе и передаете его в другой?
- Вы передаете в него часть частной или защищенной информации?
Опять же, я думаю, это зависит от того, должно ли что-то произойти с информацией, прежде чем она будет передана в класс.
В любом случае, я мог бы возвращаться к этому до конца поста и так и не прийти к выводу, так почему бы не поработать с исходным кодом, пока не появится что-то разумное.
Начнем с того, что у нас есть основной файл класса плагина, и этот класс отвечает за сохранение такой информации, как:
- путь к плагину,
- URL-адрес плагина,
- загружен ли плагин,
- экран, который просматривается в данный момент,
- и классы, которым он должен транслировать (например, pub/sub) определенные фрагменты информации.
Возможно, скелет или заглушка класса могут выглядеть так :
<?php
class Plugin
{
protected $plugin_path;
protected $plugin_url;
private $loaded;
public function __construct($file)
{
$this->loaded = false;
$this->plugin_path = plugin_dir_path($file);
$this->plugin_url = plugin_dir_url($file);
}
public function isLoaded()
{
return $this->loaded;
}
public function load()
{
// ...
}
private function isCurrentAdminStatus()
{
// ...
}
public function getSubscribers()
{
return [
new OtherPluginClass(...)
];
}
}
Тогда давайте начнем очень широко. Скажем, мы хотим взять весь класс и передать его одному из классов, которым он передает информацию.
Если бы это было так, то это могло бы выглядеть так :
<?php
class Plugin
{
protected $plugin_path;
protected $plugin_url;
private $loaded;
public function __construct($file)
{
$this->loaded = false;
$this->plugin_path = plugin_dir_path($file);
$this->plugin_url = plugin_dir_url($file);
}
public function isLoaded()
{
return $this->loaded;
}
public function load()
{
// ...
}
private function isCurrentAdminStatus()
{
// ...
}
public function getSubscribers()
{
return [
new OtherPluginClass($this)
];
}
}
Но одна из проблем заключается в том, что он передает гораздо больше информации, чем необходимо, в другой класс. Кроме того, он передает информацию, включающую информацию о классе, в который передается информация.
Допустим, мы хотим сделать шаг назад и просто передать одну из частных частей информации. Это просто, верно? В итоге это выглядит примерно так :
<?php
class Plugin
{
protected $plugin_path;
protected $plugin_url;
private $loaded;
public function __construct($file)
{
$this->loaded = false;
$this->plugin_path = plugin_dir_path($file);
$this->plugin_url = plugin_dir_url($file);
}
public function isLoaded()
{
return $this->loaded;
}
public function load()
{
// ...
}
private function isCurrentAdminStatus()
{
// ...
}
public function getSubscribers()
{
return [
new OtherPluginClass($this->plugin_path)
];
}
}
И этого может быть вполне достаточно для некоторых случаев. Но, как упоминалось ранее, бывают случаи, когда мы хотим получить информацию, обработать ее, а затем передать в класс.
Для этого мы просто определяем метод, обрабатываем информацию, а затем передаем возвращаемое значение в класс, которому нужна информация :
<?php
class Plugin
{
protected $plugin_path;
protected $plugin_url;
private $loaded;
public function __construct($file)
{
$this->loaded = false;
$this->plugin_path = plugin_dir_path($file);
$this->plugin_url = plugin_dir_url($file);
}
public function isLoaded()
{
return $this->loaded;
}
public function load()
{
// ...
}
private function isCurrentAdminStatus()
{
// ...
}
public function getSubscribers()
{
return [
new OtherPluginClass($this->isCurrentAdminStatus())
];
}
}
Идея этого обсуждения возникла во время работы над обзором кода для недавнего проекта и обсуждения различных вариантов передачи информации в класс.
Итак, я начал с общего (несмотря на то, что необходимо, даже с учетом описанного выше мыслительного процесса), а затем сузил его до того, что необходимо.