[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: GRASP
Страницы: 1, 2
twin
GRASP (General Responsibility Assignment Software Patterns)

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

Или проще - шаблоны распределения обязанностей.

Всего их девять:

Основные
1. Information Expert (Информационный эксперт)
2. Creator (Создатель)
3. Controller (Контроллер)
4. Low Coupling (Низкая связанность)
5. High Cohesion (Высокая связность)

Дополнительные:

6. Pure Fabrication (Чистое производство или Чистая выдумка)
7. Indirection (Посредник)
8. Polymorphism (Полиморфизм)
9. Protected Variations (Сокрытие реализации)

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
twin
Оглавление
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.


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.