Domain Model vs фичи языка C#

6yrop

Есть вот такая статья Файлера http://martinfowler.com/articles/dblogic.html
Основной поинт там в том, что Domain Model крута тем, что можно менять способы загрузки данных из БД, а код бизнес-логики остается почти неизменным.
Код у него на Ruby с кучей изменяемого состояния. А вот, как тот же Transaction Script на C#-е:

var customerID = DB.Customers.Single(_ => _.CompanyName == "test").CustomerID;
var result = (from _ in DB.Orders
where _.CustomerID == customerID
select new {
_.OrderID,
_.OrderDate
}).AsEnumerable
.Select(order => new {
order.OrderDate,
Lines = (from _ in DB.OrderDetails
where _.OrderID == order.OrderID
select new {
_.Quantity,
_.ProductID
}).AsEnumerable
}).Where(order => order.Lines.Where(_ => _.ProductID == 11)
.Sum(_ => _.Quantity) > 5000)
.Select(_ => _.OrderDate.Month)
.Distinct;

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

var customerID = DB.Customers.Single(_ => _.CompanyName == "test").CustomerID;
var orders = from _ in DB.Orders
where _.CustomerID == customerID
select new {
_.OrderID,
_.OrderDate
};
var orderDetails = (from _ in DB.OrderDetails
join order in orders on _.OrderID equals order.OrderID
select new {
_.Quantity,
_.ProductID,
order.OrderID
})
.ToLookup(_ => _.OrderID);
var result = orders.AsEnumerable
.Select(order => new {
order.OrderDate,
Lines = orderDetails[order.OrderID]
})
.Where(order => order.Lines.Where(_ => _.ProductID == 11)
.Sum(_ => _.Quantity) > 5000)
.Select(_ => _.OrderDate.Month)
.Distinct;

Получается вся эта мега архитектура Domain Model бьется методами ToLookup/ToDictionaty?

luna89

А этот linq запрос оттранслируется в один sql запрос или в n+1?

6yrop

А этот linq запрос оттранслируется в один sql запрос или в n+1?
Первый вариант в n+1, второй в два запроса: один по Orders, и один OrderDetails join Orders.
Возможно, тебе еще интересно, какой запрос выполнится если в первом варианте убрать первый AsEnumerable. Есть подозрение (пробовать лень что LINQ достаточно умный, чтобы выполнить один запрос, и потом правильно заполнить граф объектов. Но это уже сложная магия, я бы обходил ее стороной.

luna89

И он отлично переносит изменение способа загрузки.
Но зачем изменять способ загрузки?

6yrop

Но зачем изменять способ загрузки?
Это у него так в примере. Типа сначала написали n+1, потом выяснили, что производительность плохая.
В принципе, пох по какой причине изменения. Изменяться может всё, и по тысячи внешних и внутренних причин. На статически типизированном языке изменения можно поддерживать. Фаулеровский Ruby код сосет со страшной силой. Интересно, насколько лажает Фаулер, или это общая черта динамических языков...

luna89

Фаулеровский Ruby код сосет со страшной силой. Интересно, насколько лажает Фаулер, или это общая черта динамических языков...
Только на сосущих динамических PHP, Perl, Python и Ruby наклепали миллион сайтов, а весь из себя замечательный C# сам по себе никому не нужен (только как часть MS-стека).

6yrop

(только как часть MS-стека).
я бы сказал наоборот серверный MS-стек полное говно за исключением C# и SQL Server. Тем не менее, ASP.NET это вторая web-серверная платформа.

luna89

я бы сказал наоборот серверный MS-стек полное говно за исключением C#
А что, много кто использует mono под линуксом для вебдева?

6yrop

А что, много кто использует mono под линуксом для вебдева?
Хотел сам поподробнее узнать. Но, вроде как, оно отстает в плане реализации классов .NET Framewor-а, поэтому менее рискованно оставаться на Windows.
Ты думаешь от Windows сейчас что-нибудь осталось бы, не будь хорошего языка и SQL Server-а?

val63

Боже, ну и порнография у тебя в коде
Перепиши на ADO.NET пока никто не умер

kokoc88

Боже, ну и порнография у тебя в коде
Перепиши на ADO.NET пока никто не умер
Ещё один отстал года на четыре... :grin:

6yrop

Боже, ну и порнография у тебя в коде
Перепиши на ADO.NET пока никто не умер
ты ответил на пост с LINQ. Тебе не нравится запрос на LINQ? Для этого примера запрос на LINQ выглядит идеально.
Оставить комментарий
Имя или ник:
Комментарий: