Почему неуместно использовать UML-диаграммы для планирования организации вашего кода?

9

Так что да, диаграммы могут быть неуместны время от времени. Когда они неуместны? Когда вы создаете их без кода, чтобы проверить их, а затем намерены следовать им. Нет ничего плохого в том, чтобы нарисовать диаграмму для изучения идеи.

Гибкая разработка программного обеспечения: принципы, шаблоны и практики - Роберт К. Мартин

Что именно он имеет в виду под этим? Разве UML не предназначен для того, чтобы помочь спланировать, как структурировать ваш код перед «погружением»? Какой смысл его использовать, если вы не следуете диаграммам, которые вы придумали?

Контекст: В этой главе дядя Боб создает диаграмму UML для Хранителя счета в игре в боулинг. Затем он продолжает разработку программы в тестовом режиме, не обращаясь к диаграмме UML. Получающаяся программа не похожа на диаграмму UML, и дядя Боб приходит к заключению, приведенному выше.

q126y
источник
4
Дело дяди Боба в том, что архитектура, возникающая в результате разработки через тестирование, может радикально отличаться от диаграммы UML.
Роберт Харви
1
Также читать это дизайн мертв? Мартин Фаулер за сбалансированное обсуждение этой темы и гибкого движения
Элиэзер Стейнбок
4
Поднятие этого вопроса в ответ на неправильное суждение со стороны @RobertHarvey et al. При голосовании, чтобы закрыть важный и полезный вопрос.
Дэвид Арно
3
@DavidArno Если у вас есть твердое мнение о том, что следует или не следует закрывать, я настоятельно рекомендую вам принять участие в обсуждениях на нашем мета-сайте. Каждый, кто в настоящее время публикует там сообщения (включая меня), вероятно, подпадает под "@RobertHarvey et al", за исключением нескольких сотрудников SE, и мы были обеспокоены, что есть другая точка зрения, не представляемая, но до сих пор никто не появлялся, чтобы представлять ее ,
Ixrec
1
@Ixrec, я никогда раньше не участвовал в мета-обсуждениях, кроме как один раз, чтобы проверить, могу ли я ссылаться на свои собственные библиотеки с открытым исходным кодом в ответах (ответ на этот вопрос был то, что я мог). Может быть, я должен принять ваш совет, хотя и принять более активное участие. Спасибо за предложение.
Дэвид Арно

Ответы:

19

Чтобы правильно объяснить это, нам нужен короткий урок истории. В первые годы разработки программного обеспечения, часто используемой аналогией было строительство дома. Архитектор и инженер-строитель обсуждают планы с заказчиком и разрабатывают проект. Затем строители следуют этому проекту, чтобы построить настоящий дом. Написание кода было расценено как создание реального дома. Таким образом, была очевидная потребность в предварительном проектировании, прежде чем эта сборка могла иметь место. Были созданы различные инструменты графического дизайна, среди которых UML.

Идея, изначально связанная с UML, заключалась в том, что можно полностью спроектировать систему с использованием UML, а затем передать ее кодировщикам для преобразования этого проекта в код. На самом деле, это просто не работает и привело к тому, что многие годы программисты воспринимались как «разработчики», а не как «дизайнеры», проекты опаздывали, проекты должны постоянно изменяться после того, как они должны были быть завершены и т. Д.

Причина проста. Кодирование это дизайн . При аналогии с домом код - это чертежи архитектора. Компилятор - это сборщик, который берет эти проекты и строит из них программу. Эта реализация привела к появлению гибких технологий, TDD и т. Д. - инструментов, помогающих улучшить качество разработки кода.

Подобно тому, как архитектор может создать предварительные эскизы, чтобы помочь ей и ее команде визуализировать общий дизайн, так и разработчик может использовать UML или другие инструменты, чтобы помочь визуализировать необходимый дизайн. Точно так же, как за этими набросками не следуют вслепую, так и не следует слепо следовать UML. Дизайн кода должен развиваться из гибких итераций и с использованием TDD. Точно так же, как архитектор может построить модель дома, чтобы помочь ей и ее команде визуализировать чертежи, так и UML можно использовать для визуализации структуры кода.

Как говорит дядя Боб, вы не можете проверить UML, вы можете только проверить код. Поэтому код является основной проектной документацией, а UML, если используется, является только вторичной документацией.

Дэвид Арно
источник
7
У меня был раздел крыши моего дома, снятый ранее в этом году, и это было довольно образовательным. Архитектор действительно больше не рисовал, как должен выглядеть конечный продукт. Он передал жесткие расчеты и проектирование конструкций инженеру-строителю. Затем строители должны были согласовать теоретический дизайн с реальностью дома (как только гипсокартон был снят, балки оказались в немного разных местах), поэтому проектирование происходило на каждом шагу.
Джейди
1
Это полезный ответ, тем не менее он упрощает некоторые аспекты. Одна из главных причин, по которой UML не работает как «нотация высокого уровня проектирования», заключается в том, что ИМХО их изобретатели были слишком упрямы, чтобы добавить диаграмму потока данных. Это единственная известная мне нотация, которая подходит для дизайна в верхнем городе, позволяет выражать абстракции для компонентов и интерфейсов между ними разного масштаба, а также может иметь четкое отображение на код. Вместо этого UML содержит много глупостей, которые никому не нужны.
Док Браун
3

Я предполагаю, что не каждая идиома программирования (или дизайн, или код) вписывается в UML (который, я признаю, я не знаю хорошо - только прочитал несколько книг по нему - я никогда не использовал его, и мне, вероятно, он не нравится).

Простой код C (например, исходный код ядра Linux) может быть не совсем смоделирован UML.

Код Ocaml (с его модулями и функторами) или даже код C ++ 11 (с лямбдами и шаблонами) могут не вписываться в UML.

Многоступенчатое программирование в стиле MetaOcaml, вероятно, не вписывается в UML.

Пролог или Common Lisp-код, вероятно, не вписываются в UML.

Смотрите также этот ответ и этот мой вопрос.

Прочитайте книги Скотта " Прагматика языка программирования" и " Концепции, методики и модели компьютерного программирования" Ван Роя , а затем спросите себя, подходит ли каждая модель программирования к UML.

Смотрите также Мартина Фаулера « Дизайн мертв»? блог.

Василий Старынкевич
источник