• Чем отличается контекст от домен в ddd?

    @ddd329
    Приветствую!
    Например, в реальном мире существует некий бизнес, который принимает заказы и соответственно занимается их доставкой. Так вот этот бизнес и является Предметной Областью, которая содержит в себе некую проблему, которую нужно решить. При решении проблем предметной области при помощи разработки программного продукта, в коде мы эту область моделируем и получается Модель Предметной Области, которая выражает способ решения проблемы. Получается в реальном мире есть Предметная Область (Domain), а в программном коде есть Модель Предметной Области (обычно тоже Domain).
    Предметная область может быть очень большой или структура бизнеса состоит из нескольких отделов, и поэтому эту область могут разбивать на подобласти(sub-domain). Так вот эти самые подобласти в программном коде реализуются посредством Ограниченных Контекстов (Bounded Context), каждый из которых содержит свою маленькую Модель Предметной Области.

    Теперь непосредственно к самому вопросу: "Чем отличается контекст от домен в ddd?" - если у вас предметная область не разделена на подобласти, то в реальном мире Предметная область (Domain), будет иметь отражение в программном коде в виде одной Модели Предметной Области (Domain), что равно одному Ограниченному Контексту (Bounded Context).
    А если предметная область разделена на Подобласти Предметной Области, то в коде будет отражаться в виде нескольких Ограниченных Контекстов.

    Судя по вашей структуре папок, могу сказать, что ваша предметная область состоит из двух подобластей: Заказ и Доставка, и в программном коде реализуются посредством двух Ограниченных Контекстов: Заказ (Order) и Доставка (Delivery), где каждый содержит свою маленькую Модель Предметной Области (Domain), которая размещена в у вас в папке domain.

    Папки Order и Delivery можно было переименовать в OrderBoundexContext и DeliveryBoundexContext, тогда может быть и не возникла путаница.

    В рамках примера такой структуры кода, папка `Delivery` является доменом или контекстом?
    - является поддоменом/подобластью и одновременно ограниченным контекстом в коде, которая содержит свою модель. Аналогично и для Order.
    Ответ написан
    Комментировать
  • Есть смысл читать "Г. Шилдт. C# 4.0: полное руководство" в 2020?

    @ddd329
    Читал эту книгу где-то в 2013-ом. Очень хороша, вот было недавно желание ее снова почитать. Так что в 2020 она всё ещё актуальная на мой взгляд.
    Ответ написан
    Комментировать
  • Изучать программирование для работы или для универа?

    @ddd329
    Ну собственно вопрос: стоит изучать c#, а потом перейти в веб или забить на с#

    C# так-то тоже используется в веб-разработке, только на стороне сервера (backend).

    (лаб. работы буду либо гуглить, либо у однокурсников просить)

    Ну как-то не серьезно, если честно. Как сказали что поступили на "программиста", а лабы по программированию брать у однокурсников?? Самому-то не западло?

    Если вы видите альтернативу c# в видите php или python, то изучайте параллельно, но лабы делайте по программированию сами, на c#, как от вас того требует ВУЗ.
    Ответ написан
    Комментировать
  • Годится ли такая книга для изучения PHP/ООП?

    @ddd329
    3. Сильно ли сломает сознание, если уже есть какой-то закреплённый материал по докам (нужно ли будет переучиваться)?
    Ну и собственно это основное, что интересует.

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

    Что касается "ломки" сознания, то многие, в том числе и я, попадали в такую ловушку - при написании проекта вы всегда будете стремится применить какой-нибудь паттерн.
    Ответ написан
    Комментировать
  • Чем плоха вставка в массив в заданную позицию?

    @ddd329
    Приветствую!

    Если отвечать прямо на поставленный вопрос, то это плохо тем, что в среднем половину элементов придется сдвигать.

    Вопрос почти философский, и есть ли алгоритмы более лучше чем которые я описал?

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

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

    В .Net Framework над массивом реализован абстрактный тип данных (АТД) - список, т.е. List. Так вот там при создании пустого списка, массив имеет длину 4 элемента, если необходимо будет вставить 5-ый элемент, то длина массива просто увеличивается в 2 раза, и станет равна 8-ми. Вставишь 9-ый элемент, то размер увеличиться до 16 и т.д.
    Ответ написан
    Комментировать
  • Entity Framework - не нужен?

    @ddd329
    Приветствую!

    Эрик Эванс в своей книге "Предметно-ориентированное проектирование" упоминал, что разработчики нередко думают об объектах приложения в терминах таблиц баз данных. Вот у нас есть условный "Заказ", стало быть есть и таблица заказ, есть "Поставщик", значит и таблица такая. В итоге модель приложения ("домен") сливается со структурой базы данных и если вдруг приходит идея\необходимость разместить данные как-то иначе, это напрямую затрагивает модель, что как минимум нежелательно, а строго говоря - плохо.


    Да, Эванс писал что-то подобное, но основной акцент у него был сделан на том, что связи, которые существуют между таблицами в БД, разработчики переносят их в модель, тем самым все усложняя.
    И, приведенный вами пример, как раз это очень хорошо демонстрирует! Не нужна вам объектная ссылка между Client и Order, т.к. это разные агрегаты и каждый из них реализует свои инварианты. А вот ссылка между агрегатами в виде идентификаторов - int, Guid или чего-то другого, как раз является рекомендуемым способом.
    Ответ написан
    Комментировать
  • Насколько детально нужно знать webpack для разработчика на Vue.js?

    @ddd329
    Здравствуй!
    Хотя я неплохо знаю js, но при изучении vue и react я соответственно использовал vue-cli и create-react-app. Точно не скажу, т.к. возможно я не буду прав, но думаю что надо быстрее создать с помощью этих технологий хоть какое-нибудь приложение, и "спросить" себя что же тебе больше "зашло"... Лично мне - vue.js...
    Ответ написан
    1 комментарий
  • Книги и ресурсы по ООП?

    @ddd329
    Если можно, то отвечу чего точно не стоит смотреть/читать, так это то, когда начинают говорить что-то наподобие такого:
    Ну вот представьте что у вас есть кошечка и собачка. Кошечка мяукает, а собачка лает, т.е. они все умеют говорить, но каждый по-своему. Кошечка и собачка это животное, значит выделим базовый класс Animal...

    Да и вообще, когда говорят, что ООП моделирует реальный мир... Бегите сразу от таких преподователей...
    Ответ написан
    3 комментария
  • Недостати при комбинации нескольких команд во время одного запроса/процесса в CQRS подходе?

    @ddd329
    1. Допустим, в моей системе имеется 2 команды (command) и их обработчики (command handlers): 1 - создает пользователя, 2 - активирует его аккаунт. Но тут приходит бизнес и говорит: "Для пользователей, у которых почтовый адрес от gmail, аккаунты должны активироваться сразу же, в момент создания". Как в этом случае должен выглядеть контроллер, который обрабатывает запрос на создание пользователя? Должен ли он после вызова обработчика создания пользователя, сразу же вызвать обработчик активации аккаунта если почтовый адрес от gmail? Вопрос можно сформулировать так: имеет ли какие-то недостатки, подход, комбинирования обработчиков команд при обработке единого запроса?

    После выполнения команды на создание пользователя необходимо опубликовать событие об этом, а дальше некий обработчик в своем коде будет проверять email и если он от gmail, то формирует команду на активацию и дальше в шину её, или куда там у вас...
    Ответ написан
    Комментировать
  • Литературу или курсы по алгоритмам?

    @ddd329
    Очень хорошая книга по алгоритмам которую я видел - это "Структуры данных и алгоритмы в Java" Лафоре Роберт. Пусть вас не смущает что написано "в Java", там этот язык только для примера дан. Лучшей книги пока что не видел.

    Про книгу "Грокаем алгоритмы" могу сказать что это дерьмо собачье, непонятно откуда столько хвалебных отзывов, книга наполнена какими-то дебильными и не связными рисунками, я понимаю что автор хотел, но у него это плохо получилось.
    Ответ написан
    Комментировать
  • По какому пути вы бы пошли при рефакторинге?

    @ddd329
    Менеджер проекта решил возвращать с округлением.

    Обычно округление и форматирование значений с плавающей запятой требуется для отображений в графическом интерфейсе пользователя.
    Если вашему менеджеру необходимо именно это, то никакие изменения в класс Balanceвносить не нужно, т.к. этот класс является бизнес-сущностью и соответственно реализован в бизнес-слое, а логику отображения необходимо править в слое отображения.
    Например, вы используете паттерн Model-ViewModel-View, то эту задачу должен решать класс ViewModel. Если используете паттерн Model-View-Presenter или Model-View-Controller, то соответственно задачу решает Presenter и Controller.
    Если речь об этом, то в принципе разговор здесь можно закончить, но если это необходимо для решения бизнес-задач, то давайте разберемся по порядку.

    1) Добавить округление в с существующий метод getBalance, запустить тесты на getBalance и через 5 мин пойти пить кофе.

    На вашем месте я бы сделал именно это, если речь идет не об отображении данных.

    2) Добавить в Класс Balance новый метод getAdvancedBalance c округлением а текущий метод не трогать тк у нас банки если что то сломается будет не приятно

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

    3) Сделать новый класс AdvancedBalance унаследовать от Balance и переопределить метод getBalance, отрефакторить весь проект на использование AdvancedBalance:getBalance вместо Balance:getBalance и молится что ничего не сломалось хоть тесты и есть, но банк и если у когото олигарха что то не то отобразится вам мало не покажется

    Можно так делать, но не нужно в вашем случае. Особенно не очень хорошо, как вы сказали чтобы отрефакторить весь проект и произвести замену класса Balance на AdvancedBalance. Вам необходим выполнить маленькую простую задачу, а изменений в этом случае придется сделать очень много, а это большой риск для внесения ошибок.
    Вообще для таких решений код проектируют таким образом: класс Balance объявляют абстрактным и у него определяют статический фабричный метод var balance = Balance.Create(/* агрументы */). Ну и соответственно в зависимости от значений входящих аргументов, вам вернется правильный наследник. Если вы захотите добавить нового наследника, например AdvancedBalance, то внесете изменения только в метод Create. Вот здесь наверное будет соблюден принцип открытости/закрытости.

    4) Сделать новый класс AdvancedBalance унаследовать от Balance и создать новый метод getAdvancedBalance, отрефакторить
    и снова молится.

    Если вы так сделаете, то нарушите принцип Барбары Лисков.
    Ответ написан
  • Как использовать DDD подход к реализации каталога?

    @ddd329
    Модель предметной области по DDD, это чисто для организации бизнес-логики, и такие понятия как Агрегат, Сущность, Объект-значение служит исключительно этим целям.
    Для отображения данных в графическом интерфейсе можно, а то и нужно создавать вторую модель для чтения.
    Т.е. по итогу должно получиться две модели, во многом они будут себя дублировать в простых областях.
    Ответ написан
    Комментировать
  • Как правильно связать две таблицы, если признак первой таблицы не всегда нужен в признаке второй таблицы?

    @ddd329
    В таблицу машин добавь поле PersonId. Связь будет один ко многим, т.е. один человек и ноль и более машин. Если у одной машины несколько хозяев, тогда создавай промежуточную таблицу, и связь уже будет многие ко многим.
    Ответ написан
    Комментировать
  • Какую книгу почитать, что бы изменить мышление программиста на бизнес-программиста?

    @ddd329
    На мой взгляд, у вас те же самые проблемы что и у всех программистов и на врядли найдутся исключения.
    Какая книга может повлиять на вас конкретно, сказать тяжело. Лично мне хорошо "вправило" мозг книга по рефакторингу Мартина Фаулера. Вот после нее я уже по другому писал и смотрел на код, хотя до этого прочитал не мало других толковых книг.
    Ну тут один совет, читать, пробовать, ну и здесь вопросы по ходу изучения задавать.
    Ответ написан
    1 комментарий
  • Можно ли параллельно с чтением книги по Си читать про архитектуру ЭВМ?

    @ddd329
    Лично я читаю по 4 книги параллельно. Например, с утра одну, а вечером другую. Через пару дней меняю книги, и нормально все усваивается.
    На вашем месте я бы читал параллельно. Язык Си довольно низкоуровневый, поэтому понимание архитектуры компьютера очень даже необходимо при его изучении.
    Да и в школе все так учатся! Нет же такого, что сначала прошли математику, а после физику, а после...
    А вообще сам попробуй, да поймешь стоит или не стоит тебе этого делать, думаю мало кто сможет дать дельный совет, т.к. многие вообще книг не читают, а только Хабр!
    Ответ написан
    42 комментария
  • Как отследить нажатие на кнопку?

    @ddd329
    TextBox1.Click -= TextBox1_Click;
    После MessageBox пропиши
    Ответ написан
    Комментировать
  • Как проектировать приложение с нуля?

    @ddd329
    Я бы посоветовал книгу Крэга Лармана "Применение UML 2.0 и шаблонов проектирования".
    Ну а так можно начинать проектировать простые приложения с Базы Данных, думаю для начинающих это проще и эффективнее. Можно конечно посоветовать почитать Эрика Эванса про его методологию DDD (Domain Driven Design - проектирование на основе предметной области), но думаю мозг сломаешь и на ранних этапах от нее пользы точно не будет.
    Что касается проектирования UI, то здесь могу посоветовать паттерн MVP (Model-View-Presenter).

    А то, что прочитанный вами материал неполный, то интересно как вы это определили? Спросили у экспертов?
    Вообщем в книге Крэга Лармана много чего есть, сначала следует начать с нее.
    Ответ написан
    1 комментарий
  • Нужно ли создавать интерфейсы для одного класса?

    @ddd329
    Смотря какой класс.
    Если это сущность предметной области, то нет, не стоит.
    Если это сервисы, то да, стоит.
    Ответ написан
    Комментировать
  • Как залезть на несколько уровней абстракции ниже, не плодя кривой код?

    @ddd329
    Вот самый подходящий паттерн Цепочка обязанностей
    Ответ написан
    Комментировать
  • Можно ли комментировать локальные переменные Visual Studio [нельзя]?

    @ddd329
    Ну если только один строчный комментарий. А вообще это очень плохая практика, т.к. из названия должно быть понятно что это за переменная и для чего она предназначена. Ну и соответственно нужен какой-то контекст, где это переменная используется.
    Если у вас в коде визуальной формы объявлена переменная total или sum например, то конечно не понятно будет для чего они тут, а если например они объявлены в классе ЗАКАЗ, то тут понятно что это сумма заказа, т.е. мы поняли это из контекста объявления переменных...
    Ответ написан
    3 комментария