Информация об изменениях

Сообщение Запутался с DDD от 19.10.2021 4:46

Изменено 19.10.2021 4:47 vaa

Запутался с DDD
Основной опыт на C#. Интересуюсь также другими ЯП.
В целом C# представляет довольно гибкий инструмент.
Смущает то, что большая часть бестпрактик в нем имеют смысл соглашений.
От readonly который защищает только ссылку, но не граф объекта.
До например дефолтного ОРМ типа EF, который на корню рушит идеологию DDD создания объектов через конструктор.
Т.е. использование EF в парадигме DDD сильно затруднено.
Кроме того у программиста не знакомого с соглашениями всегда есть возможность вызвать ef напрямую минуя домен.
Если пойти дальше и посмотреть на F# то там DDD имеет гораздо более острую форму.
т.е. в C# может быть св-во
public class Order
{
 //...
 
 public bool IsApproved { get; protected set; }
 
 public IEnumerable<OrderHistoryEntry> HistoryEntries
 {
  get { return historyEntries; }
 }
 
 public void Approve()
 {
  IsApproved = true;
 
  var orderHistoryEntry = new OrderHistoryEntry(this, OrderHistoryType.Approved);
 
  historyEntries.Add(orderHistoryEntry);
 }
}

В F# так не рекомендуют
type Order = private UnApproved  |  Approved               
module Order =
    let create () = Order.UnApproved
    let approve order = 
        match order with
        | UnApproved -> Approved
        | _ -> order


По сути предлагается в пределе получается произведение состояний (по классу на каждое состояние).
И вроде чем больше корректности тем лучше, но тогда может возникнуть дурная бесконечность.
Не так ли?
Запутался с DDD
Основной опыт на C#. Интересуюсь также другими ЯП.
В целом C# представляет довольно гибкий инструмент.
Смущает то, что большая часть бестпрактик в нем имеют смысл соглашений.
От readonly который защищает только ссылку, но не граф объекта.
До например дефолтного ОРМ типа EF, который на корню рушит идеологию DDD создания объектов через конструктор.
Т.е. использование EF в парадигме DDD сильно затруднено.
Кроме того у программиста не знакомого с соглашениями всегда есть возможность вызвать ef напрямую минуя домен.
Если пойти дальше и посмотреть на F# то там DDD имеет гораздо более острую форму.
т.е. в C# может быть св-во
public class Order
{
 //...
 
 public bool IsApproved { get; protected set; }
 
 public IEnumerable<OrderHistoryEntry> HistoryEntries
 {
  get { return historyEntries; }
 }
 
 public void Approve()
 {
  IsApproved = true;
 
  var orderHistoryEntry = new OrderHistoryEntry(this, OrderHistoryType.Approved);
 
  historyEntries.Add(orderHistoryEntry);
 }
}

В F# так не рекомендуют
type Order = private UnApproved  |  Approved               
module Order =
    let create () = Order.UnApproved
    let approve order = 
        match order with
        | UnApproved -> Approved
        | _ -> order


По сути в пределе получается произведение состояний (по классу на каждое состояние).
И вроде чем больше корректности тем лучше, но тогда может возникнуть дурная бесконечность.
Не так ли?