UML - это просто
Программирование, Проектирование 09.11.2007
Сегодня я постараюсь рассказать о трех буквах, которые слышали практически все программисты… нет, это не те буквы… :) Это 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. Очень легкая и простая программка, как раз то, что надо начинающему.







Хорошее дело делаешь.
Спасибо за проделанную работу, жду описания остальных диаграм
Ну на самом деле осталось расмотреть диаграммы последовательности. Остальные используются крайне редко….
Появился вопрос… Правда не по UML. Не встречалось ли нечто, генерящее php-код на основе UML?
Sam
В StarUML есть PHP 5 Code Generator Template.
Спасибо.
To: Patrick & Sam
Генерация кода конечно есть, но какой-то очень странный код он мне выдал по моим диаграммам…
Если у вас код получился нормальный - расскажите как =)
Спасибо, вечно немогу в этом UML разобраться и запомнить. С примерами понятней стало.
Как говорят: на здоровье! :) И на будущие успехи!
А главное если появятся мысли по данной тематике, обязательно пишите в своем блоге, а потом мне ссылочку дайте.
Спасибо за доступное изложение. Но хочу сделать замечание:
Generalization можно перевести как генерализация, можно можно перевести как обобщение, но уж не наследование. Наследование - это inheritance.
Другое дело, что при проектирование обобщение чаще всего и реализуется наследованием. Но это не единственным способ. Как вариант, параметризированные классы в С++
Пожалуйста! =)
А за замечание БОЛЬШОЕ спасибо, поправил. Я просто в скобочках писал не перевод, а смысл. :)
А бесплатных IDEF1X-редакторов никто не видел?
Ochen nuznoye delo delayesh, Admin!
davno hotel razobratsya - vse nnedosug bilo,
zdu s neterpeniyem prodolzeniya statey.
SoftSoft, рад, что смог помочь. К сожалению, когда я разбирался мне помочь было некому =)))
Продолжение обязательно, будет… только не знаю когда. Сейчас увлекся разработкой шокера (!), так что статьи начну писать только после его изготовления. =)))) Надеюсь к концу недели управлюсь, так что не серчайте, дорогие читатели…
admin
Ты Фаулера, Рамбо и Буча пытать собрался???? ;)
Зачем сразу пытать???!
Так, просто… опытом попрошу поделиться ;-)
А нет ли софта для генерирования UML-диаграмм по коду программы?
Сейчас не помню названия, но где-то видел нечно подобное, поищи в Google. =)
[...] своей первой статье “UML - это просто” я описывал диаграммы классов, хотя правильнее [...]
[...] читатели блога в той или иной степени разобрались с UML (статья 1 & статья 2), я решил по мере сил, сопровождать [...]
Прочитал с удовольствием.
Хотелось бы более аккуратные иллюстрации, где прямые линии действительно прямые, а не “ступеньки” :)
Ник
Так нарисовала моя программа, как ни старался прямых линий делать она не хотела.
И я думаю, для данной статьи прямота линий дело второстепенное =)
Admin: Poprobuy vmesto starUML - BoUML s sourceForga. namnogo lutshe risuyet, i umeet “by default” generit bolee vrazumitelniy php kod :)
@SoftSoft
Спасибо за совет, но я уже нашел для себя подходящую программу. Называется Enterprise Architect 6.5
Делает все, что только можно представить и даже немного больше )
нормал статья, маладец
У-Ме-Ле - это просто как простатит, зачотная статья
Хорошая статья.
Напишите пожалуйста о представлениях(вариантов использования, проектирования, реализации, взаимодействия, размещения) в UML.
С удовольствием почитал бы.
а где продолжение? про + есть, а про -, #, ~, кружочки, пунктирные линии где?
раз уж сказа “а”, надо до “я” дойти..
вот там где описывается Композиция, на диаграмме в блоке Helper обозначен метод fetch(), а в коде класса его не видно.. видимо ошибочка )
@mex
Да, действительно, очепяточка вышла…
Спасибо, исправил.
[...] и все. И мы в очередной раз (как и в случае с UML и кэшированием) убедились, что все гениальное просто :) [...]
эх мнеб эту статейку, месяца эдак 3 назад найти), Спасибо.
ЗЫ: а под linux, что-нить нормальное для постойки UML диаграм кто-нить знает?
Umbrello (# apt-get install umbrello :)
ладно переформулирую, что-нибудь стабильное, знает кто?), под FreeBSD “зонтик от каждого дуновения ветра палал”, по линуксом конечно не уверен, но мне сказали, что не очень то и стабильнее. Как вариант плагины для ecpipse, но чёт их много, часть платная, а какие из беспланых нормальные и функциональные хз.
VampiRUS
Я работал с “зонтиком” в Ubuntu и все ровно, ни разу он не сложился. Ничего не стоит на месте, все улучшается )
тогда хорошо, а то собираюсь от винды совсем отказаться, а юзать юзать только в самом крайнем случае)
Лаконично, полезно, понятно.
Спасибо за статью. Очень доходчиво)