Проблемно-ориентированное проектирование

Поделись знанием:
Перейти к: навигация, поиск
К:Википедия:Страницы на КПМ (тип: не указан)

Предметно-ориентированное проектирование (реже проблемно-ориентированное, англ. Domain-driven design, DDD) — это набор принципов и схем, направленных на создание оптимальных систем объектов. Сводится к созданию программных абстракций, которые называются моделями предметных областей. В эти модели входит бизнес-логика, устанавливающая связь между реальными условиями области применения продукта и кодом.

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

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

Данный термин был впервые введен Э. Эвансом в его книге с таким же названием «Domain-Driven Design»[1].





Основные определения

  • Область (англ. domain, домен) — предметная область, к которой применяется разрабатываемое программное обеспечение.
  • Модель (англ. model) — описывает отдельные аспекты области и может быть использована для решения проблемы.
  • Язык описания — используется для единого стиля описания домена и модели.

Концепция

В идеале, при проектировании хочется иметь одну-единственную модель, которая полностью описывает всю предметную область, но в реальности, для упрощения процесса разработки продукта, домен представляют в виде сочетания нескольких взаимосвязанных моделей.

Схема архитектуры приложения представляет собой описание одной или нескольких моделей предметной области и их взаимосвязей между собой.

Ограниченные связи

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

Решение: Точно определить контекст, в котором используется модель. Определить границы использования данной модели и её характеристики.

Целостность

Когда над проектом работает большое количество людей, то есть тенденция дробить модель на несколько, более мелких, фрагментов. Чем больше людей, тем более значительна данная проблема. В конечном итоге теряется целостность проекта.

Решение: Постоянное объединение кусков кода от различных разработчиков и проверка работоспособности посредством тестирования. Это позволяет держаться всем разработчикам в одной большой концепции.

Взаимосвязь

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

Решение: На этапе проектирования точно обозначьте, что именно выполняет каждая модель и как она взаимосвязана с другими моделями. В конечном итоге у вас должна получиться карта взаимосвязей моделей.

Элементы DDD

При проектировании на основе проблемно-ориентированного подхода используются следующие понятия:

Контекст

В большинстве систем для предприятий используются крупномасштабные зоны ответственности. В DDD этот высший уровень организации называется ограниченным контекстом. Например, система биллинга крупной телекоммуникационной компании может иметь следующие ключевые элементы:

Все перечисленные элементы должны быть включены в единую, работающую без перебоев систему. При проектировании система уведомлений и система безопасности выделяются как совершенно разные вещи. Системы, в которых при реализации не удаётся разделить и изолировать ограниченные контексты, часто приобретают архитектурный стиль, который имеет красноречивое название «Большой ком грязи» в 1999 г. Брайан Фут (Brian Foot) и Йозеф Йодер (Joseph Yoder).[2]

Сутью проблемно-ориентированного проектирования является конкретное определение контекстов и ограничение моделирования в их рамках.

Сущность

Проще всего сущности выражать в виде существительных: люди, места, товары и т. д. У сущностей есть и индивидуальность, и жизненный цикл. Во время проектирования думать о сущностях следует как о единицах поведения, нежели как о единицах данных. Чаще всего какие-то операции, которые вы пытаетесь добавить в модель, должна получить какая-то сущность, или при этом начинает создаваться или извлекаться новая сущность. В более слабом коде можно найти массу служебных или управляющих классов, проверяющих сущности снаружи.

Объект-значение

Объект-значение — это свойства, важные в той предметной области, которую вы моделируете. У них, в отличие от сущностей, нет обозначения; они просто описывают конкретные сущности, которые уже имеют обозначения. Полезность объектов-значений состоит в том, что они описывают свойства сущностей гораздо более изящным и объявляющим намерения способом. Стоит всегда помнить, что значение объекта никогда не изменяется на протяжении выполнения всего программного кода. После их создания, внесение поправок невозможно.

Сводный корень

Сводный корень — специальная сущность, к которой напрямую обращаются потребители. Использование при проектировании концепции сводных корней позволяет избегать чрезмерного соединения объектов между собой, составляющих модель, за счет применения правила: сводные корни — единственный вид сущностей, на который может ссылаться используемая программа. Это позволяет избежать путаницы и упростить структуру архитектуры кода, потому что теперь у вас есть специальное ограничение, не дающее создавать тесно связанные системы, где все сопряжено со всем.

Службы

Иногда в предметной области есть операции или процессы, у которых нет обозначения или жизненного цикла. Службы области дают инструмент для моделирования этих концепций. Они характеризуются отсутствием состояния и высокой связностью, часто предоставляя один открытый метод и иногда перегрузку для действий над наборами. Если в поведение включено несколько зависимостей, и нет возможности найти подходящего места в сущности для размещения этого поведения, в этом случае используют службу. Хотя сам по себе термин «служба» в мире разработки перегружен различными значениями, но в данной тематике, это обозначает небольшой класс, не представляющий конкретного человека, место или вещь в проектируемом приложении, но включающий в себя какие-то процессы. Использование служб позволяет ввести многослойную архитектуру, так же интегрировать несколько моделей, что вносит зависимость от инфраструктуры.[3]

Взаимосвязь с подходами программирования

Хотя по концепции проблемно-ориентированное проектирование не должно быть ограничено какими-либо представлениями, но на практике используются сильные стороны объектно-ориентированного программирования. Это использование наследования, инкапсуляции, представления в виде методов и классов. Нужно помнить, что объектно-ориентированный подход может быть применен не только к ООП языкам, таким как Java, C# или C++, но так же и к функциональным — F#, Erlang. Особенно удобны языки, поддерживающие создание и использование собственных предметно-ориентированных языков, такие как Scala (см. также ЯОП).

Тестирование

Неотъемлемой частью разработки является тестирование. Оно позволяет быть уверенным в работоспособности разрабатываемого продукта на всех этапах разработки. Практичнее производить разработку посредством автотестов по технике TDD.

При тестировании сводных корней, применяют модульное тестирование. Причем при использовании проблемно-ориентированного проектирования тесты сводных корней склоняются в сторону парадигмы черного ящика и тестирования состояния. Сводные корни и сущности часто становятся конечными автоматами, и их поведение этому соответствует.

Инструменты

Напишите отзыв о статье "Проблемно-ориентированное проектирование"

Примечания

  1. Evans Eric. [www.domaindrivendesign.org/books/evans_2003 Domain-Driven Design: Tackling Complexity in the Heart of Software]. — Addison-Wesley, 2004. — ISBN 978-032-112521-7. в русском переводе Предметно-ориентированное проектирование (DDD): структуризация сложных программных систем
  2. Brian Foote and Joseph Yoder, [laputan.org/mud/ Big Ball of Mud], 1999, Urbana, IL 61801 USA
  3. Haywood, D., [www.pragprog.com/titles/dhnako/domain-driven-design-using-naked-objects Domain-Driven Design using Naked Objects], 2009, Pragmatic Programmers

См. также

Литература

  • Вон Вернон. Реализация методов предметно-ориентированного проектирования = Implementing Domain: Driven Design. — М.: «Вильямс», 2016. — 688 с. — ISBN 978-0-321-83457-7.
  • Эрик Эванс. Предметно-ориентированное проектирование (DDD): структуризация сложных программных систем = Domain-Driven Design: Tackling Complexity in the Heart of Software. — М.: «Вильямс», 2011. — 448 с. — ISBN 978-5-8459-1597-9.
  • Нильссон Д. Применение DDD и шаблонов проектирования. Проблемно-ориентированное проектирование приложений с примерами на C# и .NET = Applying Domain-Driven Design and Patterns with Examples in C# and .NET. — М.: «Вильямс», 2008. — С. 549. — ISBN 978-5-8459-1296-1.
  • Evans E. Domain-Driven Design - Tackling Complexity in the Heart of Software. — Addison-Wesley, 2004. — С. 529. — ISBN 978-0-3211-2521-7.
  • Brian F., Joseph Y. Big Ball of Mud. — Urbana, IL 61801 USA, 1999. — С. 41.

Ссылки

  • [msdn.microsoft.com/ru-ru/magazine/dd419654.aspx Введение в проблемно-ориентированное проектирование] (рус.)
  • [domaindrivendesign.org/ Официальный сайт DDD] (англ.)
  • [objectmentor.com/resources/articles/srp.pdf Принцип персональной ответственности] (англ.)
  • [tech.groups.yahoo.com/group/domaindrivendesign/ Форум Domain-Driven Design] (англ.)
  • [www.methodsandtools.com/archive/archive.php?id=97 Введение в проблемно-ориентированное проектирование] (англ.)
  • [www.qi4j.org/ Qi4j фреймворк для DDD] (англ.)
  • [www.plugger-project.org/ Plugger — фреймворк для DDD архитектуры в java приложениях] (англ.)
  • [jdon.dev.java.net/ JdonFramework — java-фреймворк для DDD] (англ.)
  • [blog.cleverlabs.com/2010/11/domain-driven-design-that-works.html Jon Jenkins из Clever Labs о важности проблемно-ориентированного подхода] (англ.)
  • [www.infoq.com/presentations/model-to-work-evans Eric Evans о DDD — Разработка модели] (англ.)
  • [www.infoq.com/presentations/strategic-design-evans Eric Evans о DDD — Стратегия проектирования] (англ.)
  • [www.infoq.com/interviews/jimmy-nilsson-domain-driven-design Jimmy Nilsson о проблемно-ориентированном проектировании] (англ.)
  • [skillsmatter.com/podcast/design-architecture/asynchronous-systems-architecture-for-the-web/wd-1569/ Применение проблемно-ориентированного подхода в web разработке] (англ.)
  • [www.infoq.com/articles/haywood-ddd-no Интервью Dan Haywood’s на тему проблемно-ориентированного проектирования] (англ.)
  • [cmcrossroads.com/bradapp/docs/demeter-intro.html Брэд Эпплтон (Brad Appleton) о законе Деметры] (англ.)
  • [martinfowler.com/eaaCatalog/layerSupertype.html Мартин Фаулер (Martin Fowler) описывает схему супертипа слоя] (англ.)
  • [butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod Роберт С. Мартин о принципах S.O.L.I.D. Principles (Принципы)] (англ.)
Видео
  • [www.youtube.com/watch?v=xqzUmJHeMhA&feature=player_embedded «Как съесть слона?», Немцов Александр] (рус.)
  • [skillsmatter.com/podcast/design-architecture/keynoteddd-emerging-themes-2010/wd-1569 Eric Evans' on Defining DDD] (англ.)
  • [www.infoq.com/presentations/strategic-design-evans Eric Evans on DDD: Strategic Design] (англ.)


Отрывок, характеризующий Проблемно-ориентированное проектирование

– А вот что, братцы. Я знаю, трудно вам, да что же делать! Потерпите; недолго осталось. Выпроводим гостей, отдохнем тогда. За службу вашу вас царь не забудет. Вам трудно, да все же вы дома; а они – видите, до чего они дошли, – сказал он, указывая на пленных. – Хуже нищих последних. Пока они были сильны, мы себя не жалели, а теперь их и пожалеть можно. Тоже и они люди. Так, ребята?
Он смотрел вокруг себя, и в упорных, почтительно недоумевающих, устремленных на него взглядах он читал сочувствие своим словам: лицо его становилось все светлее и светлее от старческой кроткой улыбки, звездами морщившейся в углах губ и глаз. Он помолчал и как бы в недоумении опустил голову.
– А и то сказать, кто же их к нам звал? Поделом им, м… и… в г…. – вдруг сказал он, подняв голову. И, взмахнув нагайкой, он галопом, в первый раз во всю кампанию, поехал прочь от радостно хохотавших и ревевших ура, расстроивавших ряды солдат.
Слова, сказанные Кутузовым, едва ли были поняты войсками. Никто не сумел бы передать содержания сначала торжественной и под конец простодушно стариковской речи фельдмаршала; но сердечный смысл этой речи не только был понят, но то самое, то самое чувство величественного торжества в соединении с жалостью к врагам и сознанием своей правоты, выраженное этим, именно этим стариковским, добродушным ругательством, – это самое (чувство лежало в душе каждого солдата и выразилось радостным, долго не умолкавшим криком. Когда после этого один из генералов с вопросом о том, не прикажет ли главнокомандующий приехать коляске, обратился к нему, Кутузов, отвечая, неожиданно всхлипнул, видимо находясь в сильном волнении.


8 го ноября последний день Красненских сражений; уже смерклось, когда войска пришли на место ночлега. Весь день был тихий, морозный, с падающим легким, редким снегом; к вечеру стало выясняться. Сквозь снежинки виднелось черно лиловое звездное небо, и мороз стал усиливаться.
Мушкатерский полк, вышедший из Тарутина в числе трех тысяч, теперь, в числе девятисот человек, пришел одним из первых на назначенное место ночлега, в деревне на большой дороге. Квартиргеры, встретившие полк, объявили, что все избы заняты больными и мертвыми французами, кавалеристами и штабами. Была только одна изба для полкового командира.
Полковой командир подъехал к своей избе. Полк прошел деревню и у крайних изб на дороге поставил ружья в козлы.
Как огромное, многочленное животное, полк принялся за работу устройства своего логовища и пищи. Одна часть солдат разбрелась, по колено в снегу, в березовый лес, бывший вправо от деревни, и тотчас же послышались в лесу стук топоров, тесаков, треск ломающихся сучьев и веселые голоса; другая часть возилась около центра полковых повозок и лошадей, поставленных в кучку, доставая котлы, сухари и задавая корм лошадям; третья часть рассыпалась в деревне, устраивая помещения штабным, выбирая мертвые тела французов, лежавшие по избам, и растаскивая доски, сухие дрова и солому с крыш для костров и плетни для защиты.
Человек пятнадцать солдат за избами, с края деревни, с веселым криком раскачивали высокий плетень сарая, с которого снята уже была крыша.
– Ну, ну, разом, налегни! – кричали голоса, и в темноте ночи раскачивалось с морозным треском огромное, запорошенное снегом полотно плетня. Чаще и чаще трещали нижние колья, и, наконец, плетень завалился вместе с солдатами, напиравшими на него. Послышался громкий грубо радостный крик и хохот.
– Берись по двое! рочаг подавай сюда! вот так то. Куда лезешь то?
– Ну, разом… Да стой, ребята!.. С накрика!
Все замолкли, и негромкий, бархатно приятный голос запел песню. В конце третьей строфы, враз с окончанием последнего звука, двадцать голосов дружно вскрикнули: «Уууу! Идет! Разом! Навались, детки!..» Но, несмотря на дружные усилия, плетень мало тронулся, и в установившемся молчании слышалось тяжелое пыхтенье.
– Эй вы, шестой роты! Черти, дьяволы! Подсоби… тоже мы пригодимся.
Шестой роты человек двадцать, шедшие в деревню, присоединились к тащившим; и плетень, саженей в пять длины и в сажень ширины, изогнувшись, надавя и режа плечи пыхтевших солдат, двинулся вперед по улице деревни.
– Иди, что ли… Падай, эка… Чего стал? То то… Веселые, безобразные ругательства не замолкали.
– Вы чего? – вдруг послышался начальственный голос солдата, набежавшего на несущих.
– Господа тут; в избе сам анарал, а вы, черти, дьяволы, матершинники. Я вас! – крикнул фельдфебель и с размаху ударил в спину первого подвернувшегося солдата. – Разве тихо нельзя?
Солдаты замолкли. Солдат, которого ударил фельдфебель, стал, покряхтывая, обтирать лицо, которое он в кровь разодрал, наткнувшись на плетень.
– Вишь, черт, дерется как! Аж всю морду раскровянил, – сказал он робким шепотом, когда отошел фельдфебель.
– Али не любишь? – сказал смеющийся голос; и, умеряя звуки голосов, солдаты пошли дальше. Выбравшись за деревню, они опять заговорили так же громко, пересыпая разговор теми же бесцельными ругательствами.
В избе, мимо которой проходили солдаты, собралось высшее начальство, и за чаем шел оживленный разговор о прошедшем дне и предполагаемых маневрах будущего. Предполагалось сделать фланговый марш влево, отрезать вице короля и захватить его.
Когда солдаты притащили плетень, уже с разных сторон разгорались костры кухонь. Трещали дрова, таял снег, и черные тени солдат туда и сюда сновали по всему занятому, притоптанному в снегу, пространству.
Топоры, тесаки работали со всех сторон. Все делалось без всякого приказания. Тащились дрова про запас ночи, пригораживались шалашики начальству, варились котелки, справлялись ружья и амуниция.
Притащенный плетень осьмою ротой поставлен полукругом со стороны севера, подперт сошками, и перед ним разложен костер. Пробили зарю, сделали расчет, поужинали и разместились на ночь у костров – кто чиня обувь, кто куря трубку, кто, донага раздетый, выпаривая вшей.


Казалось бы, что в тех, почти невообразимо тяжелых условиях существования, в которых находились в то время русские солдаты, – без теплых сапог, без полушубков, без крыши над головой, в снегу при 18° мороза, без полного даже количества провианта, не всегда поспевавшего за армией, – казалось, солдаты должны бы были представлять самое печальное и унылое зрелище.
Напротив, никогда, в самых лучших материальных условиях, войско не представляло более веселого, оживленного зрелища. Это происходило оттого, что каждый день выбрасывалось из войска все то, что начинало унывать или слабеть. Все, что было физически и нравственно слабого, давно уже осталось назади: оставался один цвет войска – по силе духа и тела.
К осьмой роте, пригородившей плетень, собралось больше всего народа. Два фельдфебеля присели к ним, и костер их пылал ярче других. Они требовали за право сиденья под плетнем приношения дров.
– Эй, Макеев, что ж ты …. запропал или тебя волки съели? Неси дров то, – кричал один краснорожий рыжий солдат, щурившийся и мигавший от дыма, но не отодвигавшийся от огня. – Поди хоть ты, ворона, неси дров, – обратился этот солдат к другому. Рыжий был не унтер офицер и не ефрейтор, но был здоровый солдат, и потому повелевал теми, которые были слабее его. Худенький, маленький, с вострым носиком солдат, которого назвали вороной, покорно встал и пошел было исполнять приказание, но в это время в свет костра вступила уже тонкая красивая фигура молодого солдата, несшего беремя дров.
– Давай сюда. Во важно то!
Дрова наломали, надавили, поддули ртами и полами шинелей, и пламя зашипело и затрещало. Солдаты, придвинувшись, закурили трубки. Молодой, красивый солдат, который притащил дрова, подперся руками в бока и стал быстро и ловко топотать озябшими ногами на месте.
– Ах, маменька, холодная роса, да хороша, да в мушкатера… – припевал он, как будто икая на каждом слоге песни.
– Эй, подметки отлетят! – крикнул рыжий, заметив, что у плясуна болталась подметка. – Экой яд плясать!
Плясун остановился, оторвал болтавшуюся кожу и бросил в огонь.
– И то, брат, – сказал он; и, сев, достал из ранца обрывок французского синего сукна и стал обвертывать им ногу. – С пару зашлись, – прибавил он, вытягивая ноги к огню.
– Скоро новые отпустят. Говорят, перебьем до копца, тогда всем по двойному товару.
– А вишь, сукин сын Петров, отстал таки, – сказал фельдфебель.
– Я его давно замечал, – сказал другой.
– Да что, солдатенок…
– А в третьей роте, сказывали, за вчерашний день девять человек недосчитали.
– Да, вот суди, как ноги зазнобишь, куда пойдешь?
– Э, пустое болтать! – сказал фельдфебель.
– Али и тебе хочется того же? – сказал старый солдат, с упреком обращаясь к тому, который сказал, что ноги зазнобил.
– А ты что же думаешь? – вдруг приподнявшись из за костра, пискливым и дрожащим голосом заговорил востроносенький солдат, которого называли ворона. – Кто гладок, так похудает, а худому смерть. Вот хоть бы я. Мочи моей нет, – сказал он вдруг решительно, обращаясь к фельдфебелю, – вели в госпиталь отослать, ломота одолела; а то все одно отстанешь…
– Ну буде, буде, – спокойно сказал фельдфебель. Солдатик замолчал, и разговор продолжался.
– Нынче мало ли французов этих побрали; а сапог, прямо сказать, ни на одном настоящих нет, так, одна названье, – начал один из солдат новый разговор.
– Всё казаки поразули. Чистили для полковника избу, выносили их. Жалости смотреть, ребята, – сказал плясун. – Разворочали их: так живой один, веришь ли, лопочет что то по своему.
– А чистый народ, ребята, – сказал первый. – Белый, вот как береза белый, и бравые есть, скажи, благородные.
– А ты думаешь как? У него от всех званий набраны.
– А ничего не знают по нашему, – с улыбкой недоумения сказал плясун. – Я ему говорю: «Чьей короны?», а он свое лопочет. Чудесный народ!
– Ведь то мудрено, братцы мои, – продолжал тот, который удивлялся их белизне, – сказывали мужики под Можайским, как стали убирать битых, где страженья то была, так ведь что, говорит, почитай месяц лежали мертвые ихние то. Что ж, говорит, лежит, говорит, ихний то, как бумага белый, чистый, ни синь пороха не пахнет.
– Что ж, от холода, что ль? – спросил один.
– Эка ты умный! От холода! Жарко ведь было. Кабы от стужи, так и наши бы тоже не протухли. А то, говорит, подойдешь к нашему, весь, говорит, прогнил в червях. Так, говорит, платками обвяжемся, да, отворотя морду, и тащим; мочи нет. А ихний, говорит, как бумага белый; ни синь пороха не пахнет.
Все помолчали.
– Должно, от пищи, – сказал фельдфебель, – господскую пищу жрали.
Никто не возражал.
– Сказывал мужик то этот, под Можайским, где страженья то была, их с десяти деревень согнали, двадцать дён возили, не свозили всех, мертвых то. Волков этих что, говорит…
– Та страженья была настоящая, – сказал старый солдат. – Только и было чем помянуть; а то всё после того… Так, только народу мученье.
– И то, дядюшка. Позавчера набежали мы, так куда те, до себя не допущают. Живо ружья покидали. На коленки. Пардон – говорит. Так, только пример один. Сказывали, самого Полиона то Платов два раза брал. Слова не знает. Возьмет возьмет: вот на те, в руках прикинется птицей, улетит, да и улетит. И убить тоже нет положенья.
– Эка врать здоров ты, Киселев, посмотрю я на тебя.
– Какое врать, правда истинная.
– А кабы на мой обычай, я бы его, изловимши, да в землю бы закопал. Да осиновым колом. А то что народу загубил.
– Все одно конец сделаем, не будет ходить, – зевая, сказал старый солдат.
Разговор замолк, солдаты стали укладываться.
– Вишь, звезды то, страсть, так и горят! Скажи, бабы холсты разложили, – сказал солдат, любуясь на Млечный Путь.
– Это, ребята, к урожайному году.
– Дровец то еще надо будет.
– Спину погреешь, а брюха замерзла. Вот чуда.
– О, господи!
– Что толкаешься то, – про тебя одного огонь, что ли? Вишь… развалился.
Из за устанавливающегося молчания послышался храп некоторых заснувших; остальные поворачивались и грелись, изредка переговариваясь. От дальнего, шагов за сто, костра послышался дружный, веселый хохот.
– Вишь, грохочат в пятой роте, – сказал один солдат. – И народу что – страсть!