Моя библиотека - социальная сеть любителей книг

Сегодня я постараюсь рассказать о трех буквах, которые слышали практически все программисты… нет, это не те буквы… :) Это UML.

В двух словах

UML (Unified Modeling Language) - унифицированный язык моделирования - это язык графического описания для объектного моделирования в области разработки программного обеспечения. UML является языком широкого профиля, это открытый стандарт, использующий графические обозначения для создания абстрактной модели системы, называемой UML моделью. UML был создан для определения, визуализации, проектирования и документирования в основном программных систем.

Использование UML не ограничивается моделированием программного обеспечения. Его также используют для моделирования бизнес-процессов, системного проектирования и отображения организационных структур.

Разновидности

Существует 13 официальных диаграмм UML 2.0, каждая из которых представляет собой различное представление разных аспектов системы:

  • Диаграмма активности;
  • Диаграмма классов;
  • Диаграмма связей;
  • Диаграмма компонентов;
  • Диаграмма составных структур;
  • Диаграмма развертывания;
  • Диаграмма обзора взаимодействий;
  • Диаграмма объектов;
  • Диаграмма пакетов;
  • Циклограмма;
  • Диаграмма машин состояния;
  • Диаграмма синхронизации;
  • Диаграмма прецедентов.

Но мы себе сразу выносить мозг не собираемся (мы будем делать это постепенно), так что сегодня поговорим только об одном виде диаграмм - диаграммах классов. И проиллюстрируем все примерами на PHP.

Диаграмма классов

Диаграмма классов является типом диаграммы статической структуры. Она описывает структуру системы, показывая её классы, их атрибуты и операторы, и также взаимосвязи этих классов. И так, начнем с примеров:

Генерализация (обобщение)

Генерализация показывает, что один из двух связанных классов (подтип), является более частной формой другого (супертип), который называется обобщением первого.

Графически генерализация представляется линией с пустым треугольником у супертипа.

Диаграмма:

Наследование в UML

На 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) — это описание конкретного объекта в памяти. Класс описывает свойства и методы, которые будет доступны у объекта, построенного по описанию, заложенному в класс. Экземпляры используют для представления конкретных сущностей реального мира.

Графически представляется в виде стрелочки направленой к “вызываемому” классу.

Диаграмма:

Message

Пример на PHP:

<?php
class HtmlUtils
{
	public static function specialChars($str)
	{
		//Здесь экранируем строку $str, заменяя все нужные символы
		return $str;
	}
}

class View
{
	private $page;

	public function render()
	{
		//.......
		$this->page = HtmlUtils::specialChars($text);
		//.......
	}
}
?>

Так же направленная ассоциация может быть двухсторонней, например:

Диаграмма:

Both

Код:

<?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. Очень легкая и простая программка, как раз то, что надо начинающему.



Комментарии (38) на запись «UML - это просто»

  1. Sam MonsterID Icon Sam | 09.11.2007 в 18:18

    Хорошее дело делаешь.

  2. Valentin Gernovich MonsterID Icon Valentin Gernovich | 09.11.2007 в 18:34

    Спасибо за проделанную работу, жду описания остальных диаграм

  3. Patrick MonsterID Icon Patrick | 09.11.2007 в 19:13

    Ну на самом деле осталось расмотреть диаграммы последовательности. Остальные используются крайне редко….

  4. Sam MonsterID Icon Sam | 09.11.2007 в 19:24

    Появился вопрос… Правда не по UML. Не встречалось ли нечто, генерящее php-код на основе UML?

  5. Patrick MonsterID Icon Patrick | 09.11.2007 в 19:33

    Sam
    В StarUML есть PHP 5 Code Generator Template.

  6. Sam MonsterID Icon Sam | 09.11.2007 в 19:38

    Спасибо.

  7. admin MonsterID Icon admin | 10.11.2007 в 20:49

    To: Patrick & Sam
    Генерация кода конечно есть, но какой-то очень странный код он мне выдал по моим диаграммам…
    Если у вас код получился нормальный - расскажите как =)

  8. Артём Курапов MonsterID Icon Артём Курапов | 10.11.2007 в 23:30

    Спасибо, вечно немогу в этом UML разобраться и запомнить. С примерами понятней стало.

  9. admin MonsterID Icon admin | 10.11.2007 в 23:48

    Артём Курапов
    Спасибо, вечно немогу в этом UML разобраться и запомнить. С примерами понятней стало.

    Как говорят: на здоровье! :) И на будущие успехи!
    А главное если появятся мысли по данной тематике, обязательно пишите в своем блоге, а потом мне ссылочку дайте.

  10. iobit MonsterID Icon iobit | 12.11.2007 в 02:35

    Спасибо за доступное изложение. Но хочу сделать замечание:
    Generalization можно перевести как генерализация, можно можно перевести как обобщение, но уж не наследование. Наследование - это inheritance.
    Другое дело, что при проектирование обобщение чаще всего и реализуется наследованием. Но это не единственным способ. Как вариант, параметризированные классы в С++

  11. admin MonsterID Icon admin | 12.11.2007 в 13:34

    iobit
    Спасибо за доступное изложение. Но хочу сделать замечание:
    Generalization можно перевести как генерализация, можно можно перевести как обобщение, но уж не наследование. Наследование - это inheritance.
    Другое дело, что при проектирование обобщение чаще всего и реализуется наследованием. Но это не единственным способ. Как вариант, параметризированные классы в С++

    Пожалуйста! =)
    А за замечание БОЛЬШОЕ спасибо, поправил. Я просто в скобочках писал не перевод, а смысл. :)

  12. Gerasim MonsterID Icon Gerasim | 16.11.2007 в 09:15

    А бесплатных IDEF1X-редакторов никто не видел?

  13. SoftSoft MonsterID Icon SoftSoft | 20.11.2007 в 21:09

    Ochen nuznoye delo delayesh, Admin!
    davno hotel razobratsya - vse nnedosug bilo,
    zdu s neterpeniyem prodolzeniya statey.

  14. admin MonsterID Icon admin | 20.11.2007 в 21:34

    SoftSoft, рад, что смог помочь. К сожалению, когда я разбирался мне помочь было некому =)))

    Продолжение обязательно, будет… только не знаю когда. Сейчас увлекся разработкой шокера (!), так что статьи начну писать только после его изготовления. =)))) Надеюсь к концу недели управлюсь, так что не серчайте, дорогие читатели…

  15. Patrick MonsterID Icon Patrick | 20.11.2007 в 21:39

    admin
    Ты Фаулера, Рамбо и Буча пытать собрался???? ;)

  16. admin MonsterID Icon admin | 20.11.2007 в 21:42

    Patrick
    Ты Фаулера, Рамбо и Буча пытать собрался???? ;)

    Зачем сразу пытать???!
    Так, просто… опытом попрошу поделиться ;-)

  17. BliTZ MonsterID Icon BliTZ | 25.11.2007 в 14:06

    А нет ли софта для генерирования UML-диаграмм по коду программы?

  18. admin MonsterID Icon admin | 26.11.2007 в 00:07

    BliTZ,
    А нет ли софта для генерирования UML-диаграмм по коду программы?

    Сейчас не помню названия, но где-то видел нечно подобное, поищи в Google. =)

  19. LARIN.in » Архив блога » UML - это просто. Диаграммы последовательностей. | 05.12.2007 в 16:03

    [...] своей первой статье “UML - это просто” я описывал диаграммы классов, хотя правильнее [...]

  20. LARIN.in » Архив блога » “Светофорчики” или flash-сообщения | 10.12.2007 в 00:52

    [...] читатели блога в той или иной степени разобрались с UML (статья 1 & статья 2), я решил по мере сил, сопровождать [...]

  21. Ник MonsterID Icon Ник | 16.01.2008 в 14:40

    Прочитал с удовольствием.

    Хотелось бы более аккуратные иллюстрации, где прямые линии действительно прямые, а не “ступеньки” :)

  22. admin MonsterID Icon admin | 16.01.2008 в 19:11

    Ник
    Так нарисовала моя программа, как ни старался прямых линий делать она не хотела.
    И я думаю, для данной статьи прямота линий дело второстепенное =)

  23. SoftSoft MonsterID Icon SoftSoft | 16.01.2008 в 19:28

    Admin: Poprobuy vmesto starUML - BoUML s sourceForga. namnogo lutshe risuyet, i umeet “by default” generit bolee vrazumitelniy php kod :)

  24. admin MonsterID Icon admin | 17.01.2008 в 01:07

    @SoftSoft
    Спасибо за совет, но я уже нашел для себя подходящую программу. Называется Enterprise Architect 6.5
    Делает все, что только можно представить и даже немного больше )

  25. Дмитрий MonsterID Icon Дмитрий | 18.02.2008 в 21:51

    нормал статья, маладец

  26. Дмитрий MonsterID Icon Дмитрий | 18.02.2008 в 21:52

    У-Ме-Ле - это просто как простатит, зачотная статья

  27. OlegK MonsterID Icon OlegK | 27.02.2008 в 22:39

    Хорошая статья.
    Напишите пожалуйста о представлениях(вариантов использования, проектирования, реализации, взаимодействия, размещения) в UML.
    С удовольствием почитал бы.

  28. Borisych MonsterID Icon Borisych | 28.02.2008 в 06:47

    а где продолжение? про + есть, а про -, #, ~, кружочки, пунктирные линии где?
    раз уж сказа “а”, надо до “я” дойти..

  29. mex MonsterID Icon mex | 01.04.2008 в 16:36

    вот там где описывается Композиция, на диаграмме в блоке Helper обозначен метод fetch(), а в коде класса его не видно.. видимо ошибочка )

  30. admin MonsterID Icon admin | 01.04.2008 в 21:43

    @mex
    Да, действительно, очепяточка вышла…
    Спасибо, исправил.

  31. LARIN.in » Архив блога » Sphinx - настоящее быстрого поиска | 09.04.2008 в 22:59

    [...] и все. И мы в очередной раз (как и в случае с UML и кэшированием) убедились, что все гениальное просто :) [...]

  32. VampiRUS MonsterID Icon VampiRUS | 28.05.2008 в 08:07

    эх мнеб эту статейку, месяца эдак 3 назад найти), Спасибо.
    ЗЫ: а под linux, что-нить нормальное для постойки UML диаграм кто-нить знает?

  33. admin MonsterID Icon admin | 28.05.2008 в 09:59

    VampiRUS
    ЗЫ: а под linux, что-нить нормальное для постойки UML диаграм кто-нить знает?

    Umbrello (# apt-get install umbrello :)

  34. VampiRUS MonsterID Icon VampiRUS | 28.05.2008 в 10:12

    ладно переформулирую, что-нибудь стабильное, знает кто?), под FreeBSD “зонтик от каждого дуновения ветра палал”, по линуксом конечно не уверен, но мне сказали, что не очень то и стабильнее. Как вариант плагины для ecpipse, но чёт их много, часть платная, а какие из беспланых нормальные и функциональные хз.

  35. admin MonsterID Icon admin | 28.05.2008 в 10:32

    VampiRUS
    Я работал с “зонтиком” в Ubuntu и все ровно, ни разу он не сложился. Ничего не стоит на месте, все улучшается )

  36. VampiRUS MonsterID Icon VampiRUS | 28.05.2008 в 12:09

    тогда хорошо, а то собираюсь от винды совсем отказаться, а юзать юзать только в самом крайнем случае)

  37. golubev MonsterID Icon golubev | 23.06.2008 в 05:25

    Лаконично, полезно, понятно.

  38. Роман MonsterID Icon Роман | 29.11.2009 в 22:37

    Спасибо за статью. Очень доходчиво)

Оставить комментарий


Copyright, 1983 – 2010