ОглавлениеInformation Expert (Информационный эксперт)Самый простой паттерн. Он гласит, что нужно назначать обязаннасти классу, который имеет самое большое количество информации для решения поставленной задачи.
Парадокс. Этот паттерн настолько очевиден, что его труднее всего понять. Потому что не можешь поверить, что все так просто и ищешь тайный смысл. А смысл его можно выразить одной фразой - "нельзя вырезать гланды через задницу".
Разберем на примере сферического в вакууме форума. Для наглядности сначала сэмулируем базу данных:
class DataBase
{
public $sections = array( 1 => 'ABC-Framework',
2 => 'ABC-Flame'
);
public $topics = array( 1 => array(1 => 'SOLID',
2 => 'GRASP'
),
2 => array(1 => 'Флуд')
);
public $content = array(
1 => array(1 => 'SOLID',
2 => 'GRASP',
3 => 'DRY'
),
2 => array(1 => 'Information Expert',
2 => 'Creator',
3 => 'Controller'
)
);
}
Теперь напишем классы для получения информации:
class Section
{
public function get($db)
{
return $db->sections;
}
}
class Theme
{
public function get($db)
{
return $db->topics;
}
}
class Message
{
public function get($db)
{
return $db->messages;
}
}
А теперь сам форум:
class Forum
{
public $db,
$section,
$theme,
$message;
public function __construct($db, $section, $theme, $message)
{
$this->db = $db;
$this->section = $section;
$this->theme = $theme;
$this->message = $message;
}
public function getSection($id)
{
$sections = $this->section->get($this->db);
return $sections[$id];
}
public function getTheme($id_theme, $id)
{
$themes = $this->theme->get($this->db);
return $themes[$id_theme][$id];
}
public function getMessage($id_messages, $id)
{
$messages = $this->message->get($this->db);
return $messages[$id_messages][$id];
}
}
$db = new DataBase;
$section = new Section;
$theme = new Theme;
$message = new Message;
$forum = new Forum($db, $section, $theme, $message);
echo $forum->getSection(1);
echo '<br>';
echo $forum->getTheme(1, 2);
echo '<br>';
echo $forum->getMessage(2, 1);
А теперь допустим нам нужно подсчитать общее количество сообщений на форуме. Какому классу назначить обязанность его подсчитать?
Информационным экспертом можно посчитать два класса. Сам форум (он знает все обо всем) и класс Message, у него конкретная информация.
Однако исходя из практицизма, ответственность нужно назначить последнему, так как это количество может понадобиться не только форуму, но и админке допустим. Так что делаем так:
class Message
{
public function get($db)
{
return $db->messages;
}
public function countAll($db)
{
$total = 0;
foreach ($db->messages as $parent => $mess) {
$total += count($mess);
}
return $total;
}
}
И сможем подсчитать сообщения, не инициируя объект форума.
$db = new DataBase;
$message = new Message;
echo '<br>Всего сообщений :'. $message->countAll($db);
Это не помешает и форуму получить количество сообщений, в нем уже есть объект класса Message.
А вот если мы захотим получить количество тем, и станем делать это в классе Message, то получится черти-чё спагетти-код.
Вот выбор оптимального места, откуда получить информацию, и есть паттерн Information Expert.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.