Что такое домен в программировании

Что можно узнать о Domain Driven Design за 10 минут?

Говорят, что можно бесконечно смотреть на огонь, наблюдать за тем, как работают другие, а также изучать DDD (Domain Driven Design, предметно-ориентированное проектирование). Но если у вас есть только 10 минут — можно прочитать эту статью и пройтись по самым верхушкам, а потом с умным видом кивать головой во время светской беседы.

Покрутили и рассмотрели DDD с разных сторон вместе с Андреем Ратушным — техническим директором компании Югорские Интернет Решения.

О компании: Югорские Интернет Решения — компания, которая занимается автоматизацией бизнес-процессов в коммерческом и государственном секторах. Расположены в г.Ханты-Мансийске. В разработке 12 человек.

1. Что такое DDD, можно объяснить даже ребёнку (или маркетологу)

DDD — это подход, который нацелен на изучение предметной области предприятия в целом или каких-то отдельных бизнес-процессов. Это отличный подход для проектов, в которых сложность (запутанность) бизнес-логики достаточно велика. Его применение призвано снизить эту сложность, насколько возможно.

Вне подхода DDD, когда программист пишет код, больше внимания он уделяет технологиям и инфраструктуре, например, как отправить сообщение, как его получить, закодировать, сохранить в базу данных, в какую именно базу данных.

Подход DDD говорит о том, что всё это, конечно, важно, но вторично. Бизнес главнее и должен стоять на первом месте. И чтобы вся эта штука заработала вместе, DDD учит нас (разработчиков) разговаривать с бизнесом на одном языке. Не на языке программирования, а на языке бизнеса. Это называется в DDD Единый язык (Ubiquitous language).

2. Фишка DDD — Ограниченный Контекст (Bounded Context)

Ограниченный Контекст (Bounded Context) — ключевой инструмент DDD, это явная граница, внутри которой существует модель предметной области. Она отображает единый язык в модель программного обеспечения. Именно на основании контекстов можно разделить код на модули/пакеты/компоненты таким образом, чтобы изменения в каждом из них оказывали минимальное (или нулевое) влияние на других.

Для разработчиков такой подход позволяет вносить изменения в код не опасаясь, что где-то в другом месте что-то сломается (например, менять что-то в кассе и не переживать, что из-за этого что-то отвалится у курьеров).

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

Кроме ограниченного контекста есть ещё всякие штуки типа карт контекстов, единого языка, отношений между контекстами, карты трансляций… уффф! Об этом за 10 минут не расскажешь, но можно почитать «зелёную» книжку.

3. Главные книжки по DDD: красная, синяя и зелёная

DDD — довольно старый подход. Его использование выглядит разумным и вполне оправданным, но почему-то он всё ещё мало распространён, про него мало говорят на конференциях. Да что не так с этим DDD?

Есть предположение, что основная проблема в дефиците учебных материалов. Вся теория описана в нескольких книжках: красной, синей и зелёной. Говорят, что есть «ещё одна красная книжка», но её пока мало кто видел :)

Красная и синяя книги настолько тяжелы в восприятии, что где-то на середине хочется вышвырнуть книгу в окно с криками: «Хватит с меня этого дерьма, нафиг этот непонятный DDD! Пойду, сделаю как умею». И это только про теорию, с материалами по практике ещё сложнее.

Поэтому, если вы всё-таки решите начать изучать литературу по DDD, то лучше всего начать с «зелёной» книги. В ней Вон Вернон пробегается по верхушкам подхода и на простых примерах показывает его преимущества. Говорят, что перевод получился сомнительным, так что лучше читать в оригинале.

4. Как понять, что пора применять DDD

Посчитайте количество сценариев использования вашей системы. Если их в районе 10-15, значит бизнес-логика не такая сложная, и вы можете не париться, никакого DDD не применять.

Если у вас 30-50 и более UX-кейсов, и они очень сильно пересекаются, имеет смысл задуматься над применением DDD хотя бы в какой-то части системы.

5. Как внедрить DDD в компании снизу вверх

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

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

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

У подхода есть побочное действие: если люди начнут хотя бы стремиться к DDD, то они уже начнут действовать в парадигме «Разделяйте, делите, понижайте связность и следите за бизнес-логикой». А от этого начнутся положительные изменения: где-то код будет лучше писаться, где-то скорость увеличится. Не обязательно эти знания должны превратиться в коде именно в контексты и другие DDD-шные артефакты. Код может остаться кодом, но он станет лучше, а скорость и качество повысятся.

6. Как внедрить DDD в компании сверху вниз

7. Как научить человека DDD без его ведома

Конечно же, через практику. Просто не говорите человеку заранее, что учите его DDD, не пугайте раньше времени.

Пусть человек приходит и получает задачки. Не говорите ему, что это DDD, пусть просто делает. Он сделает, исходя из того, как он понимает солиды и всё такое. Потом, когда он будет сдавать работу, ему нужно сказать: «Дорогой чувак, оно вроде работает, но его нужно переделать», — и объясняете ему почему.

Не заставляйте читать или учить всё целенаправленно. Будьте интерактивными в этом плане. Так человек за 3-5 месяцев начнёт понимать базовые принципы DDD: с точки зрения реализации, с точки зрения теории. Паттерны он начнёт понимать ещё раньше по артефактам подхода – картам контекстов. Сначала людям будет ничего непонятно, но постепенно они врубятся, а некоторые даже книжки начнут читать.

8. Умею DDD — неважная строчка для резюме в России

Если вы находитесь в России и знаете DDD — это круто. Но далеко не факт, что сами знания DDD пригодятся в работе. Скорее, это будет служить индикатором для работодателя о вашем высоком уровне развития как разработчика. Ведь навыки, которые вы приобретаете, изучая подход DDD, развивают вас как программиста и как проектировщика (архитектора).

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

9. Связь DDD с волосами на лице

Наблюдение: люди, которые разбираются в DDD, носят бороды. Значит ли это, что наличие бороды — предпосылка к успешности в DDD? Вы как считаете?

10. Полезные материалы по DDD

Подкаст «Ничего такого». Дорогой читатель, эта статья была написана под впечатлением от выпуска нашего подкаста. Нам стало интересно как выглядит культура, строятся команды и процессы в разных технологических компаниях вроде Miro, Яндекса, Amazon, Microsoft, Едадила. Поэтому мы встретились с ребятами оттуда и поболтали на эти темы.

Источник

Объясни мне: что такое домен и как его получить

Пошаговая инструкция для начинающих.

В самой первой статье из серии «Объясни» мы схематично показали, как устроен интернет. Теперь идём дальше — говорим про названия сайтов, откуда они берутся и зачем они нужны.

Что такое домен

Домен второго уровня — основное имя сайта:

Чаще всего домены любого уровня пишутся латиницей, но в национальных доменах можно писать кириллицей или иероглифами:

中国移动.中国 — адрес китайского мобильного оператора China Mobile

президент.рф — дополнительный адрес сайта Кремля

С технической точки зрения домен — это запись в базе данных, которая сообщает компьютерам: «Если введён такой-то адрес — отправьте запрос на такой-то IP». И ещё это запись на компьютере, который обслуживает сайт: «если пришёл запрос с таким-то доменным именем, покажи ему такой-то сайт». Короче, домены — это просто записи в базе данных.

Кому нужен домен

Домены нужны всем, у кого есть сайт, и тем, кто только хочет его сделать. Домен как отпечаток пальца — двух одинаковых не бывает, все названия уникальны. Они могут быть визуально похожи или отличаться одним символом, но если кто-то уже взял себе домен yandex.ru, то купить себе такой же уже не получится.

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

Ограничений по названиям доменов почти нет, кроме тех, что прописаны в законе. Сайт наркотики.рф зарегистрировать не получится. Зато предлагают narkotiki.ru.com всего за 142 рубля!

Покупка домена

Чтобы купить домен, понадобится специальный сервис — регистратор доменных имён. В Рунете их много, мы всё будем делать на примере reg.ru, но порядок действий везде одинаковый:

Теперь каждый пункт подробнее.

Регистрация. Заходим на страницу регистрации, вводим адрес и подтверждаем его в почте. Проще некуда.

Подбор свободного имени. Там же на главной пролистываем экран немного вниз и попадаем в форму поиска доменов. Выберем название mihailmaximov.ru и проверим, свободно ли оно. Этот домен пригодится нам, когда мы будем делать полноценный сайт на основе страницы «О себе» на Бутстрапе. Сервис нам тут же предлагает купить второй домен за один рубль — спасибо, в другой раз:

Нажимаем «Зарегистрировать» и по пути отказываемся от навязанного хостинга — его мы выберем потом сами:

Паспортные данные или реквизиты компании. Перед оплатой сервис попросит ввести информацию о себе. Это нужно для того, чтобы регистратор имён знал, с кем он заключает договор и кому предъявлять претензии в случае нарушения закона. Весь остальной интернет этого не видит, но если что — регистратор будет знать, кто отвечает за домен и как с ним связаться. Все свои данные можно посмотреть в личном кабинете регистратора:

Оплата. Регистраторы — продвинутые ребята, поэтому обычно у них есть все законные способы оплаты от банковского перевода до PayPal:

Если после оплаты видим такое или что-то подобное, значит, всё прошло хорошо, домен теперь наш:

Посмотреть все домены, которые у вас есть, можно в том же личном кабинете:

Избавиться от домена

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

Что дальше

Свой домен — это только половина дела. Ещё нужно настроить его, чтобы все знали, куда именно ведёт этот адрес, привязать его к хостингу и залить туда нужные файлы. В результате у нас получится свой сайт с собственным именем в сети. Подписывайтесь, чтобы не пропустить продолжение.

Источник

Domain Driven Design на практике

Эванс написал хорошую книжку с хорошими идеями. Но этим идеям не хватает методологической основы. Опытным разработчикам и архитекторам на интуитивном уровне понятно, что надо быть как можно ближе к предметной области заказчика, что с заказчиком надо разговаривать. Но не понятно как оценить проект на соответствие Ubiquitous Language и реального языка заказчика? Как понять, что домен разделен на Bounded Context правильно? Как вообще определить используется DDD в проекте или нет?

Последний пункт особенно актуален. На одном из своих выступлений Грег Янг попросил поднять руки тех, кто практиукует DDD. А потом попросил опустить тех, кто создает классы с набором публичных геттеров и сеттеров, располагает логику в «сервисах» и «хелперах» и называет это DDD. По залу прошел смешок:)

Как же правильно структурировать бизнес-логику в DDD-стиле? Где хранить «поведение»: в сервисах, сущностях, extension-методах или везде по чуть-чуть? В статье я расскажу о том, как проектирую предметную область и какими правилами пользуюсь.

Все люди лгут

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

Сначала аналитика, потом проектирование и лишь затем — разработка

Начинать нужно не со структуры БД или набора классов, а с бизнес-процессов. Мы используем BPMN и UML Activity в сочетнии с контрольными примерами. Диаграммы хорошо читаются даже теми, кто не знаком со стандартами. Контрольные примеры в табличной форме помогают лучше обозначить пограничные кейсы и устранить противоречия.

Абстрактные разговоры — просто потеря времени. Люди убеждены, что детали не значительны и «незачем вообще их обсуждать, ведь все уже ясно». Просьба заполнить таблицу контрольных примеров наглядно показывает, что вариантов на самом деле не 3 а 26 (это не преувеличение, а результат аналитики на одном из наших проектов).

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

Выделяем контексты

Единую предметную модель для всего приложения можно создать только в случае, когда на уровне топ-менеджмента принята и реализована политика использования единого непротиворечивого языка в рамках всей организации. Т.е. когда отдел продаж говорит производству «аккаунт», они оба понимают слово одинаково. Это один и тот же аккаунт, а не «аккаунт в CRM» и «юр.лицо клиента».

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

Архитектура

Структура проекта

.NET-проекты я структурирую следущим образом:

Моделируем сущности

Под сущностью будем понимать объект предметной области, обладающий уникальным идентификатором. Для примера возьмем класс, описывающий российскую компанию, в контексте получения аккредитации в неком ведомстве.

Чтобы правильно выбрать агрегаты и отношения зачастую одной итерации недостаточно. Сначала я накидываю основную структуру классов, определяю отношения один к одному, один ко многим и многие ко многим и описываю структуру данных. Затем трассирую структуру по бизнес процессам, сверяясь с BMPN и контрольными примерами. Если какой-то кейс не укладывается в структуру, значит при проектировании допущена ошибка и структуру необходимо изменить. Результирующую структуру можно оформить в виде диаграммы и дополнительно согласовать с экспертами в предметной области.

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

Выбор уникального идентификатора

Настоящие конструкторы

Для материализации объектов ORM чаще всего используют reflection. EF сможет дотянуться до protected-конструктора, а программисты – нет. Им придется создать корректное юр. лицо, идентифицируемое по ИНН и КПП. Конструктор снабжен гардами. Создать не корректный объект просто не получится. Extension-метод ValidateProperties вызывает валидацию по DataAnnotation — атрибутам, а NullIfEmpty не дает передать пустые строки.

Для валидации ИНН специально написан атрибут следующего вида:

Конструктора без параметров объявлен защищенным, чтобы его использовала только для ORM. Для материализации используется reflection, поэтому модификатор доступа — не помеха. В «настоящий» конструктор переданы оба необходимых поля: ИНН и КПП. Остальные поля юр.лица в контексте системы не обязательные и заполняются представителем компании позже.

Инкапсуляция и валидация

Можно еще больше усилить систему типов. Однако в описанном по ссылке подходе есть существенный недостаток: отсутствие поддержки со стороны стандартной инфраструктуры ASP.NET. Поддержку можно дописать, но такой инфраструктурный код чего-то стоит и его нужно сопровождать.

Свойства для чтения, специализированные методы для изменения

Альтернативный вариант — использовать паттерн «состояние» и вынести поведение в отдельные классы.

Спецификации

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

Extension-методы

Ad hoc полиморфизм для интерфейсов (чтобы не приходилось реализовывать методы в каждом наследнике) рано или поздно появится в C#. Пока приходится довольствоваться extension-методами.

Extension-методы подходят для использования в LINQ для большей выразительности. Однако, методы ByInnAndKpp и ByInn нельзя использовать внутри других выражений. Их не сможет разобрать провайдер. Более подробно про использование extension-методов а-ля DSL рассказал Дино Эспозито на одном из DotNext.

Вопрос эквивалентности вариантов с Select и SelectMany с точки зрения IQueryProvider я еще до конца не изучил. Буду благодарен любой информации на эту тему в комментариях.

Связанные коллекции

Желательно использовать только в блоке Select для преобразования в SQL-запрос, потому что код вида company.Documents.Where(…).ToList() не построит запрос к БД, а сначала поднимет в оперативную память все связанные сущности, а потому применит Where к выборке в памяти. Таким образом, наличие коллекций в модели может крайней негативно отразиться на производительности приложения. При этом рефакторинг будет произвести сложно, потому что придется передавать необходимые IQueryable из вне. Чтобы контролировать качество запросов нужно поглядывать в miniProfiler.

Сервисы (Service)

Менеджеры (Manager)

TPT для union-type

Иногда одна сщуность может быть связана с одной из нескольких других. Для создания непротиворечивой системы хранения можно использовать TPT, а для control flow — pattern matching. Этот подход подробно описан в отдельной статье.

Queryable Extensions для проекций в DTO

CQRS для отдельных подсистем

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

Подход ограничено-применим для очень-очень нагруженных ресурсов из-за накладных расходов на IOC-контейнер и memory traffic для per request lifestyle. Однако, все IQuery можно сделать singleton’ами, если не инжектировать зависимости от БД в конструктор, а вместо этого использовать конструкцию using.

Работа с унаследованным кодом

При работе с существующей кодовой базой следует определиться с форматом работы: «поддержка» или «развитие». В первом случае не предполагается появление новой функциональности и доработка системы. Максимум — добавить несколько новых отчетов, пару форм тут и там. Во втором — есть необходимость значительной переработки предметной модели и / или архитектуры в целом. Если проект необходимо именно «поддерживать», а не «развивать», лучше следовать существующим правилам, независимо от того на сколько они удачные. Если перед вами откровенный говнокод, от предложения посупортить его лучше отказаться.

Развитие проекта — задача более сложная. Тема рефакторинга выходит за рамки данной статьи. Отмечу лишь два самых полезных паттерна: «антикоррупционный слой» и «душитель». Они очень похожи. Основная идея — выстроить «фасад» между старой и новой кодовыми базами и постепенно есть слона переписывать всю систему по кусочкам. Фасад берет на себя роль барьера, не позволяющего проблемам старой кодовой базы просочиться в новую и обеспечивающего отображение старой бизнес-логики в новую. Будьте готовы, что фасад будет состоять из сплошь из хаков, уловок и костылей и рано или поздно канет в лету вместе со всей старой кодовой базой.

Источник

Домен (базы данных)

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

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

По аналогии с математикой, типы данных делят на скалярные и нескалярные. Значение нескалярного типа (нескалярное значение) имеет множество видимых пользователю компонентов, а значение скалярного типа (скалярное значение) не имеет такового. Примерами нескалярного типа являются тип отношения и тип кортежа; пример скалярного типа — тип «целое».

Ограничения реализации систем баз данных на компьютерах накладывают на определение типов некоторую условность. Так, теоретически тип INTEGER представляет собой множество всех возможных целых чисел, однако фактически INTEGER — это множество всех целых чисел, которые могут быть представлены в рассматриваемой компьютерной системе (поскольку, безусловно, есть такие целые числа, которые превышают возможности представления в любой компьютерной системе).

Следует отличать тип как таковой (логическое понятие) и формат физического представления значений этого типа в конкретной компьютерной системе; типы относятся к уровню логической модели, а физическое представление значений — к уровню реализации. Например, операции, определённые для типа «строка», не имеют смысла для типа «число», даже если числа в конкретной реализации физически представлены строками. Значения типа «дата» нередко физически представлены вещественным числом, однако большинство операций, имеющих смысл для типа «число», бессмысленны для типа «дата».

Реляционная модель данных не предписывает обязательной поддержки каких-либо предопределённых типов, за исключением логического типа (BOOLEAN), без которого при выполнении операций обойтись невозможно. Обычно некоторый набор типов поддерживается системой (такие типы называют базовыми, встроенными, или системными), другие типы пользователь может конструировать (определять) дополнительно (такие типы называют пользовательскими, англ. user-defined types).

Источник

Понравилась статья? Поделиться с друзьями:

Не пропустите наши новые статьи:

  • что такое домен в windows
  • что такое домашняя сеть windows 10
  • Что такое домашняя директория linux
  • Что такое домашняя группа в windows
  • что такое домашняя группа в windows 7

  • Операционные системы и программное обеспечение
    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest
    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии