UML – это просто
by Larin
Сегодня я постараюсь рассказать о трех буквах, которые слышали практически все программисты… нет, это не те буквы… :) Это UML.
В двух словах
UML (Unified Modeling Language) - унифицированный язык моделирования – это язык графического описания для объектного моделирования в области разработки программного обеспечения. UML является языком широкого профиля, это открытый стандарт, использующий графические обозначения для создания абстрактной модели системы, называемой UML моделью. UML был создан для определения, визуализации, проектирования и документирования в основном программных систем.
Использование UML не ограничивается моделированием программного обеспечения. Его также используют для моделирования бизнес-процессов, системного проектирования и отображения организационных структур.
Разновидности
Существует 13 официальных диаграмм UML 2.0, каждая из которых представляет собой различное представление разных аспектов системы:
- Диаграмма активности;
- Диаграмма классов;
- Диаграмма связей;
- Диаграмма компонентов;
- Диаграмма составных структур;
- Диаграмма развертывания;
- Диаграмма обзора взаимодействий;
- Диаграмма объектов;
- Диаграмма пакетов;
- Циклограмма;
- Диаграмма машин состояния;
- Диаграмма синхронизации;
- Диаграмма прецедентов.
Но мы себе сразу выносить мозг не собираемся (мы будем делать это постепенно), так что сегодня поговорим только об одном виде диаграмм – диаграммах классов. И проиллюстрируем все примерами на PHP.
Диаграмма классов
Диаграмма классов является типом диаграммы статической структуры. Она описывает структуру системы, показывая её классы, их атрибуты и операторы, и также взаимосвязи этих классов. И так, начнем с примеров:
Генерализация (обобщение)
Генерализация показывает, что один из двух связанных классов (подтип), является более частной формой другого (супертип), который называется обобщением первого.
Графически генерализация представляется линией с пустым треугольником у супертипа.
Диаграмма:

На PHP это будет выглядеть, следующим образом:
<?php
class Man
{
}
class Programmer extends Man
{
}
?>
Все просто. Идем дальше. И введем пару определений:
Связь – простая взаимосвязь между объектами. Она представляется линией соединяющей два или более объектных блока. Она встречается на диаграммах классов или объектов. Связь – частный случай ассоциации.
Ассоциация – это семейство связей двух и более классов. Всего существует пять типов ассоциации. Но наиболее распространены два: двунаправленная и однонаправленная
ассоциации.
Рассмотрим частные варианты:
Агрегация
Агрегация – «has a» (быть частью) случай ассоциации. Агрегация применяется когда один класс должен быть контейнером других классов. Причем время существования содержащихся классов никак не зависит от времени существования класса контейнера.
Т.е. в нашем примере в качестве контейнера выступает объект класса Model. И если в ходе выполнения программы он будет уничтожен, это никак не повлияет на объект класса DataBase.
Графически агрегация представляется пустым ромбиком на блоке класса и линией, идущей от этого ромбика к содержащемуся классу.
Диаграмма:

Код:
<?php
class DataBase
{
public function selectAll()
{
}
}
class Model
{
private $db;
public function __constructor($db)
{
$this->db = $db;
}
public function getAll()
{
return $this->db->selectAll();
}
}
?>
Композиция
Еще один «has a» случай ассоциации, но более строгий. В отличии от агрегации, композиция имеет жёсткую зависимость времени существования экземпляров класса контейнера и экземпляров содержащихся классов. Если контейнер будет уничтожен, то всё его содержимое будет уничтожено также.
Графически представляется как и агрегация, но с закрашенным ромбиком.
Диаграмма:

Код на PHP:
<?php
class Helper
{
public function fetch()
{
//some code
}
}
class View
{
private $helper;
private $page;
public function __constructor()
{
$this->helper = new Helper();
}
public function render()
{
$this->page = $this->helper->fetch();
}
}
?>
Различие между агрегацией и композицией
Различие между этими двумя видами ассоциации состоит в том, что композиция может быть частью одного и только одного целого, в то время как агрегация может быть частью нескольких объектов.
Направленная ассоциация (Message / Directed Association)
Сообщение используется когда один класс “общается” с другим при помощи инстанцирования.
Инстанцирование (англ. instantiation) — создание экземпляра класса. В отличие от слова «создание» применяется не к объекту, а к классу. То есть говорят создать экземпляр класса или инстанцировать класс. Порождающие паттерны используют полиморфное инстанцирование.
Экземпляр класса (англ. instance) — это описание конкретного объекта в памяти. Класс описывает свойства и методы, которые будет доступны у объекта, построенного по описанию, заложенному в класс. Экземпляры используют для представления конкретных сущностей реального мира.
Графически представляется в виде стрелочки направленой к “вызываемому” классу.
Диаграмма:

Пример на PHP:
<?php
class HtmlUtils
{
public static function specialChars($str)
{
//Здесь экранируем строку $str, заменяя все нужные символы
return $str;
}
}
class View
{
private $page;
public function render()
{
//.......
$this->page = HtmlUtils::specialChars($text);
//.......
}
}
?>
Так же направленная ассоциация может быть двухсторонней, например:
Диаграмма:

Код:
<?php
class Debug
{
public static function display()
{
echo $this->errorMsg;
}
}
class View
{
public $errorMsg = 'Message';
public function someFunction()
{
//Тело функции и если возникает ошибка то $error = 1
if ($error) Debug::display();
}
}
?>
Вот, собственно и все. Может быть, если переборю лень, я напишу еще несколько статей по проектированию, а пока жду ваших комментариев.
З. Ы. Все диаграммы были выполнены в программе StarUML. Очень легкая и простая программка, как раз то, что надо начинающему.