Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Если делать Lazy Load, то начинаются приколы вроде SELECT N+1
class Order
{
public void ProcessOrder()
{
if(this.Customer.Age < 18) //Тут кастомер загружается LL, вроде ниче страшного
{
//Some logic
}
}
}
class Manager
{
public void BatchProcessOrders()
{
foreach(Order o in this.Orders)
{
o.ProcessOrder(); //SELECT N+1, только об этом узнать нельзя пока не заглянешь внутрь
}
}
}
foreach(Order o in this.Orders)
Если проблема в строке, то как её обойти? Не делать таких связей? Но это модель предметной области, в предметной области есть такие связи.
Вот видишь — ты сам признаешь что в любой нетривиальной системе (где есть one-to-really-many или другие сложные вещи) уже не работает DDD и надо что-то куда-то выносить.
Для того чтобы все не тормозило ты вынужден думать о том что и откуда ты загружаешь, увы. Хранилище пока что самая медленная часть любой системы.
То что ты называешь «напильником» по сути является не DDD, так как не соотвествует ни одному из его принципов
Про высокую производительность я не говорил, я говорю о достаточно производительности при мало-мальски серьезной нагрузке, когда нагружается один сервак средней руки.
Кроме того надо помнить о масштабируемости. Неоптимальные запросы, рождаемые DDD тормозят при десятках тысяч записей, просто выкидыванием DDD и небольшой оптимизацией запросов можно довести до ста тысяч с приемлимым быстродействием.
from s in ctx.Shipments
where s.Id == id
select s.Employee.Name
from s in ctx.Shipments
select new VievModel
{
ShipmentId = s.id,
ShipmentDate = s.Date,
ShipmentAddress = s.Address,
EmployeeName = s.Employee.Name
}
Если ты хочешь обратится к Employee.Name по Shipment.Id, то ты пишешь запрос:
from s in ctx.Shipments
where s.Order.Id = orderId
select s.id
public void ProcessShipment(int shipmentId)
public void ProcessShipment(ShipmentKey id)
class BusinessLogic
{
public int GetShipmentIdByOrderId(int orderId)
{
//И без реализации понятно что метод делает...
}
}
Вывод данных случается 95% времени и занимает 70% кода приложения
Это самая важная часть логики приложения, потому что при плохом выводе приложением невозможно пользоваться
Я прекрасно понимаю что для оптимизации DDD надо выкинуть, что я неоднократно делал во многих проектах. Это как раз не в пользу DDD аргумент ;)
Для пользователя нет никакой разницы что ты называешь бизнес-логикой, а что нет. Пользователь видит интерфейс программы, интерфейс плохой === программа плохая. DDD не позволяет сделать хороший интерфейс ибо все тормозит.
«А что если», Event Sourcing