DTO внутри BusinessObject
От: снежок Россия  
Дата: 11.12.06 13:32
Оценка:
Суть в том чтобы все get-ы и set-ы BO работали с DTO, а не приватными мемберами соответствующих свойств BO.
DTO представяет собой простую структуру (OrderDTO).
Плюсы очевидны:
+ BO не загромождены приватными членами свойств, код зрительно более приятный.
+ Не требуется (или минимальный) маппинг BO->DTO для передачи DTO сервисам и DataAccessLayer-у, так же отпадает необходимость реализации всяких criteria-паттернов (like criteria in CSLA.NET).

Вопрос:
А какие минусы или подводные камни у такого подхода?
Могут ли здесь возникнуть сложности при использовании mapper-helper-ов, того же BusinessToolKit-а?

    public struct OrderDTO
    {
        public int OrderID;
        public System.DateTime OrderDate;
    }


public class Order
    {
        private OrderDTO data;
        

    public System.DateTime OrderDate 
        {
            get 
            {
                return data.OrderDate;
            }
            set 
            {
                data.OrderDate = value;
            }
        }
}
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: DTO внутри BusinessObject
От: GlebZ Россия  
Дата: 11.12.06 14:27
Оценка:
Здравствуйте, снежок, Вы писали:

С>Плюсы очевидны:

С>+ BO не загромождены приватными членами свойств, код зрительно более приятный.
Не очень серъезный плюс. Код достаточно нагляден.
С>+ Не требуется (или минимальный) маппинг BO->DTO для передачи DTO сервисам и DataAccessLayer-у, так же отпадает необходимость реализации всяких criteria-паттернов (like criteria in CSLA.NET).
Обычно объекты хранятся в коллекциях. Какой тип будет у коллекций для DTO и для DAL?
Re[2]: DTO внутри BusinessObject
От: снежок Россия  
Дата: 12.12.06 08:08
Оценка:
С>>+ Не требуется (или минимальный) маппинг BO->DTO для передачи DTO сервисам и DataAccessLayer-у, так же отпадает необходимость реализации всяких criteria-паттернов (like criteria in CSLA.NET).
GZ>Обычно объекты хранятся в коллекциях. Какой тип будет у коллекций для DTO и для DAL?
Да, с передачей коллекций особый разговор.
Для данной схемы я исхожу из следующих требований/предположений:
-DAL работает только с DTO и понятия не имеет о BO.
-Сервисы отдают и получают также DTO, хотя в своем кеше хранят BO. При передачи/приеме сервисом DTO-объектов, DTO полученный/ отправляемый проходит через Security-фильтр. Происходит двусторонний маппинг (в соответствии с привелегиями) DTO клиента на DTO хранящемся в BO кеша сервиса. BO.DTO на стороне сервиса хранит полные данные. DTO предаваемый клиенту хранит только данные которые доступну клиенту в соответствии с его привелегиями.
Таким образом, достигается не только row-level и operation-level security, но и property-level security без необходимости инстацирования объектов на сервере по ссылке (MarchalByRef) или без необходимости Lazy-load.
-Что с коллекциями? — Как мне пока видится, это задача BO. BO хранит коллекцию DTO-объектов.

Как в данном случае передавать сервису иерархический объект?
-делать ли вызовы сервиса для каждого элемента коллекции, взяв его DTO для передачи (что извращает саму идею DTO как минимизация вызовов и трафика клиент<->сервис)?
-или сформировать массив DTO и предавать его как параметр [insertOrder(OrderDTO orderDTO, OrderItem[] orderItems)] (но тогда как быть с довольно разветвленными объектами, которых не мало)?
-или создавать отдельный класс для разветвленных DTO-объектов (но тогда ценность приведенного подхода "DTO внутри BO" оказывается сомнительной, поскольку опять приходим к маппингу BO->DTO)?

Все это те вопросы на которые я пока не нахожу для себя ответа, хотя сама идея, в общих чертах, мне нравится...

Спасибо.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 13.12.06 01:25
Оценка: +1
Здравствуйте, снежок, Вы писали:

С>Суть в том чтобы все get-ы и set-ы BO работали с DTO, а не приватными мемберами соответствующих свойств BO.


Я вот никогда не понимал, в чём вообще смысл разделения на DTO и BO? Потому что Фаулер так сказал?
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: DTO внутри BusinessObject
От: снежок Россия  
Дата: 13.12.06 06:29
Оценка:
Здравствуйте, IT, Вы писали:
IT>Я вот никогда не понимал, в чём вообще смысл разделения на DTO и BO? Потому что Фаулер так сказал?
Сокращение трафика, взаимодействие со сторонними сервисами, которые принимают данные по другой схеме чем та на которую завязывается собственная сериализация, чтобы ослабить связь между BO и DAL (иначе BO требует сборку DAL, а DAL требует сборку BO и кроме как динамической загрузкой сборок и фабрикой с синглетонами, или еще какими то хитрыми методами по типу динамических сборок, эту ситуацию не разрешить).
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 13.12.06 13:06
Оценка:
Здравствуйте, снежок, Вы писали:

С>Здравствуйте, IT, Вы писали:

IT>>Я вот никогда не понимал, в чём вообще смысл разделения на DTO и BO? Потому что Фаулер так сказал?
С>Сокращение трафика,

За счёт чего?

С>взаимодействие со сторонними сервисами, которые принимают данные по другой схеме чем та на которую завязывается собственная сериализация,


Для сторонних сервисов обычно пишутся агенты, которые работают по схеме DAL, только не для БД, а для стороннего сервиса.

С>чтобы ослабить связь между BO и DAL (иначе BO требует сборку DAL,


А это ещё с какой радости?

С>а DAL требует сборку BO и кроме как динамической загрузкой сборок и фабрикой с синглетонами, или еще какими то хитрыми методами по типу динамических сборок, эту ситуацию не разрешить).


Да уж. Видимо у нас разное понимание что такое BO и какие у него функции. Ну да ладно.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[4]: DTO внутри BusinessObject
От: снежок Россия  
Дата: 13.12.06 13:36
Оценка:
Здравствуйте, IT, Вы писали:

С>>Сокращение трафика,

IT>За счёт чего?
За счет того что не передаются ненужные данные. Например, если один BO ссылается на другой, то для такой ссылки передается идентификатор, а не весь граф объекта с прочей шелухой (наименования...). Я конечно понимаю что могут существовать различные схемы, например, собственная сериализация, но все это не так прозрачно...
С>>взаимодействие со сторонними сервисами, которые принимают данные по другой схеме чем та на которую завязывается собственная сериализация,
IT>Для сторонних сервисов обычно пишутся агенты, которые работают по схеме DAL, только не для БД, а для стороннего сервиса.
С>>чтобы ослабить связь между BO и DAL (иначе BO требует сборку DAL,
IT>А это ещё с какой радости?
Например, возьмем lazy load.
Если BO работает всегда только через сервисы, независимо от контектса приложения, обращается ли этот BO за данными находясь на клиенте или внутри сервиса, тогда вопрос "А это ещё с какой радости" правомерен.
Но если вы хотите максимально оптимизировать производительность и сократить цепочку вызовов, то находясь на клиенте BO обращается к сервисам, а находясь внутри сервиса BO обращается к DAL (не зачем сервису в данном случае обращаться самому к себе, происходит локальный вызов).
Определить контекст приложения и направить вызов сервису или DAL — дело сервисных агентов или в данном случае более уместно понятие ProxyAgent.
С>>а DAL требует сборку BO и кроме как динамической загрузкой сборок и фабрикой с синглетонами, или еще какими то хитрыми методами по типу динамических сборок, эту ситуацию не разрешить).
IT>Да уж. Видимо у нас разное понимание что такое BO и какие у него функции. Ну да ладно.
Мое понимание BO основывается на книге: Rockford Lhotka. C# Business Object
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: DTO внутри BusinessObject
От: varely  
Дата: 13.12.06 14:13
Оценка: +1
Здравствуйте, снежок, Вы писали:

IT>>Да уж. Видимо у нас разное понимание что такое BO и какие у него функции. Ну да ладно.

С>Мое понимание BO основывается на книге: Rockford Lhotka. C# Business Object

Мне, например, Lhotka не понравился...
Можешь посмотреть еще книги Eric Evans и Jimmi Nielsen (нажеюсь имена правильно пишу)по Domain-Driven Design. Просто в них описан не один подход (архиетктура), как в "C# Business Object", а несколько...
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[2]: DTO внутри BusinessObject
От: varely  
Дата: 13.12.06 14:13
Оценка:
Здравствуйте, IT, Вы писали:

IT>Я вот никогда не понимал, в чём вообще смысл разделения на DTO и BO? Потому что Фаулер так сказал?


Кстати, кто-то пробовал передавать по WCF дата контракты (DTO) содержащие классы наследованые от EditableObject?
Все хочется попробовать, да руки не дойдут...
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[6]: DTO внутри BusinessObject
От: снежок Россия  
Дата: 13.12.06 17:22
Оценка:
Здравствуйте, varely, Вы писали:
V>Просто в них описан не один подход (архиетктура), как в "C# Business Object", а несколько...
Подходов то, по пальцам пересчитать одной руки хватит...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: DTO внутри BusinessObject
От: EM Великобритания  
Дата: 01.01.07 16:08
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, снежок, Вы писали:


С>>Суть в том чтобы все get-ы и set-ы BO работали с DTO, а не приватными мемберами соответствующих свойств BO.


IT>Я вот никогда не понимал, в чём вообще смысл разделения на DTO и BO? Потому что Фаулер так сказал?



например сложности с сериализацией BO
Опыт — это такая вещь, которая появляется сразу после того, как была нужна...
Re[3]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 02.01.07 00:19
Оценка:
Здравствуйте, EM, Вы писали:

IT>>Я вот никогда не понимал, в чём вообще смысл разделения на DTO и BO? Потому что Фаулер так сказал?


EM>например сложности с сериализацией BO


Например?
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re: DTO внутри BusinessObject
От: Blazkowicz Россия  
Дата: 02.01.07 12:12
Оценка:
Здравствуйте, снежок, Вы писали:

С>Суть в том чтобы все get-ы и set-ы BO работали с DTO, а не приватными мемберами соответствующих свойств BO.

С>DTO представяет собой простую структуру (OrderDTO).
С>Плюсы очевидны:
С>+ BO не загромождены приватными членами свойств, код зрительно более приятный.
С>+ Не требуется (или минимальный) маппинг BO->DTO для передачи DTO сервисам и DataAccessLayer-у, так же отпадает необходимость реализации всяких criteria-паттернов (like criteria in CSLA.NET).

С>Вопрос:

С>А какие минусы или подводные камни у такого подхода?
С>Могут ли здесь возникнуть сложности при использовании mapper-helper-ов, того же BusinessToolKit-а?

Ни разу ещё не сталкивался с необходимостью выделять DTO в отдельную сущность. Данные находятся в том же классе где и свойства и нет никакого смысла их разделять.

В Java большинство (если не все) тулкиты справляются с частичной сериализацией. То есть если используется маппинг, то сериализуется только то что намаплено. Если используется сериализатор, то у него всегда есть средства указать какие поля или свойства не надо сериализовать.

Так же, мне кажется, что подобный подход немного нарушает инкапсуляцию слоев. Ведь DTO это интеграционный момент и он зависит от логики слоя интеграции. Тогда как слой бизгнес сущностей и бизнес логики должен быть максимально независим от внешних моментов.
Re[2]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 03.01.07 00:45
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Ни разу ещё не сталкивался с необходимостью выделять DTO в отдельную сущность.


Я тоже пока ни разу Но есть другие джависты, которые пишут книжки и пропагандируют в них свою точку зрения. А потом эти книжки читают дотнетчики и начинают задавать вот такие вопросы.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[3]: DTO внутри BusinessObject
От: Blazkowicz Россия  
Дата: 03.01.07 09:49
Оценка:
Здравствуйте, IT, Вы писали:

IT>Я тоже пока ни разу Но есть другие джависты, которые пишут книжки и пропагандируют в них свою точку зрения. А потом эти книжки читают дотнетчики и начинают задавать вот такие вопросы.


А можно поконкретнее кто именно? По-моему DTO ушли в небитие вместе с EJB2
Re[4]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 03.01.07 13:08
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

IT>>Я тоже пока ни разу Но есть другие джависты, которые пишут книжки и пропагандируют в них свою точку зрения. А потом эти книжки читают дотнетчики и начинают задавать вот такие вопросы.


B>А можно поконкретнее кто именно? По-моему DTO ушли в небитие вместе с EJB2


Как кто? Дядька Фаулер Ваших кровей, джавист
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[5]: DTO внутри BusinessObject
От: Blazkowicz Россия  
Дата: 03.01.07 13:27
Оценка:
Здравствуйте, IT, Вы писали:

IT>>>Я тоже пока ни разу Но есть другие джависты, которые пишут книжки и пропагандируют в них свою точку зрения. А потом эти книжки читают дотнетчики и начинают задавать вот такие вопросы.


B>>А можно поконкретнее кто именно? По-моему DTO ушли в небитие вместе с EJB2


IT>Как кто? Дядька Фаулер Ваших кровей, джавист


Да Фаулер. Да джавист. Да пишет про DTO. Но нет не могу согласится с тем что он особо его пропагандирует. Да есть такой паттерн. Да его можно использовать так-то.
"Patterns of Enterprise Application Architecture" опирается во многом на EJB2. Поэтому там про DTO подробно разжевано. Но мир-то изменяется. Уже появился материал вроде этого, который во многом пытается вскрыть недостатки DTO.
Re[6]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 03.01.07 13:35
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Да Фаулер. Да джавист. Да пишет про DTO. Но нет не могу согласится с тем что он особо его пропагандирует. Да есть такой паттерн. Да его можно использовать так-то.

B>"Patterns of Enterprise Application Architecture" опирается во многом на EJB2. Поэтому там про DTO подробно разжевано. Но мир-то изменяется. Уже появился материал вроде этого, который во многом пытается вскрыть недостатки DTO.

Меня не надо уговаривать. Я не понимал пользы от DTO ни до Фаулера, ни после
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[7]: DTO внутри BusinessObject
От: Blazkowicz Россия  
Дата: 03.01.07 13:57
Оценка:
Здравствуйте, IT, Вы писали:

IT>Меня не надо уговаривать.

Никто не уговаривает тебя его пользовать. Но отрицать факты что есть паттерн DTO и что у него есть своя ниша не имеет смысла.

IT>Я не понимал пользы от DTO ни до Фаулера, ни после

Счастливчик, ты не имел дело с говноспецификациями вроде EJB? По-моему существует ряд ситуаций, где вполне можно применить DTO. Но я сейчас не хочу высасывать примеры из пальца, так как реально с такой надобностью не сталкивался.
Re[8]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 03.01.07 14:02
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

IT>>Меня не надо уговаривать.

B>Никто не уговаривает тебя его пользовать. Но отрицать факты что есть паттерн DTO и что у него есть своя ниша не имеет смысла.

Я где-то утверждал обратное?

IT>>Я не понимал пользы от DTO ни до Фаулера, ни после

B>Счастливчик, ты не имел дело с говноспецификациями вроде EJB? По-моему существует ряд ситуаций, где вполне можно применить DTO. Но я сейчас не хочу высасывать примеры из пальца, так как реально с такой надобностью не сталкивался.

DTO очень просто превращаются в Business Entities. Казалось бы разница небольшая, но это уже совсем другое дело.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[9]: DTO внутри BusinessObject
От: Blazkowicz Россия  
Дата: 03.01.07 14:11
Оценка:
Здравствуйте, IT, Вы писали:

B>>Никто не уговаривает тебя его пользовать. Но отрицать факты что есть паттерн DTO и что у него есть своя ниша не имеет смысла.

IT>Я где-то утверждал обратное?

Да, в следующем же предложении.

IT>>>Я не понимал пользы от DTO ни до Фаулера, ни после

B>>Счастливчик, ты не имел дело с говноспецификациями вроде EJB? По-моему существует ряд ситуаций, где вполне можно применить DTO. Но я сейчас не хочу высасывать примеры из пальца, так как реально с такой надобностью не сталкивался.

IT>DTO очень просто превращаются в Business Entities. Казалось бы разница небольшая, но это уже совсем другое дело.


Это не всегда имеет смысл. Например у меня есть бизнес сущности покрывающие необходимую логику моего приложения. И мне надо заинтегрится с другой системой. Сущности которой имеют радикално отличную структуру от моей. Но тем неменее скалярные данные сходны. Мучать сериализаторы так чтобы трансформировать структуру бизнес сущностей может быть очень накладно. Поэтому решение сгенерить DTO и написать трансформацию одних классов в другие может быть более оптимальным.

То же самое и Фаулер пишет:

One case where it is useful to use something like a DTO is when you have a significant mismatch between the model in your presentation layer and the underlying domain model

Re[10]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 04.01.07 01:00
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

IT>>Я где-то утверждал обратное?

B>Да, в следующем же предложении.

Это где же

IT>>DTO очень просто превращаются в Business Entities. Казалось бы разница небольшая, но это уже совсем другое дело.


B>Это не всегда имеет смысл. Например у меня есть бизнес сущности покрывающие необходимую логику моего приложения.


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

B>И мне надо заинтегрится с другой системой. Сущности которой имеют радикално отличную структуру от моей. Но тем неменее скалярные данные сходны. Мучать сериализаторы так чтобы трансформировать структуру бизнес сущностей может быть очень накладно. Поэтому решение сгенерить DTO и написать трансформацию одних классов в другие может быть более оптимальным.


Этим должны заниматься мапперы. Ты предлагаешь из формата чуждого приложения всё перекладывать сначала в DTO, а уже затем в бизнес сущности. Учитывая, что у тебя структуры радикально отличные, саму задачу перевода данных из одного формата в другой тебе всё равно придётся мучать. С помощью сериализаторов, мапперов или вручную, без разницы. А если так, то один шаг здесь явно лишний.

B>То же самое и Фаулер пишет:

B>

B>One case where it is useful to use something like a DTO is when you have a significant mismatch between the model in your presentation layer and the underlying domain model

Здесь Фаулер пишет не о разных приложениях с радикально отличной структурой, а о разных лэйерах. Добиться significant mismatch в этом случае надо ещё постараться. Если же модели действительно столько различны, то нужен маппер для перевод одной модели в другую, а не DTO, подходящие по структуре к одной из моделей и опять же маппер для трансофрмации этих DTO в формат другого лэйера.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[11]: DTO внутри BusinessObject
От: Blazkowicz Россия  
Дата: 04.01.07 09:24
Оценка:
Здравствуйте, IT, Вы писали:

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


Если логика ограничена состоянием этой сущности, то в этой сущности логике самое место. В общем слишком категорично. Да и офтопик, можно просто продожить здесь
Автор: jburden
Дата: 19.07.06
.

IT>Этим должны заниматься мапперы. Ты предлагаешь из формата чуждого приложения всё перекладывать сначала в DTO, а уже затем в бизнес сущности. Учитывая, что у тебя структуры радикально отличные, саму задачу перевода данных из одного формата в другой тебе всё равно придётся мучать. С помощью сериализаторов, мапперов или вручную, без разницы. А если так, то один шаг здесь явно лишний.


IT>Здесь Фаулер пишет не о разных приложениях с радикально отличной структурой, а о разных лэйерах. Добиться significant mismatch в этом случае надо ещё постараться. Если же модели действительно столько различны, то нужен маппер для перевод одной модели в другую, а не DTO, подходящие по структуре к одной из моделей и опять же маппер для трансофрмации этих DTO в формат другого лэйера.


Со всеми доводами согласен. Не согласен только с твоей категоричностью. Так что тему можно дальше не развивать.
Re[12]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 04.01.07 14:53
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

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


B>Если логика ограничена состоянием этой сущности, то в этой сущности логике самое место. В общем слишком категорично.


Тогда хорошо бы разобраться с тем, что ты понимаешь под бизнес логикой

B>Да и офтопик, можно просто продожить здесь
Автор: jburden
Дата: 19.07.06
.


Участникам этого топика продолжение уже не интересно.

IT>>Этим должны заниматься мапперы. Ты предлагаешь из формата чуждого приложения всё перекладывать сначала в DTO, а уже затем в бизнес сущности. Учитывая, что у тебя структуры радикально отличные, саму задачу перевода данных из одного формата в другой тебе всё равно придётся мучать. С помощью сериализаторов, мапперов или вручную, без разницы. А если так, то один шаг здесь явно лишний.


IT>>Здесь Фаулер пишет не о разных приложениях с радикально отличной структурой, а о разных лэйерах. Добиться significant mismatch в этом случае надо ещё постараться. Если же модели действительно столько различны, то нужен маппер для перевод одной модели в другую, а не DTO, подходящие по структуре к одной из моделей и опять же маппер для трансофрмации этих DTO в формат другого лэйера.


B>Со всеми доводами согласен. Не согласен только с твоей категоричностью. Так что тему можно дальше не развивать.


При чём тут категоричность? Это выглядит, как будто ты не согласен с формой высказывания и из-за этого отрицаешь и само содержание.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[13]: DTO внутри BusinessObject
От: Blazkowicz Россия  
Дата: 04.01.07 15:10
Оценка:
Здравствуйте, IT, Вы писали:

B>>Если логика ограничена состоянием этой сущности, то в этой сущности логике самое место. В общем слишком категорично.


IT>Тогда хорошо бы разобраться с тем, что ты понимаешь под бизнес логикой


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


B>>Да и офтопик, можно просто продожить здесь
Автор: jburden
Дата: 19.07.06
.

IT>Участникам этого топика продолжение уже не интересно.
Ну, тогда продолжим здесь. Где по-твоему распологается бизнес логика и покакой причине ей не место в сущностях?
Re[14]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 04.01.07 18:24
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>>>Если логика ограничена состоянием этой сущности, то в этой сущности логике самое место. В общем слишком категорично.


IT>>Тогда хорошо бы разобраться с тем, что ты понимаешь под бизнес логикой


B>Почитал определение в википедии, ничего нового для себя не открыл, подразумеваю под бизнес логикой то же что и все.


Бизнес логика, и тем более её определение в википедии, вещь весьма размытая. Но вот то, что можно поместить в business entities имеет очень чёткие ограничения. По-этому я и спрашиваю.

B>И не вижу никаких проблем возникающих при помещении некоторой части этой логики в классы описывающие-бизнес сущности.


Я тоже не вижу. Вопрос только в определении некоторости. Скажу даже больше. Именно наличие логики отличает тупые DTO от business entities.

B>>>Да и офтопик, можно просто продожить здесь
Автор: jburden
Дата: 19.07.06
.

IT>>Участникам этого топика продолжение уже не интересно.
B>Ну, тогда продолжим здесь. Где по-твоему распологается бизнес логика и покакой причине ей не место в сущностях?

Бизнес логика, как общее понятие, распологается везде. В бизнес сущностях (опять же, если мы подразумеваем под этим понятием одно и тоже) не место логике, делающей эти сущности привязанными к другим частям системы. Впрочем, ты утверждаешь тоже самое. Так вот, теперь вернёмся немного назад. Вопрос. Зачем вообще нужны DTO как промежуточный тип контейнеров, если с этой задачей могут прекрасно справиться entitie? Где здесь логика? Может в неверно выбранном дизайне? Или я всё же чего-то не понимаю и действительно бывают случаи где DTO немерянно рулят?
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[15]: DTO внутри BusinessObject
От: Blazkowicz Россия  
Дата: 05.01.07 08:33
Оценка:
Здравствуйте, IT, Вы писали:

IT>Я тоже не вижу. Вопрос только в определении некоторости. Скажу даже больше. Именно наличие логики отличает тупые DTO от business entities.

Не только. Сущность может не содержать логики и при этом не быть DTO.

IT>Бизнес логика, как общее понятие, распологается везде. В бизнес сущностях (опять же, если мы подразумеваем под этим понятием одно и тоже) не место логике, делающей эти сущности привязанными к другим частям системы. Впрочем, ты утверждаешь тоже самое. Так вот, теперь вернёмся немного назад. Вопрос. Зачем вообще нужны DTO как промежуточный тип контейнеров, если с этой задачей могут прекрасно справиться entitie? Где здесь логика? Может в неверно выбранном дизайне?

В общем я не вижу смысла в продолжении дискуссии, так как мы с тобой высказываем одни и те же мысли разными словами.

IT>Или я всё же чего-то не понимаю и действительно бывают случаи где DTO немерянно рулят?

Ты их не видел, и я их не видел. Но ведь это не значит что их нет?
Re[16]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 05.01.07 13:47
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

IT>>Или я всё же чего-то не понимаю и действительно бывают случаи где DTO немерянно рулят?

B>Ты их не видел, и я их не видел. Но ведь это не значит что их нет?

Э, нет. В отличии от тебя, мне очень хочется на них посмотреть. Реально взглянуть и увидеть приносимую ими пользу. Пока же я вижу, от DTO никакой пользы нет и их использование является результатом архитектурных косяков. Если это не так, то кто-нибудь убедите меня в обратном.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[17]: DTO внутри BusinessObject
От: Blazkowicz Россия  
Дата: 05.01.07 14:04
Оценка:
Здравствуйте, IT, Вы писали:

IT>>>Или я всё же чего-то не понимаю и действительно бывают случаи где DTO немерянно рулят?

B>>Ты их не видел, и я их не видел. Но ведь это не значит что их нет?

IT>Э, нет. В отличии от тебя, мне очень хочется на них посмотреть. Реально взглянуть и увидеть приносимую ими пользу. Пока же я вижу, от DTO никакой пользы нет и их использование является результатом архитектурных косяков. Если это не так, то кто-нибудь убедите меня в обратном.


Поковырял J2EE паттерны . Имет ли смысл называть EJB2 архитектурным косяком? Спорный вопрос.

Так вот суть в том что уровень RPC и сериализации отдан полностью на откуп контейнера. И управлять сериализацией, в общем случае, никакого нормального средства нет. Вот тогда DTO и есть единственный нормальный способ трансформировать структуру бизнес сущностей в структуру оптимальную для общения с клиентом.

Кстати там есть интересный вариант "BusinessEntity inherits DTO". А вот первые четрые примера (6.1.1 — 6.2.1) поражают своей "лаконичностью".
Re[18]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 05.01.07 14:59
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Поковырял J2EE паттерны . Имет ли смысл называть EJB2 архитектурным косяком? Спорный вопрос.


Судя по тому, что ты пишешь ниже, действительно спорный.

B>Так вот суть в том что уровень RPC и сериализации отдан полностью на откуп контейнера. И управлять сериализацией, в общем случае, никакого нормального средства нет. Вот тогда DTO и есть единственный нормальный способ трансформировать структуру бизнес сущностей в структуру оптимальную для общения с клиентом.


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

B>Кстати там есть интересный вариант "BusinessEntity inherits DTO". А вот первые четрые примера (6.1.1 — 6.2.1) поражают своей "лаконичностью".


Мрачное зрелище.
Если нам не помогут, то мы тоже никого не пощадим.
Re[19]: DTO внутри BusinessObject
От: Blazkowicz Россия  
Дата: 05.01.07 15:20
Оценка:
Здравствуйте, IT, Вы писали:

IT>Значит ли это, что DTO как паттерн, закрывающий дырку в архитектуре одной из возможных систем должен теперь перекочёвывать в другие системы, где таких проблем нет?


Не значит. Но мы же не знаем какая у автора ситуация.
Re[20]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 05.01.07 15:34
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

IT>>Значит ли это, что DTO как паттерн, закрывающий дырку в архитектуре одной из возможных систем должен теперь перекочёвывать в другие системы, где таких проблем нет?


B>Не значит. Но мы же не знаем какая у автора ситуация.


Не знаем. Но знаем, что речь идёт как минимум о .NET, где реальных причин, озвученных тобой выше, для использования DTO пока не обнаружено. Вывод напрашивается сам собой.
Если нам не помогут, то мы тоже никого не пощадим.
Re[21]: DTO внутри BusinessObject
От: GlebZ Россия  
Дата: 07.01.07 11:02
Оценка: 49 (3)
Здравствуйте, IT, Вы писали:

IT>Не знаем. Но знаем, что речь идёт как минимум о .NET, где реальных причин, озвученных тобой выше, для использования DTO пока не обнаружено. Вывод напрашивается сам собой.

Oops. Извиняюсь что вмешиваюсь но что-то здесь не есть верно. Возьмем к примеру Microsoft practice&patterns
здесь здесь и здесь
Теперь к вопросу о DTO. Может быть вы их не использовали(или просто не замечали что использовали), а вот я использовал достаточно часто. Основная причины которые встречались мне:
1. За один вызов я должен вернуть/обработать объект состоящий из нескольких элементарных бизнес-объектов и снизить зависимость от латентности сети. Это наиболее частое использование DTO.
2. Скрытие некоторых не предназначенных для клиента данных. Эта тема уже поднималась на форумах. Не все данные бизнес-объектов должны быть доступны клиентам или должны быть доступны в режиме read-only. Усложняет архитектуру, и я бы не советовал использовать это без явных требований.
3. Структура используемая в сервере не может быть использована на клиенте. В основном такое встречается в statefull приложениях. Ну например, мне надо было сделать сложновычислимую задачу. Для того, чтобы вся эта шняга быстро вычислялась бизнес-объекты были связаны между собой прямыми указателями. Ессно, на клиенте бизнес-объекты должны быть связаны через идентификаторы. Это и обусловило разность типов на сервере и клиенте.
4. Кэширование. Размер полных бизнес-объектов был достаточно большой. Кэшировались только те части объекта которые наиболее часто используемы, а не полностью объект. Это сильно повысило эффективность кэша, но и обусловило построение управляемого DTO.
5. Независимость сервера. Достаточно редкая вещь. Было еще развивающееся решение когда внезапно поступило срочное требование интеграции чужого web-сервера. Решение также равивалось и по данным (то бишь по бизнес-объектам). Для того чтобы обеспечить независимость по данным был сделан слой DTO который отдавал данные в виде утвержденной сторонами XML.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re[2]: DTO внутри BusinessObject
От: remark Россия http://www.1024cores.net/
Дата: 07.01.07 14:29
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, снежок, Вы писали:


С>>Суть в том чтобы все get-ы и set-ы BO работали с DTO, а не приватными мемберами соответствующих свойств BO.


IT>Я вот никогда не понимал, в чём вообще смысл разделения на DTO и BO? Потому что Фаулер так сказал?


Это разные концептуальные сущности.
DTO — то, что между чем-то передаётся, BO — то, что внутри бизнес-логики.
Хотя на физическом уровне они могут быть очень похожи, это и понятно, т.к. информацию они представляют одинаковую. Поэтому получается палка о двух концах.
С одной стороны, либо ты даёшь этим двум концептуальным сущностям одно представление в программе, тогда получается меньше кода, причём кода "тупого", с другой стороны приходится затыкать щели типа следующих: в BO это вычисляемое значение хорошо бы закэшировать, а в DTO его, конечно, передавать не надо; в BO хорошо бы это значение хранить в миллисекундах, а в DTO его надо хранить в секундах и т.д.
С другой стороны, ты можешь честно дать этим двум сущностям два представления, и честно писать много "тупого" кода. Тогда можно совершенно "законно" изменять либо одно, либо второе представление. Этот вариант получается "чище".

Самые сложные уже вопросы: когда как делать? когда плюсы варианта перевесят минусы? и т.д.

Гипертрофированная аналогия на твой вопрос: вот у нас есть "треугольник", который характеризуется 3 точками, и есть "круг", который тоже характеризуется 3 точками. Зачем мы будем плодить сущности и писать лишний код — сделам на них один класс с 2 наборами функций, один работает как с треугольником, второй — как с кругом...



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[3]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 07.01.07 17:41
Оценка:
Здравствуйте, remark, Вы писали:

IT>>Я вот никогда не понимал, в чём вообще смысл разделения на DTO и BO? Потому что Фаулер так сказал?


R>Это разные концептуальные сущности.

R>DTO — то, что между чем-то передаётся, BO — то, что внутри бизнес-логики.

А зачем вообще нужно это разделение? По мне так оно выглядит очень натянуто.

R>Хотя на физическом уровне они могут быть очень похожи, это и понятно, т.к. информацию они представляют одинаковую. Поэтому получается палка о двух концах.

R>С одной стороны, либо ты даёшь этим двум концептуальным сущностям одно представление в программе, тогда получается меньше кода, причём кода "тупого", с другой стороны приходится затыкать щели типа следующих: в BO это вычисляемое значение хорошо бы закэшировать, а в DTO его, конечно, передавать не надо;

Решается элементарно атрибутами сериализации и/или маппинга.

R>в BO хорошо бы это значение хранить в миллисекундах, а в DTO его надо хранить в секундах и т.д.


Решается добавлением свойства предоставляющего информацию в секунда.

R>Самые сложные уже вопросы: когда как делать? когда плюсы варианта перевесят минусы? и т.д.


Пока что для меня очевидно следующее: DTO — это лишний и скорее всего ошибочый элемент в архитектуре системы.

R>Гипертрофированная аналогия на твой вопрос: вот у нас есть "треугольник", который характеризуется 3 точками, и есть "круг", который тоже характеризуется 3 точками. Зачем мы будем плодить сущности и писать лишний код — сделам на них один класс с 2 наборами функций, один работает как с треугольником, второй — как с кругом...

R>

Не, это аналогия на какой-то другой вопрос

R>
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[22]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 07.01.07 18:30
Оценка: 2 (1)
Здравствуйте, GlebZ, Вы писали:

IT>>Не знаем. Но знаем, что речь идёт как минимум о .NET, где реальных причин, озвученных тобой выше, для использования DTO пока не обнаружено. Вывод напрашивается сам собой.

GZ>Oops. Извиняюсь что вмешиваюсь но что-то здесь не есть верно. Возьмем к примеру Microsoft practice&patterns
GZ>здесь здесь и здесь

Microsoft practice & patterns хорошая пища для размышления, но не рукодство к действию. Например, те же датасеты в своё время тоже были поданы MS как решение всех наших проблем.

GZ>Теперь к вопросу о DTO. Может быть вы их не использовали(или просто не замечали что использовали), а вот я использовал достаточно часто.


Может быть. А может быть я их использовал ещё когда и названия такого не было. А когда назнвание им такое придумали, то я их уже не использовал. Т.е. получается, что действительно не использовал

GZ>Основная причины которые встречались мне:

GZ>1. За один вызов я должен вернуть/обработать объект состоящий из нескольких элементарных бизнес-объектов и снизить зависимость от латентности сети. Это наиболее частое использование DTO.

Есть какие-нибудь исследования по этому поводу? Например, насколько менее эффективно вернуть за одни запрос не 100 байт, а 150? А если подкрутить атрибуты сериализации? Или, например, что быстрее, передать 10000 объектов по 100 байт, по 150 байт, а подкрутить, а, в случае реальных проблем, организовать специализированный поток данных прямо из датаридера в объектную модель клиента, минуя ненужные этапы сериализации и, если уж ну очень большие проблемы, упаковывая поток перед отправкой? Кто-нибудь проводил такие тесты? Или 10% мнимого выигрыша стоят повсеместного дублирования кода?

GZ>2. Скрытие некоторых не предназначенных для клиента данных.


Не передавай их и всё. В чём проблема?

GZ>Эта тема уже поднималась на форумах. Не все данные бизнес-объектов должны быть доступны клиентам или должны быть доступны в режиме read-only. Усложняет архитектуру, и я бы не советовал использовать это без явных требований.


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

GZ>3. Структура используемая в сервере не может быть использована на клиенте. В основном такое встречается в statefull приложениях. Ну например, мне надо было сделать сложновычислимую задачу. Для того, чтобы вся эта шняга быстро вычислялась бизнес-объекты были связаны между собой прямыми указателями. Ессно, на клиенте бизнес-объекты должны быть связаны через идентификаторы. Это и обусловило разность типов на сервере и клиенте.


Как я понимаю здесь речь идёт о разных объектных моделях. Разные модели совершенно спокой стыкуются между собой по схеме Model1 -> Mapping -> Model2. Конечно можно залудить и Model1 -> Mapping1 -> DTO -> Mapping2 -> Model2, но какой смысл?

GZ>4. Кэширование. Размер полных бизнес-объектов был достаточно большой. Кэшировались только те части объекта которые наиболее часто используемы, а не полностью объект. Это сильно повысило эффективность кэша, но и обусловило построение управляемого DTO.


Не понял.

GZ>5. Независимость сервера. Достаточно редкая вещь. Было еще развивающееся решение когда внезапно поступило срочное требование интеграции чужого web-сервера. Решение также равивалось и по данным (то бишь по бизнес-объектам). Для того чтобы обеспечить независимость по данным был сделан слой DTO который отдавал данные в виде утвержденной сторонами XML.


Для таких вещей на стороне клиента пишутся (в терминологии MS) агенты. То же самое что DAL, только данные вычитываются не из датаридеров, а из формата внешней системы.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[23]: DTO внутри BusinessObject
От: GlebZ Россия  
Дата: 07.01.07 20:21
Оценка: 3 (1)
Здравствуйте, IT, Вы писали:

IT>Microsoft practice & patterns хорошая пища для размышления, но не рукодство к действию. Например, те же датасеты в своё время тоже были поданы MS как решение всех наших проблем.

Там есть политика где они напирают на определенные решения. Но неверных решений, по крайней мере с моей точки зрения, я не замечал.

GZ>>1. За один вызов я должен вернуть/обработать объект состоящий из нескольких элементарных бизнес-объектов и снизить зависимость от латентности сети. Это наиболее частое использование DTO.

IT>Есть какие-нибудь исследования по этому поводу? Например, насколько менее эффективно вернуть за одни запрос не 100 байт, а 150? А если подкрутить атрибуты сериализации? Или, например, что быстрее, передать 10000 объектов по 100 байт, по 150 байт, а подкрутить, а, в случае реальных проблем, организовать специализированный поток данных прямо из датаридера в объектную модель клиента, минуя ненужные этапы сериализации и, если уж ну очень большие проблемы, упаковывая поток перед отправкой? Кто-нибудь проводил такие тесты? Или 10% мнимого выигрыша стоят повсеместного дублирования кода?
Ты не понял написанного. Я говорю именно о кол-ве вызовов и латентности сети. Поясню для примера. Есть у нас задача получить документ с реквизитами и прикрепленными файлами. Можно раздельно вызвать функцию получить документ, а потом функцию получить тот или иной реквизит не входящий в бизнес-объект а потом функцию с файлами. А можно вызвать одну функцию которая возвращает все вышесказанное но в виде единого объекта. И именно этот единый объект (который представляет собой некоторое дерево бизнес-объектов) и есть Data Transfer Object.

GZ>>2. Скрытие некоторых не предназначенных для клиента данных.

IT>Не передавай их и всё. В чём проблема?
Именно для этого и делается некоторый презентационный слой который генерит DTO для клиента.

GZ>>Эта тема уже поднималась на форумах. Не все данные бизнес-объектов должны быть доступны клиентам или должны быть доступны в режиме read-only. Усложняет архитектуру, и я бы не советовал использовать это без явных требований.

IT>О каких клиентах идёт речь? О своих собственных? Тогда это уже, простите, паранойя. Если же речь идёт о клиентах, которые ещё не написаны и будут написаны не нами, то разработка такого интерфейса — это сама по себе отдельная задача и то, что в результате будет использоваться та же объектная модель совсем не факт. Скорее всего вообще будет использоваться XML.
Прекрасно. И эта задача называется создание DTO.

GZ>>3. Структура используемая в сервере не может быть использована на клиенте. В основном такое встречается в statefull приложениях. Ну например, мне надо было сделать сложновычислимую задачу. Для того, чтобы вся эта шняга быстро вычислялась бизнес-объекты были связаны между собой прямыми указателями. Ессно, на клиенте бизнес-объекты должны быть связаны через идентификаторы. Это и обусловило разность типов на сервере и клиенте.

IT>Как я понимаю здесь речь идёт о разных объектных моделях. Разные модели совершенно спокой стыкуются между собой по схеме Model1 -> Mapping -> Model2. Конечно можно залудить и Model1 -> Mapping1 -> DTO -> Mapping2 -> Model2, но какой смысл?
Это была вынужденная мера.
Давай посмотрим а что такое программная система со слоями и DTO. Программная система — это некоторая трансформация между слоем данных вплоть до формы доступной пользользователю и в обратную сторону. DTO — это всего лишь частный случай выделенный в отдельный паттерн в силу некоторых доп. условий. DTO — есть трансформация модели бизнес-объектов между сервером и клиентом. Она концептуально отличается от других трансформаций так как на нее налагаются требования по пересылке между процессами. Если мы на клиенте можем выдержать полную модель поддерживаемую на сервере — прекрасно. Значит на реализацию DTO мы не прилагаем усилий, и оно реализуется стандартными средсвами сериализации. Если это неэффективно или например, невозможно сделать, тут мы вспоминаем о таковом паттерне.(или же не догадываясь об этом, реализуем его-же ).

GZ>>4. Кэширование. Размер полных бизнес-объектов был достаточно большой. Кэшировались только те части объекта которые наиболее часто используемы, а не полностью объект. Это сильно повысило эффективность кэша, но и обусловило построение управляемого DTO.

IT>Не понял.
Существует некоторый бизнес-объект который в полной мере содержит пару десятков килобайт данных. На сервере все работает прекрасно, так как там нет хранения состояния как такового. После каждого запроса состояние теряется, и соответсвенно сервер достаточно масштабируем. Но также есть клиент в котором для повышения эффективности есть некоторая система кэширования. Хранить полный объект в кэше — достаточно накладно (поскольку в роли клиента выступает web-сервер). Соответвенно, для того чтобы повысить эффективность, модель работы изменена. Есть объекты в своей полной сущности (то бишь пару десятков килобайт), а есть объекты в которых собраны наиболее часто используемые и важные поля. И кэшируются не полные объекты, а именно маленькие объекты. Соответвенно нагрузка на память была снята. Была также снята некоторая нагрузка на пересылку данных, но на фоне повышения эффективности кэша это было не так уж важно.

GZ>>5. Независимость сервера. Достаточно редкая вещь. Было еще развивающееся решение когда внезапно поступило срочное требование интеграции чужого web-сервера. Решение также равивалось и по данным (то бишь по бизнес-объектам). Для того чтобы обеспечить независимость по данным был сделан слой DTO который отдавал данные в виде утвержденной сторонами XML.

IT>Для таких вещей на стороне клиента пишутся (в терминологии MS) агенты. То же самое что DAL, только данные вычитываются не из датаридеров, а из формата внешней системы.
Повторюсь. Данный клиент не наш. Он вообще был на чистом ASP. Для того чтобы отметелиться от зависимости к ним, и развиваться независимо этому клиенту и соорудили определенный свой формат. Формат между сервером и нормальным клиентом продолжал развиваться независимо по мере реализации других требований.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re[24]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 07.01.07 21:06
Оценка: 1 (1)
Здравствуйте, GlebZ, Вы писали:

IT>>Microsoft practice & patterns хорошая пища для размышления, но не рукодство к действию. Например, те же датасеты в своё время тоже были поданы MS как решение всех наших проблем.

GZ>Там есть политика где они напирают на определенные решения. Но неверных решений, по крайней мере с моей точки зрения, я не замечал.

Это смотря что подразумевать под неверностью. Неоптимальное, избыточное решение тоже можно назвать неверным.

GZ>Ты не понял написанного.


Гы-гы. Конечно не понял. У меня таких проблемм с бизнес сущностями никогда не было. Надо передавать по отдельности — передаём по отдельности, надо всё вместе — передаём всё вместе.

GZ>Я говорю именно о кол-ве вызовов и латентности сети. Поясню для примера. Есть у нас задача получить документ с реквизитами и прикрепленными файлами. Можно раздельно вызвать функцию получить документ, а потом функцию получить тот или иной реквизит не входящий в бизнес-объект а потом функцию с файлами. А можно вызвать одну функцию которая возвращает все вышесказанное но в виде единого объекта. И именно этот единый объект (который представляет собой некоторое дерево бизнес-объектов) и есть Data Transfer Object.


Entity точно так же может представлять дерево. Не вижу абсолютно никакой разницы.

GZ>>>2. Скрытие некоторых не предназначенных для клиента данных.

IT>>Не передавай их и всё. В чём проблема?
GZ>Именно для этого и делается некоторый презентационный слой который генерит DTO для клиента.

Т.е. если тебе надо передать 5 полей, то для этого ты заведёшь DTO с 5-ю полями, если 6, то с 6-ю и так для всех 50-ти полей? Согласись, это полная чушь.

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

GZ>Прекрасно. И эта задача называется создание DTO.

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

IT>>Как я понимаю здесь речь идёт о разных объектных моделях. Разные модели совершенно спокой стыкуются между собой по схеме Model1 -> Mapping -> Model2. Конечно можно залудить и Model1 -> Mapping1 -> DTO -> Mapping2 -> Model2, но какой смысл?

GZ>Это была вынужденная мера.

Чем вынужденная?

GZ>Давай посмотрим а что такое программная система со слоями и DTO. Программная система — это некоторая трансформация между слоем данных вплоть до формы доступной пользользователю и в обратную сторону. DTO — это всего лишь частный случай выделенный в отдельный паттерн в силу некоторых доп. условий. DTO — есть трансформация модели бизнес-объектов между сервером и клиентом. Она концептуально отличается от других трансформаций так как на нее налагаются требования по пересылке между процессами. Если мы на клиенте можем выдержать полную модель поддерживаемую на сервере — прекрасно. Значит на реализацию DTO мы не прилагаем усилий, и оно реализуется стандартными средсвами сериализации. Если это неэффективно или например, невозможно сделать, тут мы вспоминаем о таковом паттерне.(или же не догадываясь об этом, реализуем его-же ).


Ещё раз. Система, построенная на базе лёгких объектов (business entities) не нуждается в дополнительных транпортных объектах, т.к. с точки зрения транспорта такие объяты этими самыми DTO и являются. А с точки зрения объектной модели приложения, если не заниматься такими глупостяими как stateful и person.Save(), то BE ничем не хуже всего остального. В результате, при наличии различий в объектых моделей, лишнее переливание из пустого в порожнее не имеет никакого смысла. Можно сразу делать Model1 -> Mapping -> Model2.

GZ>>>4. Кэширование. Размер полных бизнес-объектов был достаточно большой. Кэшировались только те части объекта которые наиболее часто используемы, а не полностью объект. Это сильно повысило эффективность кэша, но и обусловило построение управляемого DTO.

IT>>Не понял.
GZ>Существует некоторый бизнес-объект который в полной мере содержит пару десятков килобайт данных. На сервере все работает прекрасно, так как там нет хранения состояния как такового. После каждого запроса состояние теряется, и соответсвенно сервер достаточно масштабируем. Но также есть клиент в котором для повышения эффективности есть некоторая система кэширования. Хранить полный объект в кэше — достаточно накладно (поскольку в роли клиента выступает web-сервер). Соответвенно, для того чтобы повысить эффективность, модель работы изменена. Есть объекты в своей полной сущности (то бишь пару десятков килобайт), а есть объекты в которых собраны наиболее часто используемые и важные поля. И кэшируются не полные объекты, а именно маленькие объекты. Соответвенно нагрузка на память была снята. Была также снята некоторая нагрузка на пересылку данных, но на фоне повышения эффективности кэша это было не так уж важно.

Всё равно не понял. Какое это имеет отношение к DTO? Если у тебя уже есть маленькие объекты, которые ты кешируешь, ну так и гоняй их туда сюда. В чем проблема?

IT>>Для таких вещей на стороне клиента пишутся (в терминологии MS) агенты. То же самое что DAL, только данные вычитываются не из датаридеров, а из формата внешней системы.

GZ>Повторюсь. Данный клиент не наш. Он вообще был на чистом ASP. Для того чтобы отметелиться от зависимости к ним, и развиваться независимо этому клиенту и соорудили определенный свой формат. Формат между сервером и нормальным клиентом продолжал развиваться независимо по мере реализации других требований.

Я тоже повторюсь. DTO, как затыкание косяков, может оказаться вполне оправданной вещью. Только давай отдавать себе отчёт, что косяк он и есть косяк. В вашем случае — это использование дремучего ASP. Стоит переписать всё на ASP.NET и необходимость в DTO моментально отпадёт.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[4]: DTO внутри BusinessObject
От: remark Россия http://www.1024cores.net/
Дата: 08.01.07 09:56
Оценка:
Здравствуйте, IT, Вы писали:

IT>Решается элементарно атрибутами сериализации и/или маппинга.

IT>Решается добавлением свойства предоставляющего информацию в секунда.
IT>Пока что для меня очевидно следующее: DTO — это лишний и скорее всего ошибочый элемент в архитектуре системы.


Я там видел вы там ниже с Blazkowicz обсуждали — вы говорили про net/java и сериализацию в строки. А если поглядеть шире — например передача объекта через corba/com, структура для передачи (фактически DTO) нужна по определению, и что ты предлагаешь не делать BO, а использовать везде это DTO
Или если например говрить о interop между языками c/c++/pascal/asm и т.д. — использовать в качестве BO объекты, которые можно передавать между языками — сомнительно...

Поэтому я и говорю, что надо смотреть по ситуации — где-то примерение DTO может показаться излишним (net/java и сериализацию в строки), ну тогда можно его и не применять. В каких-то же ситуациях его применение может быть более целесообразным...

R>>


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[3]: DTO внутри BusinessObject
От: Mika Soukhov Stock#
Дата: 08.01.07 17:23
Оценка: 12 (1) +1
Здравствуйте, remark, Вы писали:

С>>>Суть в том чтобы все get-ы и set-ы BO работали с DTO, а не приватными мемберами соответствующих свойств BO.


IT>>Я вот никогда не понимал, в чём вообще смысл разделения на DTO и BO? Потому что Фаулер так сказал?


R>Это разные концептуальные сущности.

R>DTO — то, что между чем-то передаётся, BO — то, что внутри бизнес-логики.

Фаулер, Файлер. Устранил ряд непониманий, ввел новые. Система должна оперировать сущностями (objects, entities). Система может быть разбита на составляющие. Логика может быть реализована с переходом по этим составляющим (см. документооборот). Что в данном случае использовать, DTO или BO? Или нужно смотреть под разным углом на данные, со стороны бизнес логики, или системных нужн (data transferring)?

Лично я для себя давно уже решил, что проще понятия DTO и BO слить в одно — описание данных. В таком случае отпадает проблема как транспортировки данных (не ООП-структуры очень хорошо перегоняются через границы процессов), как маппинга данных (тоже самое что и передача данных, так как маппинг и сериализация из одного теста вылеплены), так и манипулирования данных (никаких проблем с кэшами и погрузкой по необходимости, так как все контролируется нами и не чёрти какими недо-мапперами). А переконвертация одного в другое и наоборот только добавляет лишней головной боли.
Re[25]: DTO внутри BusinessObject
От: GlebZ Россия  
Дата: 09.01.07 10:57
Оценка: 1 (1)
Здравствуйте, IT, Вы писали:

IT>Это смотря что подразумевать под неверностью. Неоптимальное, избыточное решение тоже можно назвать неверным.

Паттерны также описывают показания к применению.

GZ>>Я говорю именно о кол-ве вызовов и латентности сети. Поясню для примера. Есть у нас задача получить документ с реквизитами и прикрепленными файлами. Можно раздельно вызвать функцию получить документ, а потом функцию получить тот или иной реквизит не входящий в бизнес-объект а потом функцию с файлами. А можно вызвать одну функцию которая возвращает все вышесказанное но в виде единого объекта. И именно этот единый объект (который представляет собой некоторое дерево бизнес-объектов) и есть Data Transfer Object.

IT>Entity точно так же может представлять дерево. Не вижу абсолютно никакой разницы.
По крайней мере Entity нужно собирать в некоторое дерево. И дерево это всегда такое-же как оно работает на серваке. Это уже механизм.

GZ>>>>2. Скрытие некоторых не предназначенных для клиента данных.

IT>>>Не передавай их и всё. В чём проблема?
GZ>>Именно для этого и делается некоторый презентационный слой который генерит DTO для клиента.
IT>Т.е. если тебе надо передать 5 полей, то для этого ты заведёшь DTO с 5-ю полями, если 6, то с 6-ю и так для всех 50-ти полей? Согласись, это полная чушь.
Не понял Причем тут это??? Пункт 1 перечитай. А здесь просто бизнес-объект передаваемый на клиента неэквивалентен бизнес-объекту на серваке.

IT>Называй это как угодно, только не завбывай добавлять, что процент задач, где это действительно нужно, от общего числа трудно разглядеть даже в микроскоп.

У меня это процентов 90. Документооборот — эта такая штука в которой очень много слабоструктурированной информации.

GZ>>Это была вынужденная мера.

IT>Чем вынужденная?
Потому что ссылка в оперативной памяти не передается через сеть.

GZ>>Давай посмотрим а что такое программная система со слоями и DTO. Программная система — это некоторая трансформация между слоем данных вплоть до формы доступной пользользователю и в обратную сторону. DTO — это всего лишь частный случай выделенный в отдельный паттерн в силу некоторых доп. условий. DTO — есть трансформация модели бизнес-объектов между сервером и клиентом. Она концептуально отличается от других трансформаций так как на нее налагаются требования по пересылке между процессами. Если мы на клиенте можем выдержать полную модель поддерживаемую на сервере — прекрасно. Значит на реализацию DTO мы не прилагаем усилий, и оно реализуется стандартными средсвами сериализации. Если это неэффективно или например, невозможно сделать, тут мы вспоминаем о таковом паттерне.(или же не догадываясь об этом, реализуем его-же ).

IT>Ещё раз. Система, построенная на базе лёгких объектов (business entities) не нуждается в дополнительных транпортных объектах, т.к. с точки зрения транспорта такие объяты этими самыми DTO и являются. А с точки зрения объектной модели приложения, если не заниматься такими глупостяими как stateful и person.Save(), то BE ничем не хуже всего остального. В результате, при наличии различий в объектых моделей, лишнее переливание из пустого в порожнее не имеет никакого смысла. Можно сразу делать Model1 -> Mapping -> Model2.
Ну давай попробую описать по другому. Что такое Data Transfer Object. Когда клиент работает с серваком по некоторому контракту. Контракт — это инертефейс вызовов и получаемые или отсылаемые данные. Данные, они же бизнес-объекты, на сервере лежат в виде экземпляров объектов связанные по ссылкам, что при переливе на клиент сделать невозможно. Для перелива на клиент нужно как минимум сформировать из объектов stream. То есть создать Data Transfer Object которые можно передать в другой процесс. Во многих случаях, это делается стандартными средствами сериализации, и мы не особо задумываемся о том, что это есть DTO. Обычно мы их так не называем, так как наши умственные и физические трудозатраты минимальны. Но существуют случаи, когда это или неэффективно, или невозможно сделать. Когда объекты для перелива не совсем равнозначны бизнес-объектам сервера. Тогда приходится уже придумывать механизм формирования DTO, и мы вспоминаем про данный паттерн как таковой. Случаи когда приходилось мне это делать (а в действительности мне чаще именно и приходилось думать над DTO в силу специфики предметной области) я уже описал.здесь
Автор: GlebZ
Дата: 07.01.07


IT>Всё равно не понял. Какое это имеет отношение к DTO? Если у тебя уже есть маленькие объекты, которые ты кешируешь, ну так и гоняй их туда сюда. В чем проблема?

Сервак по внутренней логике не работает с маленькими объектами. Набор полей используемый в серверной логике и на клиентской стороне сильно различается.

IT>Я тоже повторюсь. DTO, как затыкание косяков, может оказаться вполне оправданной вещью. Только давай отдавать себе отчёт, что косяк он и есть косяк. В вашем случае — это использование дремучего ASP. Стоит переписать всё на ASP.NET и необходимость в DTO моментально отпадёт.

Ага. Здоровски. Предлагаешь попросить клиента переписать свою систему которую они строили много лет?
Re[26]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 09.01.07 14:05
Оценка: 1 (1) -1
Здравствуйте, GlebZ, Вы писали:

IT>>Это смотря что подразумевать под неверностью. Неоптимальное, избыточное решение тоже можно назвать неверным.

GZ>Паттерны также описывают показания к применению.

Я надеюсь, тебе не нужно объяснять, что безграмотное использование паттернов легко превращает их в антипаттерны? Тот же паттерн DTO великолепно это демонстрирует.

IT>>Entity точно так же может представлять дерево. Не вижу абсолютно никакой разницы.

GZ>По крайней мере Entity нужно собирать в некоторое дерево. И дерево это всегда такое-же как оно работает на серваке. Это уже механизм.

И в чём проблема?

GZ>>>>>2. Скрытие некоторых не предназначенных для клиента данных.

IT>>>>Не передавай их и всё. В чём проблема?
GZ>>>Именно для этого и делается некоторый презентационный слой который генерит DTO для клиента.
IT>>Т.е. если тебе надо передать 5 полей, то для этого ты заведёшь DTO с 5-ю полями, если 6, то с 6-ю и так для всех 50-ти полей? Согласись, это полная чушь.
GZ>Не понял Причем тут это??? Пункт 1 перечитай. А здесь просто бизнес-объект передаваемый на клиента неэквивалентен бизнес-объекту на серваке.

Не понял что? Что сам написал? Пунк 1 мы уже разобрали выше. Здесь мы как раз выясняем почему БО, передаваемый на клиента должен обязательно неэквивалентен БД на сервере. В частности, я утверждаю, что при дизайне, с самого начала учитывающем возможность одновременного использование одних и тех же объектов на всех слоях, этого всего не надо.

IT>>Называй это как угодно, только не завбывай добавлять, что процент задач, где это действительно нужно, от общего числа трудно разглядеть даже в микроскоп.

GZ>У меня это процентов 90. Документооборот — эта такая штука в которой очень много слабоструктурированной информации.

Т.е. у тебя всё построено на веб-сервисах и ремоутингах? Всего лишь 10% обычной логики, а остальное всё комуникация? Странно И что такого в документообороте, что его делает столько нетрадиционной задачей?

GZ>>>Это была вынужденная мера.

IT>>Чем вынужденная?
GZ>Потому что ссылка в оперативной памяти не передается через сеть.

Ссылку и не надо передавать. Она потом будет восстановлена сериализатором.

GZ>Ну давай попробую описать по другому. Что такое Data Transfer Object. Когда клиент работает с серваком по некоторому контракту. Контракт — это инертефейс вызовов и получаемые или отсылаемые данные.


Я в курсе что такое DTO и что такое таконтракт. Меня интересуют примеры оправданного применения DTO. Не затыкание дырок, не обстрактные разговоры о специфике предметной области и правильности выбранного дизайна кем-либо в каком-либо конкретном случае, а толковые примеры, когда без DTO никуда.

GZ>Данные, они же бизнес-объекты, на сервере лежат в виде экземпляров объектов связанные по ссылкам, что при переливе на клиент сделать невозможно.


У тебя там stateful что ли? Ну так бы сразу и сказал

GZ>Для перелива на клиент нужно как минимум сформировать из объектов stream. То есть создать Data Transfer Object которые можно передать в другой процесс. Во многих случаях, это делается стандартными средствами сериализации, и мы не особо задумываемся о том, что это есть DTO. Обычно мы их так не называем, так как наши умственные и физические трудозатраты минимальны. Но существуют случаи, когда это или неэффективно, или невозможно сделать. Когда объекты для перелива не совсем равнозначны бизнес-объектам сервера. Тогда приходится уже придумывать механизм формирования DTO, и мы вспоминаем про данный паттерн как таковой. Случаи когда приходилось мне это делать (а в действительности мне чаще именно и приходилось думать над DTO в силу специфики предметной области) я уже описал.здесь
Автор: GlebZ
Дата: 07.01.07


Глеб, ты меня извини, но разговоры о специфичности предметной области лично мне ничего не доказывают. У меня таких специфичных задач было мильён. При изначальном дизайне, ориентированном на отсутствие всяких промежуточных DTO, потребность в них возникала только в случае затыкания каких-нибудь дыр. А то, что ты привёл по ссылке мы уже разобрали и пока реальной необходимости в DTO там не нашли.

IT>>Всё равно не понял. Какое это имеет отношение к DTO? Если у тебя уже есть маленькие объекты, которые ты кешируешь, ну так и гоняй их туда сюда. В чем проблема?

GZ>Сервак по внутренней логике не работает с маленькими объектами. Набор полей используемый в серверной логике и на клиентской стороне сильно различается.

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

IT>>Я тоже повторюсь. DTO, как затыкание косяков, может оказаться вполне оправданной вещью. Только давай отдавать себе отчёт, что косяк он и есть косяк. В вашем случае — это использование дремучего ASP. Стоит переписать всё на ASP.NET и необходимость в DTO моментально отпадёт.

GZ>Ага. Здоровски. Предлагаешь попросить клиента переписать свою систему которую они строили много лет?

Твои клинты с их проблемами меня мало интересуют. У меня своих полно. От тебя же здесь нужно всего лишь осознание того, что конкретно в этой ситуации DTO как раз являются вынужденной мерой ака затычкой в дизайне. Именно это я и пытаюсь до тебя донести. Пойми, я не против DTO как паттерна. Я лишь против того, что это хороший паттерн. По моему, теперь уже глубочайшему убеждению, наличие в системе DTO говорит лишь о том, что в дизайне этой системы есть проблемы. Убеждать меня в обратном абстрактными разговорами об уникальности свой предметной области не надо. А вот конкретные примеры, ещё лучше с кусочками кода, я бы с удовольствием посмотрел. А затем мы вместе бы разобрали можно ли там было обойтись без DTO или нет.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[27]: DTO внутри BusinessObject
От: GlebZ Россия  
Дата: 09.01.07 15:56
Оценка:
Здравствуйте, IT, Вы писали:

IT>Я надеюсь, тебе не нужно объяснять, что безграмотное использование паттернов легко превращает их в антипаттерны? Тот же паттерн DTO великолепно это демонстрирует.

Повторю еще раз. Паттерны также описывают показания к применению. Паттерн рассказывает не только как применять, но и где применять.

IT>>>Entity точно так же может представлять дерево. Не вижу абсолютно никакой разницы.

GZ>>По крайней мере Entity нужно собирать в некоторое дерево. И дерево это всегда такое-же как оно работает на серваке. Это уже механизм.
IT>И в чём проблема?
Да ни в чем. Сделать некоторую штуку которое маппирует/собирает данные из БО в DTO не так уж сложно.

GZ>>>>>>2. Скрытие некоторых не предназначенных для клиента данных.

IT>>>>>Не передавай их и всё. В чём проблема?
GZ>>>>Именно для этого и делается некоторый презентационный слой который генерит DTO для клиента.
IT>>>Т.е. если тебе надо передать 5 полей, то для этого ты заведёшь DTO с 5-ю полями, если 6, то с 6-ю и так для всех 50-ти полей? Согласись, это полная чушь.
GZ>>Не понял Причем тут это??? Пункт 1 перечитай. А здесь просто бизнес-объект передаваемый на клиента неэквивалентен бизнес-объекту на серваке.
IT>Не понял что? Что сам написал? Пунк 1 мы уже разобрали выше.
Пункт 1 — это применение некоторого подграфа вместо набора полей. К данному вопросу вышеописанное тобой отношение не имеет.

IT>Здесь мы как раз выясняем почему БО, передаваемый на клиента должен обязательно неэквивалентен БД на сервере.

Почему обязательно? Я описал именно показание когда его нужно делать.

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

Когда тебя обязали хранить в той-же таблице кто и когда создавал/изменял объект, а у пользователя может и не быть прав на просмотр аудита что ты будешь делать?

IT>>>Называй это как угодно, только не завбывай добавлять, что процент задач, где это действительно нужно, от общего числа трудно разглядеть даже в микроскоп.

GZ>>У меня это процентов 90. Документооборот — эта такая штука в которой очень много слабоструктурированной информации.
IT>Т.е. у тебя всё построено на веб-сервисах и ремоутингах? Всего лишь 10% обычной логики, а остальное всё комуникация? Странно И что такого в документообороте, что его делает столько нетрадиционной задачей?
Типы документов и справочников создаются пользователем в процессе эксплуатации.

GZ>>>>Это была вынужденная мера.

IT>>>Чем вынужденная?
GZ>>Потому что ссылка в оперативной памяти не передается через сеть.
IT>Ссылку и не надо передавать. Она потом будет восстановлена сериализатором.
Если она нужна. Один и тот же объект может передаваться разными интерфейсами в различных интерпретациях.

IT>У тебя там stateful что ли? Ну так бы сразу и сказал

Нет. Всегда делал stateless. Но в том задании была числодробилка и надо было строить граф который быстро работает. А это провязка ссылками так как по идентификатору тормозит.

IT>Глеб, ты меня извини, но разговоры о специфичности предметной области лично мне ничего не доказывают. У меня таких специфичных задач было мильён. При изначальном дизайне, ориентированном на отсутствие всяких промежуточных DTO, потребность в них возникала только в случае затыкания каких-нибудь дыр. А то, что ты привёл по ссылке мы уже разобрали и пока реальной необходимости в DTO там не нашли.

Извини, но по моему ты не совсем понял что-же там было написано. Или все же не понял что-же такое DTO.

IT>Я уже сто раз говорил, что проблема согласования объектных моделей решается не с помощью DTO, а с помощью мапперов.

А DTO в 90 процентов случаев и генерится маппером.

IT>Твои клинты с их проблемами меня мало интересуют. У меня своих полно. От тебя же здесь нужно всего лишь осознание того, что конкретно в этой ситуации DTO как раз являются вынужденной мерой ака затычкой в дизайне. Именно это я и пытаюсь до тебя донести. Пойми, я не против DTO как паттерна. Я лишь против того, что это хороший паттерн.

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

IT>По моему, теперь уже глубочайшему убеждению, наличие в системе DTO говорит лишь о том, что в дизайне этой системы есть проблемы. Убеждать меня в обратном абстрактными разговорами об уникальности свой предметной области не надо. А вот конкретные примеры, ещё лучше с кусочками кода, я бы с удовольствием посмотрел. А затем мы вместе бы разобрали можно ли там было обойтись без DTO или нет.

Нет. Свои не дам. Недавно сменил работу, а теперешний не могу. Да и разработано многое в нынешнем проекте не мной. А вот к примеру Janus — весьма интересен. Фактически набор в DataSet получаемый с сервера, и набор бизнес объектов используемый внутрях — разный. И есть у меня такое жуткое предположение, что и на серваке что-то третье а DataSet генерится с других объектов. Тебе собственно видней че там делается, можно и обсудить.
Re[28]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 09.01.07 17:02
Оценка:
Здравствуйте, GlebZ, Вы писали:

IT>>Я надеюсь, тебе не нужно объяснять, что безграмотное использование паттернов легко превращает их в антипаттерны? Тот же паттерн DTO великолепно это демонстрирует.

GZ>Повторю еще раз. Паттерны также описывают показания к применению. Паттерн рассказывает не только как применять, но и где применять.

И какие показания к применению DTO? Я когда-ниубдь это услышу?

IT>>И в чём проблема?

GZ>Да ни в чем. Сделать некоторую штуку которое маппирует/собирает данные из БО в DTO не так уж сложно.

Вопрос — зачем? Зачем вообще нужен этот лишний этап?

IT>>Не понял что? Что сам написал? Пунк 1 мы уже разобрали выше.

GZ>Пункт 1 — это применение некоторого подграфа вместо набора полей. К данному вопросу вышеописанное тобой отношение не имеет.

Это не важно. Мой вопрос можно перефразировать и для подграфа. Суть вопроса в том, стоит ли для разного представления одних и тех же данных создавать новые DTO, максимально подогнанные для этого представления.

IT>>Здесь мы как раз выясняем почему БО, передаваемый на клиента должен обязательно неэквивалентен БД на сервере.

GZ>Почему обязательно? Я описал именно показание когда его нужно делать.

Где это ты описал? Ты всего лишь озвучил утверждение, что одна из причин использования DTO "2. Скрытие некоторых не предназначенных для клиента данных.". Я тебе на это отвечаю — вводить DTO для этого не обязательно, достаточно не передавать ненужные данные клиенту.

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

GZ>Когда тебя обязали хранить в той-же таблице кто и когда создавал/изменял объект, а у пользователя может и не быть прав на просмотр аудита что ты будешь делать?

Не передавать пользователю эти данные.

IT>>>>Называй это как угодно, только не завбывай добавлять, что процент задач, где это действительно нужно, от общего числа трудно разглядеть даже в микроскоп.

GZ>>>У меня это процентов 90. Документооборот — эта такая штука в которой очень много слабоструктурированной информации.
IT>>Т.е. у тебя всё построено на веб-сервисах и ремоутингах? Всего лишь 10% обычной логики, а остальное всё комуникация? Странно И что такого в документообороте, что его делает столько нетрадиционной задачей?
GZ>Типы документов и справочников создаются пользователем в процессе эксплуатации.

Гы-гы. Так это другие 90%. В подобных задачах вообще использование статических BO, а следовательно и DTO, минимально. Там в основном упор на связи и динамику. Мы же здесь, судя по сообщению автора топика, вроде как обсуждаем вполне типичный случай применения DTO для статических объектов.

IT>>Ссылку и не надо передавать. Она потом будет восстановлена сериализатором.

GZ>Если она нужна. Один и тот же объект может передаваться разными интерфейсами в различных интерпретациях.

OK. И почему для передачи или не передачи ссылки нужно создавать DTO?

IT>>У тебя там stateful что ли? Ну так бы сразу и сказал

GZ>Нет. Всегда делал stateless. Но в том задании была числодробилка и надо было строить граф который быстро работает. А это провязка ссылками так как по идентификатору тормозит.

Очень хорошо. Т.е. ты утверждаешь, что DTO нужно использовать в числодробильных задачах. Я правильно понял?

GZ>Извини, но по моему ты не совсем понял что-же там было написано. Или все же не понял что-же такое DTO.


У меня складывается мнение, что это ты не понимаешь что такое DTO. Точнее, явно путаешь data transfer с data transfer object.

IT>>Я уже сто раз говорил, что проблема согласования объектных моделей решается не с помощью DTO, а с помощью мапперов.

GZ>А DTO в 90 процентов случаев и генерится маппером.

О! Я же говорю, что путаешь

GZ>Я не понимаю что такое хороший паттерн, или плохой. Паттерн должен быть по месту. Это примерно как и вопрос какой паттерн самый красивый.


А я тебе объясню, что такое плохой паттерн. Это паттерн, основное назначение которого затыкать дыры в дизайне.

GZ>Нет. Свои не дам. Недавно сменил работу, а теперешний не могу. Да и разработано многое в нынешнем проекте не мной.


Да меня не интересуют ваши коммерческие секреты. Просто пару вымышленных, но аналогичных решений.

GZ>А вот к примеру Janus — весьма интересен. Фактически набор в DataSet получаемый с сервера, и набор бизнес объектов используемый внутрях — разный. И есть у меня такое жуткое предположение, что и на серваке что-то третье а DataSet генерится с других объектов. Тебе собственно видней че там делается, можно и обсудить.


Очень хороший пример. Хороший пример плохого дизайна. Пример того, когда легаси код, спешка и "лишь бы работало" затыкаются в результате плохими паттернами. Ещё примеры будут?
Если нам не помогут, то мы тоже никого не пощадим.
Re[29]: DTO внутри BusinessObject
От: GlebZ Россия  
Дата: 10.01.07 09:37
Оценка: 1 (1) +2
Здравствуйте, IT, Вы писали:


IT>И какие показания к применению DTO? Я когда-ниубдь это услышу?

Ну не нравится те показания которые я написал, прочитай MSDN. Его не тупые люди писали. Раздел Forces — описано почему, раздел Benefits — бенефиты, раздел Liabilities — какие недостатки.
Переводить надеюсь не надо?

IT>Вопрос — зачем? Зачем вообще нужен этот лишний этап?

MSDN

IT>>>Не понял что? Что сам написал? Пунк 1 мы уже разобрали выше.

GZ>>Пункт 1 — это применение некоторого подграфа вместо набора полей. К данному вопросу вышеописанное тобой отношение не имеет.
IT>Это не важно. Мой вопрос можно перефразировать и для подграфа. Суть вопроса в том, стоит ли для разного представления одних и тех же данных создавать новые DTO, максимально подогнанные для этого представления.
Иногда другого пути нет.

GZ>>Когда тебя обязали хранить в той-же таблице кто и когда создавал/изменял объект, а у пользователя может и не быть прав на просмотр аудита что ты будешь делать?

IT>Не передавать пользователю эти данные.
+1. А для этого нужно сформировать тип BO но для клиента. Который и является DTO.

IT>Гы-гы. Так это другие 90%. В подобных задачах вообще использование статических BO, а следовательно и DTO, минимально. Там в основном упор на связи и динамику. Мы же здесь, судя по сообщению автора топика, вроде как обсуждаем вполне типичный случай применения DTO для статических объектов.

Делались решения и на основе нетипизированных датасетов, и на основе кодогенерации, и вообще без таковой. Я много где этой задачей занимался.

IT>>>Ссылку и не надо передавать. Она потом будет восстановлена сериализатором.

GZ>>Если она нужна. Один и тот же объект может передаваться разными интерфейсами в различных интерпретациях.
IT>OK. И почему для передачи или не передачи ссылки нужно создавать DTO?
IT>О! Я же говорю, что путаешь
Тады что по твоему является DTO?

GZ>>Нет. Свои не дам. Недавно сменил работу, а теперешний не могу. Да и разработано многое в нынешнем проекте не мной.

IT>Да меня не интересуют ваши коммерческие секреты. Просто пару вымышленных, но аналогичных решений.
OK. Правда не особо вымышленный.
Сценарий — надо показать форму с документом. Необходимо показать следующее:
1. Основные реквизиты документа
2. Сообщения по документу. Должно показывать тип сообщения, статус сообщения, автор сообщения, наличие/отсутсвие привязанных к сообщению файлов. Сообщения относятся к документу как 1:n. (сообщение содержит также большое поле — текст сообщение )
3. Наименование рубрик привязанных к документу. Отношение n:m.
4. Связанные документы. Нужно показать наименование связанного документа.(отношение n:m)
5. Описание файлов. Наименование, наличие подверсий файлов.(отношение 1:n)
6. Папку к которому документ в данный момент привязан (отношение 1:1)
Учитывать что небольшие по количеству объекты такие как папки и рубрики — кэшируются в оперативной памяти. Все объекты на сервере — entity.
Также существует другой сценарий. Показать список документов отобранных по какому-то критерию. Набор информации по документу в каждой строке определяется настройками пользователя.
Попробуй описать как бы ты это сделал.

GZ>>А вот к примеру Janus — весьма интересен. Фактически набор в DataSet получаемый с сервера, и набор бизнес объектов используемый внутрях — разный. И есть у меня такое жуткое предположение, что и на серваке что-то третье а DataSet генерится с других объектов. Тебе собственно видней че там делается, можно и обсудить.

IT>Очень хороший пример. Хороший пример плохого дизайна. Пример того, когда легаси код, спешка и "лишь бы работало" затыкаются в результате плохими паттернами. Ещё примеры будут?
Ух ты. Я просто пищу. Многие наезжали на янус, но чтобы ты????. В данном случае это классический offline-клиент по системе Data Center. Клиент развивался достаточно отдельно от сервера и оперативно решал свои задачи. Посему и модель БД у него расходится с серверной. Это вполне нормальное решение.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re[30]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 10.01.07 14:52
Оценка:
Здравствуйте, GlebZ, Вы писали:

IT>>И какие показания к применению DTO? Я когда-ниубдь это услышу?

GZ>Ну не нравится те показания которые я написал, прочитай MSDN. Его не тупые люди писали. Раздел Forces — описано почему, раздел Benefits — бенефиты, раздел Liabilities — какие недостатки.
GZ>Переводить надеюсь не надо?

От ты блин! Да сколько ж можно
Ещё раз. Business Entities обладают точно такими же бенефитами и не имеют ни одного из перечисленных недостатков. Или надо запускать эту песню по второму кругу?

IT>>Это не важно. Мой вопрос можно перефразировать и для подграфа. Суть вопроса в том, стоит ли для разного представления одних и тех же данных создавать новые DTO, максимально подогнанные для этого представления.

GZ>Иногда другого пути нет.

Когда другого пути нет?

GZ>Тады что по твоему является DTO?


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

GZ>>>Нет. Свои не дам. Недавно сменил работу, а теперешний не могу. Да и разработано многое в нынешнем проекте не мной.

IT>>Да меня не интересуют ваши коммерческие секреты. Просто пару вымышленных, но аналогичных решений.
GZ>OK. Правда не особо вымышленный.
GZ>Сценарий — надо показать форму с документом. Необходимо показать следующее:
GZ>1. Основные реквизиты документа
GZ>2. Сообщения по документу. Должно показывать тип сообщения, статус сообщения, автор сообщения, наличие/отсутсвие привязанных к сообщению файлов. Сообщения относятся к документу как 1:n. (сообщение содержит также большое поле — текст сообщение )
GZ>3. Наименование рубрик привязанных к документу. Отношение n:m.
GZ>4. Связанные документы. Нужно показать наименование связанного документа.(отношение n:m)
GZ>5. Описание файлов. Наименование, наличие подверсий файлов.(отношение 1:n)
GZ>6. Папку к которому документ в данный момент привязан (отношение 1:1)
GZ>Учитывать что небольшие по количеству объекты такие как папки и рубрики — кэшируются в оперативной памяти. Все объекты на сервере — entity.

Ну и в чём проблема. Рисуем entity для этих данных. По запросу клиента выбираем всё нужное из базы, добавляем к результату данные из серверного кеша, передаём клиенту, доабавляем на клиенте данные из клиентского кеша, баиндим результат на форму. Необходимости в специально выделенном DTO я не вижу.

GZ>Также существует другой сценарий. Показать список документов отобранных по какому-то критерию. Набор информации по документу в каждой строке определяется настройками пользователя.


Здесь хорошо бы определиться с тем как ты хранишь настройки пользователя. Но в общем случае схема такая же. Отбираем по критерию данные из базы. Если настройки можно учесть непосредственно в запросе, то одного запроса будет достаточно. Данные мапятся в entity, настройки складываются в коллекции и всё это уезжает клиенту. Клиент отображает эти данные на форме. DTO как отдельный этап не просматривается.

GZ>Ух ты. Я просто пищу. Многие наезжали на янус, но чтобы ты????. В данном случае это классический offline-клиент по системе Data Center. Клиент развивался достаточно отдельно от сервера и оперативно решал свои задачи. Посему и модель БД у него расходится с серверной. Это вполне нормальное решение.


Это не нормальное решенте. Нормальное решение должно учитывать требования клиента при разработке сервера. У нас же получилась примочка сбоку. Как ты думаешь, почему сервис януса переписывался несколько раз?
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[31]: DTO внутри BusinessObject
От: GlebZ Россия  
Дата: 10.01.07 16:11
Оценка:
Здравствуйте, IT, Вы писали:

IT>От ты блин! Да сколько ж можно

IT>Ещё раз. Business Entities обладают точно такими же бенефитами и не имеют ни одного из перечисленных недостатков. Или надо запускать эту песню по второму кругу?
Ну-ну.

GZ>>OK. Правда не особо вымышленный.

GZ>>Сценарий — надо показать форму с документом. Необходимо показать следующее:
GZ>>1. Основные реквизиты документа
GZ>>2. Сообщения по документу. Должно показывать тип сообщения, статус сообщения, автор сообщения, наличие/отсутсвие привязанных к сообщению файлов. Сообщения относятся к документу как 1:n. (сообщение содержит также большое поле — текст сообщение )
GZ>>3. Наименование рубрик привязанных к документу. Отношение n:m.
GZ>>4. Связанные документы. Нужно показать наименование связанного документа.(отношение n:m)
GZ>>5. Описание файлов. Наименование, наличие подверсий файлов.(отношение 1:n)
GZ>>6. Папку к которому документ в данный момент привязан (отношение 1:1)
GZ>>Учитывать что небольшие по количеству объекты такие как папки и рубрики — кэшируются в оперативной памяти. Все объекты на сервере — entity.

IT>Ну и в чём проблема. Рисуем entity для этих данных. По запросу клиента выбираем всё нужное из базы, добавляем к результату данные из серверного кеша, передаём клиенту, доабавляем на клиенте данные из клиентского кеша, баиндим результат на форму. Необходимости в специально выделенном DTO я не вижу.

Ну а теперь посчитаем:
1. Мы возвращаем n документов (сам документ так и связанные с ним документы)
2. Мы возращаем полные сообщения (учитывая все остальные поля, это в среднем раз в 10 больше информации).
3. Мы возвращаем описания файлов. В среднем раза в 4 больше информации.
4. Мы возвращаем рубрики. В среднем раза 3 больше информации.
5. Мы возвращаем папку. Думаю в среднем раза в полтора больше информации но это уже не важно, так как она единственная.
Я бы потерпел если бы счет шел раза в два. Тут уже идет счет на порядки. Как результат — вместо нескольких кил информации счет уже идет на сотни кил. Это называется эффективно?

GZ>>Также существует другой сценарий. Показать список документов отобранных по какому-то критерию. Набор информации по документу в каждой строке определяется настройками пользователя.

IT>Здесь хорошо бы определиться с тем как ты хранишь настройки пользователя. Но в общем случае схема такая же. Отбираем по критерию данные из базы. Если настройки можно учесть непосредственно в запросе, то одного запроса будет достаточно. Данные мапятся в entity, настройки складываются в коллекции и всё это уезжает клиенту. Клиент отображает эти данные на форме. DTO как отдельный этап не просматривается.
Еще как просматривается. На полной сериализации счет шел на десятки и сотни мегабайт. Тута вообще если все оставить как entity — убивает сервер напрочь.

GZ>>Ух ты. Я просто пищу. Многие наезжали на янус, но чтобы ты????. В данном случае это классический offline-клиент по системе Data Center. Клиент развивался достаточно отдельно от сервера и оперативно решал свои задачи. Посему и модель БД у него расходится с серверной. Это вполне нормальное решение.

IT>Это не нормальное решенте. Нормальное решение должно учитывать требования клиента при разработке сервера. У нас же получилась примочка сбоку.
Сервер должен учитывать требования всех возможных клиентов а не одного конкретного. Он должен выдавать наиболее полно и гибко информацию с учетом клиентов которых еще нет в природе. Может это у меня такая специфика, но интеграцию требуют многие клиенты. Поэтому функциональность сервера не должен зависить от конкретного клиента.

IT>Как ты думаешь, почему сервис януса переписывался несколько раз?

Это уж вам видней.
Re[32]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 10.01.07 16:56
Оценка:
Здравствуйте, GlebZ, Вы писали:

IT>>Ну и в чём проблема. Рисуем entity для этих данных. По запросу клиента выбираем всё нужное из базы, добавляем к результату данные из серверного кеша, передаём клиенту, доабавляем на клиенте данные из клиентского кеша, баиндим результат на форму. Необходимости в специально выделенном DTO я не вижу.

GZ>Ну а теперь посчитаем:
GZ>1. Мы возвращаем n документов (сам документ так и связанные с ним документы)
GZ>2. Мы возращаем полные сообщения (учитывая все остальные поля, это в среднем раз в 10 больше информации).
GZ>3. Мы возвращаем описания файлов. В среднем раза в 4 больше информации.
GZ>4. Мы возвращаем рубрики. В среднем раза 3 больше информации.
GZ>5. Мы возвращаем папку. Думаю в среднем раза в полтора больше информации но это уже не важно, так как она единственная.
GZ>Я бы потерпел если бы счет шел раза в два. Тут уже идет счет на порядки. Как результат — вместо нескольких кил информации счет уже идет на сотни кил. Это называется эффективно?

Откуда я знаю? На сколько ты мне выдал информации на столько и получил решений. Давай расписывай подробнее, будем решать детальнее. Например, мне интересна частота обновления всех перечисленных тобой данных, их объем и структура. А пока с учётом моих телепатических способностей, решение которое я тебе выдал можно назвать идеальным

IT>>Здесь хорошо бы определиться с тем как ты хранишь настройки пользователя. Но в общем случае схема такая же. Отбираем по критерию данные из базы. Если настройки можно учесть непосредственно в запросе, то одного запроса будет достаточно. Данные мапятся в entity, настройки складываются в коллекции и всё это уезжает клиенту. Клиент отображает эти данные на форме. DTO как отдельный этап не просматривается.

GZ>Еще как просматривается. На полной сериализации счет шел на десятки и сотни мегабайт. Тута вообще если все оставить как entity — убивает сервер напрочь.

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

IT>>Это не нормальное решенте. Нормальное решение должно учитывать требования клиента при разработке сервера. У нас же получилась примочка сбоку.

GZ>Сервер должен учитывать требования всех возможных клиентов а не одного конкретного. Он должен выдавать наиболее полно и гибко информацию с учетом клиентов которых еще нет в природе.

Это совершенно необязательно. Да зачастую и невозможно. У нашего сервера как минимум три клиента: web, янус, nntp. У каждого их них есть своя специфика. Например, для web нужен пейджинг, для януса поиск оборванных веток, для реализации протокола nntp нужно возвращать списки сообщений, отфильтрованных по их порядковым номерам. Если делать универсальный интерфейс, то либо мы не сможем предоставить клиентам часть функционала, либо будем вынуждены написать очень общий функционал, который будет ужасно неэффективен.

GZ>Может это у меня такая специфика, но интеграцию требуют многие клиенты. Поэтому функциональность сервера не должен зависить от конкретного клиента.


Такое тоже бывает. Всё зависит от структуры сервера, клиентов и требуемой функциональности. Можно ведь вообще один метод написать, на входе xml, на выходе xml. В результате очень стабильный внешний интерфейс, правильно?

IT>>Как ты думаешь, почему сервис януса переписывался несколько раз?

GZ>Это уж вам видней.

Вот именно.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[21]: DTO внутри BusinessObject
От: MaximVK Россия  
Дата: 10.01.07 17:07
Оценка:
Здравствуйте, IT, Вы писали:

IT>Не знаем. Но знаем, что речь идёт как минимум о .NET, где реальных причин, озвученных тобой выше, для использования DTO пока не обнаружено. Вывод напрашивается сам собой.


Тоже прошу прощения, что встреваю. Вот по этой ссылке
Автор: MaximVK
Дата: 20.10.06
я описывал стандартнейшую ситуацию, где использование DTO единственный разумный выход. Если следовать твоей логике, то здесь или ошибка в дизайне, или можно все упаковать в entity, или мы по разному понимаем термин DTO. В последнем я сомневаюсь, т.к. данное тобой определение вполне вполне подходит под эту ситуацию.
Re[22]: DTO внутри BusinessObject
От: Mika Soukhov Stock#
Дата: 10.01.07 17:29
Оценка:
Здравствуйте, MaximVK, Вы писали:

MVK>Здравствуйте, IT, Вы писали:


IT>>Не знаем. Но знаем, что речь идёт как минимум о .NET, где реальных причин, озвученных тобой выше, для использования DTO пока не обнаружено. Вывод напрашивается сам собой.


Хотел добавить вчера, что DTO бывает полезен в тех случаях, когда уже ничего больше не помогает.

MVK>Тоже прошу прощения, что встреваю. Вот по этой ссылке
Автор: MaximVK
Дата: 20.10.06
я описывал стандартнейшую ситуацию, где использование DTO единственный разумный выход.


особенно вытащить все продукты в заказе, чтобы узнать их количество


Количество продуктов узнается перед тем, как делать запрос по выборке этих самых продуктов. Тот же paging работает по схожему методу.
Re[22]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 10.01.07 17:53
Оценка:
Здравствуйте, MaximVK, Вы писали:

MVK>Тоже прошу прощения, что встреваю. Вот по этой ссылке
Автор: MaximVK
Дата: 20.10.06
я описывал стандартнейшую ситуацию, где использование DTO единственный разумный выход. Если следовать твоей логике, то здесь или ошибка в дизайне, или можно все упаковать в entity, или мы по разному понимаем термин DTO. В последнем я сомневаюсь, т.к. данное тобой определение вполне вполне подходит под эту ситуацию.


Для такой ситуации, очевидно, оверхед по вытаскиванию всех этих данных будет слишком большой(особенно вытащить все продукты в заказе, чтобы узнать их количество). Поэтому лучше создать какой-нить DTO класс, который будет содержать исключительно необходимую информацию.

А как ты будешь узнавать количество продуктов в заказе для DTO?
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[23]: DTO внутри BusinessObject
От: GlebZ Россия  
Дата: 10.01.07 22:41
Оценка: +1
Здравствуйте, Mika Soukhov, Вы писали:

MS>Количество продуктов узнается перед тем, как делать запрос по выборке этих самых продуктов. Тот же paging работает по схожему методу.

Это смотря с какой стороны посмотреть. В случае 3-х звенки лучше сразу заказывать количество возвращаемых данных, и чтобы запрос вместе со страницей возвращал общее количество объектов. Потому как иначе нужно будет думать как поведет себя визуалка если между получением количества и получением последней страницы будет вставлен/удален какой-то объект.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re[33]: DTO внутри BusinessObject
От: GlebZ Россия  
Дата: 10.01.07 22:57
Оценка:
Здравствуйте, IT, Вы писали:

IT>Откуда я знаю? На сколько ты мне выдал информации на столько и получил решений. Давай расписывай подробнее, будем решать детальнее. Например, мне интересна частота обновления всех перечисленных тобой данных, их объем и структура. А пока с учётом моих телепатических способностей, решение которое я тебе выдал можно назвать идеальным

Да в принципе ключевую информацию я дал. Система как и почти все системы документооборота чаще используется для чтения/поиска. Каждый объект вполне самостоятелен и имеет дополнительную информацию используюмую в других прецедентах. Основное в вышеуказанном, что сообщения и документы большие. И они обязаны быть актуальными на момент запуска сценария.

IT>Мне кажется, что ты не улавливаешь одну простую вещь. Если нет необходимости в полной сериализации, то её не надо делать. Entity спокойно может быть передана, например без списка рубрик, если эти рубрики уже закешированы на клиенте. Для всего этого не нужно создавать специальные DTO.

Я примерно начал понимать в чем дело. Я практически никогда не использую прямые ссылки. Для меня обобщенно сценарий выполнения запроса сервера — загрузить нужные бизнес-объекты с выполнением бизнес-логики, сериализовать в некоторый stream(который является DTO), и отправить клиенту. Связанные объекты на сервере не связываются по ссылке, а только по идентификаторам и знанием в какой коллекции он находится. Таким образом с каждым объектом можно работать по отдельности, использовать для других прецедентах и механизмах. Он вполне самостоятелен и не несет за собой нагрузку в виде связанных объектов. А затем при отдаче клиенту они сериализуются по порядку в один и тот же стрим(или каким либо другим способом). Когда то делал ссылки и с Lazy Load, но не нравится. Особенные проблемы были с paging связанных объектов.


IT>Это совершенно необязательно. Да зачастую и невозможно. У нашего сервера как минимум три клиента: web, янус, nntp. У каждого их них есть своя специфика. Например, для web нужен пейджинг, для януса поиск оборванных веток, для реализации протокола nntp нужно возвращать списки сообщений, отфильтрованных по их порядковым номерам. Если делать универсальный интерфейс, то либо мы не сможем предоставить клиентам часть функционала, либо будем вынуждены написать очень общий функционал, который будет ужасно неэффективен.

Коли я была царицей...

Вобщем я бы выбрал вариант с единым интерфейсом сервера у которого были бы и paging и фильтрация и сортировка.

GZ>>Может это у меня такая специфика, но интеграцию требуют многие клиенты. Поэтому функциональность сервера не должен зависить от конкретного клиента.


IT>Такое тоже бывает. Всё зависит от структуры сервера, клиентов и требуемой функциональности. Можно ведь вообще один метод написать, на входе xml, на выходе xml. В результате очень стабильный внешний интерфейс, правильно?

Только не надо xml на входе. Видел одно такое решение, очень хотелось кого-нибудь убить. Контракт должен быть ясным и понятным. Еще не видел хоть одного вменяемого решения по своему языку запросов. Лучше минимум универсального языка запросов. Но все-таки, можно потратить некоторое время на унификацию интерфейса сервера. Потом оно обертывается сторицей.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re[23]: DTO внутри BusinessObject
От: MaximVK Россия  
Дата: 11.01.07 11:01
Оценка:
Здравствуйте, IT, Вы писали:

IT>А как ты будешь узнавать количество продуктов в заказе для DTO?


DTO полностью формируются на уровне DAL, т.е. количество продуктов в заказе расчитывается еще в базе и результаты запроса сразу упаковываются в DTO без промежуточных распихиваний по бизнес-объектам. Если это не DTO, то что это?
Назвать это business entity — язык не поворачивается, т.к. один экземпляр этого класса хранит агрегированную информацию о нескольких взаимосвязанных сущностях. Проектировать business-entities так, чтобы они успешно решали еще и эту задачу — глупо, т.к. во-первых это не их дело, а во-вторых появиться зависимость между совершенно двумя различными задачами. Также несколько странно добавлять метод вычисляющий productCount для конкретного заказа, при условии, что нигде кроме этой задачи он не понадобиться.
Re[23]: DTO внутри BusinessObject
От: MaximVK Россия  
Дата: 11.01.07 12:45
Оценка:
Здравствуйте, Mika Soukhov, Вы писали:

MS>Хотел добавить вчера, что DTO бывает полезен в тех случаях, когда уже ничего больше не помогает.


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

MS>Количество продуктов узнается перед тем, как делать запрос по выборке этих самых продуктов. Тот же paging работает по схожему методу.


В подавляющем большинстве случаев нужна просто коллекция OrderItems, которая запрашивается вся сразу по id заказа. Метод вида GetOrderItemsCount (или поле OrderProductCount у заказа) имеет смысл создавать достаточно редко. Я тут полностью согласен с Глебом, что лучше сделать просто метод вида GetOrderItems(int orderId, int pageNumber, int itemsPerPage) который будет возвращать структуру содержащую коллекцию OrderItems и OrderItemsTotalCount.
Re[24]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 11.01.07 13:14
Оценка:
Здравствуйте, MaximVK, Вы писали:

MVK>Здравствуйте, IT, Вы писали:


IT>>А как ты будешь узнавать количество продуктов в заказе для DTO?


MVK> DTO полностью формируются на уровне DAL, т.е. количество продуктов в заказе расчитывается еще в базе и результаты запроса сразу упаковываются в DTO без промежуточных распихиваний по бизнес-объектам. Если это не DTO, то что это?


Это зависит от того, что ты дальше будет делать с этим DTO. Что с ним будет делать клиент? Перекладывать данные в свою объектную модель или использовать напрямую?

MVK>Назвать это business entity — язык не поворачивается, т.к. один экземпляр этого класса хранит агрегированную информацию о нескольких взаимосвязанных сущностях. Проектировать business-entities так, чтобы они успешно решали еще и эту задачу — глупо, т.к. во-первых это не их дело, а во-вторых появиться зависимость между совершенно двумя различными задачами. Также несколько странно добавлять метод вычисляющий productCount для конкретного заказа, при условии, что нигде кроме этой задачи он не понадобиться.


Давай попробуем порассуждать. Ты утверждаешь, что добавлять метод/свойство productCount или обучать BE решать эту задачу другим способом странно и глупо, т.к. это нигде кроме этой задачи не понадобится. А создавать отдельную структуру данных (DTO), которая может дублировать 90% информации из BE и тоже использоваться только для этой задачи — это как раз то, что нужно. Где логика?
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[25]: DTO внутри BusinessObject
От: MaximVK Россия  
Дата: 11.01.07 15:16
Оценка: 14 (3)
Здравствуйте, IT, Вы писали:

ITIT>Это зависит от того, что ты дальше будет делать с этим DTO. Что с ним будет делать клиент? Перекладывать данные в свою объектную модель или использовать напрямую?


Ну в рассматриваемом примере — напрямую, т.к. эти данные нужны для грида. Также, важно, что эти данные не будут меняться. Т.е. клиент не может заслать этот DTO обратно на сервер. Это важное ограничение, т.к. он избавляет нас от написания всяких разборщиков/сборщиков DTO из business entities, что я считаю очень крайней мерой.

IT>Давай попробуем порассуждать. Ты утверждаешь, что добавлять метод/свойство productCount или обучать BE решать эту задачу другим способом странно и глупо, т.к. это нигде кроме этой задачи не понадобится. А создавать отдельную структуру данных (DTO), которая может дублировать 90% информации из BE и тоже использоваться только для этой задачи — это как раз то, что нужно. Где логика?


Я замечу, что эта структура дублирует по 5-10% информации из 10 типов объектов + использует некоторые агрегаты по коллекциям объектов. Т.е. суммарный процент получается даже меньше 5.

Теперь про обучение BE. Подход, который ты предлагаешь, со временем в целях оптимизации, потребует частичного заполнения бизнес-сущностей. Что, в свою очередь, повлечет необходимость добавления методов вида IsOrderNameSpecified(), IsOrderDateCreatedSpecified() и т.д. для каждого поля BE. Далее, код, который использует BE должен будет предварительно вызвать этот метод, чтобы убедиться, что поле, которое он собирается использовать, определено. Также посыпятся методы BE которые используют внутренние поля, например методы вида GetUserFullName(), который из FirstName и LastName делает полное имя, т.к. BE не должна уметь сама себя загружать то от таких методов придется или избавиться, или сделать проверочный метод, или вышвыривать исключение. Частично заполненые объекты требует крайне внимательного с ними обращения и являются потенциальным источником большого количества трудно обнаружимых ошибок.

Пример, который я привел — это DTO которое используется для отображений данных в гриде. Ты предлагаешь мне проектировать мои BE, так чтобы их было удобно изображать на гриде? Но это две совершенно разные задачи. Business entities — суть контейнеры для данных описывающие предметную область, язык на котором общаются другие компоненты системы. Вероятность изменения BE значительно ниже, чем вероятность изменения требований о представлении данных клиентами, т.к. первые отражают значительно более инертную предметную область(я уже молчу про индустриальные стандарты, которые тоже находят отражения в BE).
Re[29]: DTO внутри BusinessObject
От: akasoft Россия  
Дата: 11.01.07 18:32
Оценка:
Здравствуйте, IT, Вы писали:

GZ>>А вот к примеру Janus — весьма интересен. Фактически набор в DataSet получаемый с сервера, и набор бизнес объектов используемый внутрях — разный. И есть у меня такое жуткое предположение, что и на серваке что-то третье а DataSet генерится с других объектов. Тебе собственно видней че там делается, можно и обсудить.


IT>Очень хороший пример. Хороший пример плохого дизайна. Пример того, когда легаси код, спешка и "лишь бы работало" затыкаются в результате плохими паттернами. Ещё примеры будут?


Гм. А как оценивается тобою вот этот вариант? Он как стыкуется с БО, используемыми сервером?
... << RSDN@Home 1.2.0 alpha rev. 672>> SQL Express 2005
Re[30]: DTO внутри BusinessObject
От: akasoft Россия  
Дата: 11.01.07 18:41
Оценка:
Здравствуйте, GlebZ, Вы писали:

GZ>Ух ты. Я просто пищу. Многие наезжали на янус, но чтобы ты????.


Надо ещё АВК заманить, мало не покажется.

GZ> В данном случае это классический offline-клиент по системе Data Center. Клиент развивался достаточно отдельно от сервера и оперативно решал свои задачи. Посему и модель БД у него расходится с серверной. Это вполне нормальное решение.


Полагаю, тут немалое влияние оказало и то, кто и как развивал проект. Квалификация и опыт самые разные.

И почему, собственно, БО в Янусе должны быть 1-к-одному, как на сервере? Ведь это же оффлайн-клиент всё-таки, он обязан долговременно и функционально работать сам по себе.
... << RSDN@Home 1.2.0 alpha rev. 672>> SQL Express 2005
Re[31]: DTO внутри BusinessObject
От: akasoft Россия  
Дата: 11.01.07 18:41
Оценка:
Здравствуйте, IT, Вы писали:

IT>Нормальное решение должно учитывать требования клиента при разработке сервера. У нас же получилась примочка сбоку.


Про это АВК писал.

IT> Как ты думаешь, почему сервис януса переписывался несколько раз?


А вот про это нет. Было более, чем два раза? Причём второй раз всё ещё not used jet. Правки всяких дыр и проч. как бы не в счёт.
... << RSDN@Home 1.2.0 alpha rev. 672>> SQL Express 2005
Re[26]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 11.01.07 21:20
Оценка: +1
Здравствуйте, MaximVK, Вы писали:

MVK> Теперь про обучение BE. Подход, который ты предлагаешь, со временем в целях оптимизации, потребует частичного заполнения бизнес-сущностей. Что, в свою очередь, повлечет необходимость добавления методов вида IsOrderNameSpecified(), IsOrderDateCreatedSpecified() и т.д. для каждого поля BE. Далее, код, который использует BE должен будет предварительно вызвать этот метод, чтобы убедиться, что поле, которое он собирается использовать, определено. Также посыпятся методы BE которые используют внутренние поля, например методы вида GetUserFullName(), который из FirstName и LastName делает полное имя, т.к. BE не должна уметь сама себя загружать то от таких методов придется или избавиться, или сделать проверочный метод, или вышвыривать исключение. Частично заполненые объекты требует крайне внимательного с ними обращения и являются потенциальным источником большого количества трудно обнаружимых ошибок.


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

MVK>Пример, который я привел — это DTO которое используется для отображений данных в гриде.


После вот этого утверждения дискуссию можно было бы закончить. То, что ты называешь DTO — это вовсе не DTO, это как раз и есть то, о чём я говорю. У DTO одно единственное предназначение — transfer. У тебя же объект, который максимально подогнан не под transfer, а под отображение в гриде. Это нормально, это и есть BE, отражающая твою объектную модель, модель, используемую в UI. Или у UI приложения не может быть своей объектной модели?

В общем, ты теперь сам должен определиться. Либо ты продолжаешь утвеждать, что это DTO, но соглашаешься с тем, что ты грубо нарушил заветы паттерна, либо признать, что на лицо элементарная путаница в терминологии. Выбирать тебе

MVK>Ты предлагаешь мне проектировать мои BE, так чтобы их было удобно изображать на гриде? Но это две совершенно разные задачи. Business entities — суть контейнеры для данных описывающие предметную область, язык на котором общаются другие компоненты системы. Вероятность изменения BE значительно ниже, чем вероятность изменения требований о представлении данных клиентами, т.к. первые отражают значительно более инертную предметную область(я уже молчу про индустриальные стандарты, которые тоже находят отражения в BE).


Давай попробуем разобраться без догм и фанатизма. Что такое контейнеры для данных, описывающие предметную область или что угодно другое? Это объектная модель, на которой строится функциональность приложения. Верно? Верно. У клиентского UI приложения может быть своя объектная модель, на которой строится фукнциональность UI приложения? Может. Тогда какая по сути принципиальная разница между объетной моделью UI приложения и BE, которые есть контейнеры данных, описывающие предметную область? Совершенно верно, ни-ка-кой. И то, и другое суть контейнеры, предназначение которых обеспечить совместно с логикой приложения работу системы в соответствии с функциональными требованиями.
Если нам не помогут, то мы тоже никого не пощадим.
Re[30]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 11.01.07 21:23
Оценка:
Здравствуйте, akasoft, Вы писали:

A>Гм. А как оценивается тобою вот этот вариант? Он как стыкуется с БО, используемыми сервером?


С этим сервисом я детально не разбирался.
Если нам не помогут, то мы тоже никого не пощадим.
Re[31]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 11.01.07 21:33
Оценка:
Здравствуйте, akasoft, Вы писали:

A>Полагаю, тут немалое влияние оказало и то, кто и как развивал проект. Квалификация и опыт самые разные.


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

A>И почему, собственно, БО в Янусе должны быть 1-к-одному, как на сервере? Ведь это же оффлайн-клиент всё-таки, он обязан долговременно и функционально работать сам по себе.


Дело не в одинаковости моделей. Мы здесь спорим не об этом. Мы пытаемся понять необходимость DTO для переноса данных из одного приложения в другое.
Если нам не помогут, то мы тоже никого не пощадим.
Re[27]: DTO внутри BusinessObject
От: GlebZ Россия  
Дата: 12.01.07 11:17
Оценка: 8 (1)
Здравствуйте, IT, Вы писали:

IT>После вот этого утверждения дискуссию можно было бы закончить. То, что ты называешь DTO — это вовсе не DTO, это как раз и есть то, о чём я говорю. У DTO одно единственное предназначение — transfer. У тебя же объект, который максимально подогнан не под transfer, а под отображение в гриде. Это нормально, это и есть BE, отражающая твою объектную модель, модель, используемую в UI. Или у UI приложения не может быть своей объектной модели?


Вот в данном случае не соглашусь. Основная цель DTO, как и всего презентационного слоя является изоляция логики сервера от логики клиента. DTO — является частью презентационного слоя. Эффективная пересылка — это уже другая цель. Какая там логика на клиенте — серверу неизвестно и должно быть по барабану. Это в принципе не должно быть известно и DTO и презентационному слою. Его первичная цель предоставить эффективный доступ к функциональности сервера для всех клиентов.
Идеальным решением было бы связка XQuery/XML/Schema, и отношение к DTO не как объекту, а как набору данных. Тогда каждый клиент мог бы заказать не только какие с какими условиями и в какой последовательности объекты ему нужны. Но и в каком виде. К сожалению это решение достаточно сложное и много проблем при реализации.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re[27]: DTO внутри BusinessObject
От: MaximVK Россия  
Дата: 12.01.07 11:52
Оценка:
Здравствуйте, IT, Вы писали:

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


Отнюдь, вполне ожидаемый , т.к. именно эта аргументация приводиться чтобы оправдать такой подход. Неожиданность в другом — я не ожидал услышать такой, прямо скажем, слабой аргументации от тебя. Для небольшого проекта или прототипирования — это вполне разумный подход, который экономит время, а количество кода, сотрудников и продолжительность времени разработки позволяет не потерять эту информацию из виду. Для больших проектов это, очевидно, не верно. Т.к. если по коду начала гулять не полностью заполненая BE, нет гарантии, что она не попадет в метод, который расчитывает, что некоторое поле в этой BE обязательно должно быть проинициалированным. Другими словами, выполнение правила "Все поля BE должны быть проинициализированы" гораздо легче контролировать, чем выполнения правила "Частично заполненные BE не должны попасть в код, который будет использовать непроинициалированные поля". Т.к. в первом случае, мы должны контролировать только точки создания BE, а во втором все дерево переходов BE по коду. Я могу согласиться с таким подходом лишь в случае проектирования внешнего API к системе, т.к. видел пример хорошего решения(eBay XML и SOAP API). Там в каждом запросе к API передается поле DetailLevel и для каждого запроса в документации определена таблица для каких значений DetailLevel, какие поля будут возвращены.

IT>После вот этого утверждения дискуссию можно было бы закончить.

Ну это утверждение было известно до начала дискуссии, т.к. в посте на который я привел ссылку было сказано

С другой стороны, пусть тебе нужны данные для грида где ты отображаешь информацию...

Впрочем, с остальным я согласен. Отмечу только, что поведение и цели подобных классов слишком сильно отличаются скажем, то тех же Order, Customer или Address. Отличие в следующем:
1. Эти контейнеры предназначены исключительно для передачи информации наружу из бизнес-логики. Т.е. они не принимают участие во внутренних процессах.
2. Вероятность изменения для них значительно выше, т.к. они в большей степени зависят от мимолетных пожеланий клиентов, чем от инертной предментной области.
...
Эти отличия должны быть явно зафиксированы в коде, например введением абстрактного класса или использованием атрибутов, т.к. такой подход значительно упрощает жизнь в дальнейшем. Кроме того, учитывая, что изменения обоих типов зависят от разных требований — они должны быть соотвественно разделены и физически.

IT>Давай попробуем разобраться без догм и фанатизма. Что такое контейнеры для данных, описывающие предметную область или что угодно другое? Это объектная модель, на которой строится функциональность приложения. Верно? Верно. У клиентского UI приложения может быть своя объектная модель, на которой строится фукнциональность UI приложения? Может. Тогда какая по сути принципиальная разница между объетной моделью UI приложения и BE, которые есть контейнеры данных, описывающие предметную область? Совершенно верно, ни-ка-кой. И то, и другое суть контейнеры, предназначение которых обеспечить совместно с логикой приложения работу системы в соответствии с функциональными требованиями.


Тоже согласен, с небольшими "но" описанными выше.
Re[28]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 12.01.07 13:26
Оценка:
Здравствуйте, GlebZ, Вы писали:

GZ>Вот в данном случае не соглашусь. Основная цель DTO, как и всего презентационного слоя является изоляция логики сервера от логики клиента. DTO — является частью презентационного слоя. Эффективная пересылка — это уже другая цель.


Разве? А если обмен осуществляется не между презентационным слоем и сервером, а между одним сервером и другим? То что такое DTO в данном случае?

Не надо давать свою интерпретацию терминам. DTO — это data transfer object. Заметь — transfer, не DTPO — data transfer & presentation object. Только transfer.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[29]: DTO внутри BusinessObject
От: GlebZ Россия  
Дата: 12.01.07 13:52
Оценка: -1
Здравствуйте, IT, Вы писали:

IT>Не надо давать свою интерпретацию терминам. DTO — это data transfer object. Заметь — transfer, не DTPO — data transfer & presentation object. Только transfer.

Presentation — это слой. И DTO является частью его.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re[28]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 12.01.07 13:58
Оценка:
Здравствуйте, MaximVK, Вы писали:

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


MVK>Отнюдь, вполне ожидаемый , т.к. именно эта аргументация приводиться чтобы оправдать такой подход. Неожиданность в другом — я не ожидал услышать такой, прямо скажем, слабой аргументации от тебя.


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

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


Дать определение большого проекта не затруднит?

MVK>Т.к. если по коду начала гулять не полностью заполненая BE, нет гарантии, что она не попадет в метод, который расчитывает, что некоторое поле в этой BE обязательно должно быть проинициалированным. Другими словами, выполнение правила "Все поля BE должны быть проинициализированы" гораздо легче контролировать, чем выполнения правила "Частично заполненные BE не должны попасть в код, который будет использовать непроинициалированные поля". Т.к. в первом случае, мы должны контролировать только точки создания BE, а во втором все дерево переходов BE по коду.


Тогда вернёмся на несколько постов назад. По-твоему, если у тебя есть объект из 30 полей, но тебе нужно только 5, то ты создаш новый объект. Если же тебе понадобились 6 полей, то ещё один объект, если 6, но других, то по объекту на каждую комбинацию, если 7, то все возможные комбинации и так далее. Я тебя правильно понимаю?

MVK>Я могу согласиться с таким подходом лишь в случае проектирования внешнего API к системе, т.к. видел пример хорошего решения(eBay XML и SOAP API). Там в каждом запросе к API передается поле DetailLevel и для каждого запроса в документации определена таблица для каких значений DetailLevel, какие поля будут возвращены.


Так в чём проблема? Если речь идёт о большом проекте, то сопроводи свой метод спецификаций.

IT>>После вот этого утверждения дискуссию можно было бы закончить.

MVK> Ну это утверждение было известно до начала дискуссии, т.к. в посте на который я привел ссылку было сказано

С другой стороны, пусть тебе нужны данные для грида где ты отображаешь информацию...



Извини, не заметил.

MVK>Впрочем, с остальным я согласен. Отмечу только, что поведение и цели подобных классов слишком сильно отличаются скажем, то тех же Order, Customer или Address. Отличие в следующем:

MVK>1. Эти контейнеры предназначены исключительно для передачи информации наружу из бизнес-логики. Т.е. они не принимают участие во внутренних процессах.

Блин, ну вот опять начинается Как же они не принимают участие во внутренних процессах, если задача внутренных процессов как раз и заключается в том, чтобы создать структуру из таких объектов и вернуть её клиенту. Это и есть работа этих самых внутренных процессов.

MVK>2. Вероятность изменения для них значительно выше, т.к. они в большей степени зависят от мимолетных пожеланий клиентов, чем от инертной предментной области.


Эти изменения прежде всего неразрывно связаны с изменением логики работы сервера.

MVK>Эти отличия должны быть явно зафиксированы в коде, например введением абстрактного класса или использованием атрибутов, т.к. такой подход значительно упрощает жизнь в дальнейшем. Кроме того, учитывая, что изменения обоих типов зависят от разных требований — они должны быть соотвественно разделены и физически.


И почему же они тогда не разделены?
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[30]: DTO внутри BusinessObject
От: TK Лес кывт.рф
Дата: 12.01.07 14:11
Оценка:
Hello, "GlebZ"
> Здравствуйте, IT, Вы писали:
>
> IT>Не надо давать свою интерпретацию терминам. DTO — это data
> transfer object. Заметь — transfer, не DTPO — data transfer &
> presentation
object. Только transfer.
> Presentation — это слой. И DTO является частью его.

А можно, для тех кто в танке? т.е. DTO как часть presentation слоя
используются только в нем и выше? Или, data слой зависит от объектов
presentation слоя и все это дело крепко замешано друг на друга?
Posted via RSDN NNTP Server 2.0
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[30]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 12.01.07 14:37
Оценка:
Здравствуйте, GlebZ, Вы писали:

IT>>Не надо давать свою интерпретацию терминам. DTO — это data transfer object. Заметь — transfer, не DTPO — data transfer & presentation object. Только transfer.

GZ>Presentation — это слой. И DTO является частью его.

А частью бизнес логики не является?
Если нам не помогут, то мы тоже никого не пощадим.
Re[31]: DTO внутри BusinessObject
От: GlebZ Россия  
Дата: 12.01.07 15:07
Оценка:
Здравствуйте, TK, Вы писали:

TK>А можно, для тех кто в танке? т.е. DTO как часть presentation слоя

TK>используются только в нем и выше? Или, data слой зависит от объектов
TK>presentation слоя и все это дело крепко замешано друг на друга?
Для тех кто в танках, самоходках и на доблестных кораблях краснознаменного балтийского флота. Слой — это добровольное обязательство разработчика для изоляции некоторой логики находящейся между другими слоями. Presentation layer, или иногда именуюмый фасадным слоем — это слой предназначенный для защиты независимости реализации бизнес-логики сервера от посягательтв клиентов. Сущности реализуемые в слое — по крайней мере не должны противоречить той цели ради которой построен слой. DTO — снимает проблему зависимости серверной бизнес-логики по данным.
Если мы не ставим себе задачу обеспечить независимость передаваемых данных от реализации бизнес-логики на сервере — хорошо. Баба с возу, кобыле легче. Заботу о формировании DTO обеспечивается стандартными средствами. Если мы должны это сделать по каким-то причинам — то это функция presentation layer.
Что касается смешения соседствующих слоев, а правильнее говорить о зависимости — то они безусловно зависят друг от друга, и это не есть противоречие.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re[31]: DTO внутри BusinessObject
От: GlebZ Россия  
Дата: 12.01.07 15:07
Оценка:
Здравствуйте, IT, Вы писали:

GZ>>Presentation — это слой. И DTO является частью его.


IT>А частью бизнес логики не является?

Смотря что имеется ввиду под бизнес логикой. Если говорить о бизнес-логике как о реализации некоторой предметной логики — то нет. Это сервисная логика.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re[32]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 12.01.07 15:22
Оценка:
Здравствуйте, GlebZ, Вы писали:

GZ>>>Presentation — это слой. И DTO является частью его.


IT>>А частью бизнес логики не является?


GZ>Смотря что имеется ввиду под бизнес логикой. Если говорить о бизнес-логике как о реализации некоторой предметной логики — то нет. Это сервисная логика.


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

Ответь пожалуйста на вопрос, DTO являются частью этой логики? Если можно без изобретения новых терминов.
Если нам не помогут, то мы тоже никого не пощадим.
Re[32]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 12.01.07 15:39
Оценка:
Здравствуйте, GlebZ, Вы писали:

GZ>Для тех кто в танках, самоходках и на доблестных кораблях краснознаменного балтийского флота. Слой — это добровольное обязательство разработчика для изоляции некоторой логики находящейся между другими слоями. Presentation layer, или иногда именуюмый фасадным слоем — это слой предназначенный для защиты независимости реализации бизнес-логики сервера от посягательтв клиентов.


О как! Presentation у нас уже стал синонимом контракта
Т.е. WPF, по-твоему, это не фреймворк для разработки UI, а нечно для создания фасадов серверов.
Я конечно всё понимаю, и вполне осознаю, что вся эта дискуссия всего лишь терминологический трёп. Но не до такой же степени

GZ>Сущности реализуемые в слое — по крайней мере не должны противоречить той цели ради которой построен слой. DTO — снимает проблему зависимости серверной бизнес-логики по данным.


Тут в соседней ветке MaximVK утверждает, что он использует DTO для того, чтобы поднять данные из базы, отправить их клиенту и там забаиндить их на грид. Т.е. его DTO участвуют в полном цикле запроса, от DAL до UI. Покажи мне здесь, пожалуйста, противоречивость и проблемы, которые снимают DTO.

GZ>Если мы не ставим себе задачу обеспечить независимость передаваемых данных от реализации бизнес-логики на сервере — хорошо. Баба с возу, кобыле легче. Заботу о формировании DTO обеспечивается стандартными средствами. Если мы должны это сделать по каким-то причинам — то это функция presentation layer.


Вообще-то, это называется контрактом. А как я уже говорил, число задач, где возникает реальная, а не высосанная из пальца необходимость в контрактах стремится к нулю.
Если нам не помогут, то мы тоже никого не пощадим.
Re[32]: DTO внутри BusinessObject
От: TK Лес кывт.рф
Дата: 12.01.07 15:44
Оценка:
Hello, "GlebZ"
> TK>Или, data слой зависит от объектов
> TK>presentation слоя и все это дело крепко замешано друг на друга?

> Для тех кто в танках, самоходках и на доблестных кораблях краснознаменного

> балтийского флота. Слой — это добровольное обязательство разработчика
> для изоляции некоторой логики находящейся между другими слоями.
> Presentation layer, или иногда именуюмый фасадным слоем — это слой
> предназначенный для защиты независимости реализации бизнес-логики сервера
> от посягательтв клиентов. Сущности реализуемые в слое — по крайней мере не
> должны противоречить той цели ради которой построен слой. DTO — снимает
> проблему зависимости серверной бизнес-логики по данным.

Круто загнул... Только что были гриды, биндинг на формочки а тут, бац... мы
уже на сервере Какой-то он слишком "жирный" этот presentaion layer при
таком подходе выходит. И данные на формочки маппит и со стороны сервера
доступ предоставляет... Не лучше бы его разделить? На сервере оставить фасад
предоставляющий сервисы, а на клиенте UI т.е. presentation. В любом случае,
не понятно как DTO снимает зависимость от серверной бизнес логики если части
клиентского presentation тоже крутятся на сервере...

> Что касается смешения соседствующих слоев, а правильнее говорить о

> зависимости — то они безусловно зависят друг от друга, и это не есть
> противоречие.

Слои должны смешиваться только в одном направлении. Если же смешение
происходит в обе стороны то, такой подход это однозначный кандидат на
очередной антипаттерн.
Posted via RSDN NNTP Server 2.0
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[33]: DTO внутри BusinessObject
От: GlebZ Россия  
Дата: 12.01.07 16:26
Оценка: 3 (1)
Здравствуйте, IT, Вы писали:

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

Без изобретения есть функциональные требования, а есть нефункциональные требования. Генерация DTO — обеспечение нефункциональных требований.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re[34]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 12.01.07 16:46
Оценка:
Здравствуйте, GlebZ, Вы писали:

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

GZ>Без изобретения есть функциональные требования, а есть нефункциональные требования. Генерация DTO — обеспечение нефункциональных требований.

Я не задавал этот вопрос. Мой вопрос был являются ли DTO частью бизнес логики или нет.

Впрочем, твой ответ, если внимательно посмотреть, лишь подтверждает мои слова
Если нам не помогут, то мы тоже никого не пощадим.
Re[33]: DTO внутри BusinessObject
От: GlebZ Россия  
Дата: 12.01.07 17:39
Оценка:
Здравствуйте, IT, Вы писали:

IT>Тут в соседней ветке MaximVK утверждает, что он использует DTO для того, чтобы поднять данные из базы, отправить их клиенту и там забаиндить их на грид. Т.е. его DTO участвуют в полном цикле запроса, от DAL до UI. Покажи мне здесь, пожалуйста, противоречивость и проблемы, которые снимают DTO.

Сложность терминологии. У него нет как таковых BE. Он начал интерпретировать данные не как объект, а как данные.

IT>Вообще-то, это называется контрактом.

Правильно. А из чего состоит контракт в общем случае? Каким образом при версионификации серверов — можно публиковать и новый и старый контракты при более новой реализации?

IT>А как я уже говорил, число задач, где возникает реальная, а не высосанная из пальца необходимость в контрактах стремится к нулю.

Повторюсь. Зависит от специфики. Охотно верю что для тебя к нулю.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re[33]: DTO внутри BusinessObject
От: GlebZ Россия  
Дата: 12.01.07 17:39
Оценка:
Здравствуйте, TK, Вы писали:

TK>Круто загнул... Только что были гриды, биндинг на формочки а тут, бац... мы

TK>уже на сервере Какой-то он слишком "жирный" этот presentaion layer при
TK>таком подходе выходит. И данные на формочки маппит и со стороны сервера
TK>доступ предоставляет... Не лучше бы его разделить? На сервере оставить фасад
TK>предоставляющий сервисы, а на клиенте UI т.е. presentation. В любом случае,
TK>не понятно как DTO снимает зависимость от серверной бизнес логики если части
TK>клиентского presentation тоже крутятся на сервере...
Есть у меня подозрение что у нас возникла сложность в терминологии. Под presentation layer не очень хороший термин, поскольку в разных технологиях обозначает разные вещи. Даю синонимы — service interface, remote facade, фасадные классы. UI — тут побоку.

TK>Слои должны смешиваться только в одном направлении. Если же смешение

TK>происходит в обе стороны то, такой подход это однозначный кандидат на
TK>очередной антипаттерн.
Нет. И к тому же это чаще просто невозможно сделать. Зависимости всегда остаются. Вызовы только с одной стороны можно сделать. Но изменение кода на одном слое могут выливаться изменения на соседних слоях.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re[35]: DTO внутри BusinessObject
От: GlebZ Россия  
Дата: 12.01.07 17:43
Оценка:
Здравствуйте, IT, Вы писали:

IT>Я не задавал этот вопрос. Мой вопрос был являются ли DTO частью бизнес логики или нет.

Ты сам дал ответ.

Бизнес логика в моём понимании — это часть системы, которая занимается реализацией функциональных требований.

DTO — это обеспечение operation requirement.

IT>Впрочем, твой ответ, если внимательно посмотреть, лишь подтверждает мои слова

Какие?
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re[36]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 12.01.07 18:40
Оценка:
Здравствуйте, GlebZ, Вы писали:

IT>>Я не задавал этот вопрос. Мой вопрос был являются ли DTO частью бизнес логики или нет.

GZ>Ты сам дал ответ.

Бизнес логика в моём понимании — это часть системы, которая занимается реализацией функциональных требований.

GZ>DTO — это обеспечение operation requirement.

Только что ты говорил, что DTO — это:

Без изобретения есть функциональные требования, а есть нефункциональные требования. Генерация DTO — обеспечение нефункциональных требований.



IT>>Впрочем, твой ответ, если внимательно посмотреть, лишь подтверждает мои слова

GZ>Какие?

Я теперь даже и сам не знаю. Ещё раз переспрошу, DTO относится к функциональным или нефункциональным требованиям?

Глеб, давай определяйся уже наконец, а то весь этот трёп уже начал утомлять
Если нам не помогут, то мы тоже никого не пощадим.
Re[37]: DTO внутри BusinessObject
От: GlebZ Россия  
Дата: 12.01.07 19:09
Оценка:
Здравствуйте, IT, Вы писали:

IT>>>Я не задавал этот вопрос. Мой вопрос был являются ли DTO частью бизнес логики или нет.

GZ>>Ты сам дал ответ.

Бизнес логика в моём понимании — это часть системы, которая занимается реализацией функциональных требований.

GZ>>DTO — это обеспечение operation requirement.

IT>Только что ты говорил, что DTO — это:

IT>

Без изобретения есть функциональные требования, а есть нефункциональные требования. Генерация DTO — обеспечение нефункциональных требований.

IT>
Вообще-то всегда был уверен что нефункциональные требования — являются переводом operation requirement

IT>Я теперь даже и сам не знаю. Ещё раз переспрошу, DTO относится к функциональным или нефункциональным требованиям?

IT>Глеб, давай определяйся уже наконец, а то весь этот трёп уже начал утомлять
Второе. Вроде и не утверждал обратного.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re[24]: DTO внутри BusinessObject
От: Mika Soukhov Stock#
Дата: 12.01.07 20:57
Оценка:
Здравствуйте, GlebZ, Вы писали:

GZ>Здравствуйте, Mika Soukhov, Вы писали:


MS>>Количество продуктов узнается перед тем, как делать запрос по выборке этих самых продуктов. Тот же paging работает по схожему методу.

GZ>Это смотря с какой стороны посмотреть. В случае 3-х звенки лучше сразу заказывать количество возвращаемых данных, и чтобы запрос вместе со страницей возвращал общее количество объектов. Потому как иначе нужно будет думать как поведет себя визуалка если между получением количества и получением последней страницы будет вставлен/удален какой-то объект.

IList<Items> GetItems(long ownerId, int pageNumber, int itemsPerPage, out totalCount)


Где здесь DTO и где возникнет ошибка?
Re[32]: DTO внутри BusinessObject
От: akasoft Россия  
Дата: 13.01.07 10:03
Оценка: +1
Здравствуйте, IT, Вы писали:

IT>Дело не в одинаковости моделей. Мы здесь спорим не об этом. Мы пытаемся понять необходимость DTO для переноса данных из одного приложения в другое.


Тогла в Янусе те самые датасеты и есть DTO почти в чистом виде. Наверняка они из чего-то другого собираются на сервере, конечно с учтом параметров, переданных Янусом, и затем по получении в нём переносятся в ЛБД с добавлениями. Напрямую они практически не используются, хотя люську я и прицепил к ним, но это также можно рассматривать как "перенос в ЛБД".

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

Получается, что DTO сделало сайт и Янус менее связными, что позволило развивать их почти независимо друг от дружки. В этом, наверное, смысл. То, что на сервере можно вычислить запросом и не кешировать в Янусе для повышения производительности стали кешировать, как то списки тем. И т.п.
... << RSDN@Home 1.2.0 alpha rev. 672>> SQL Express 2005
Re[33]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 13.01.07 19:30
Оценка: 8 (1)
Здравствуйте, akasoft, Вы писали:

A>Тогла в Янусе те самые датасеты и есть DTO почти в чистом виде.


Датасеты передаются через веб-сервис как xml-структура, которая не опысана в WSDL. Это делает их неприменимыми из других платформ кроме .NET.

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


Что значит дыры? Речь идёт о том, что дизайн и имплеинтация сервиса для януса мог бы быть значительно лучше, если бы это учитывалось изначально при разработке сайта. Но в 2000 году об офлай клиенте речи вообще не было. Для нас тогда даже форумы имели второстепенное значение, соответственно и появились они лишь бы было.

A>Получается, что DTO сделало сайт и Янус менее связными, что позволило развивать их почти независимо друг от дружки. В этом, наверное, смысл. То, что на сервере можно вычислить запросом и не кешировать в Янусе для повышения производительности стали кешировать, как то списки тем. И т.п.


Менее связными понятие очень относительное. Например, в несколько таблиц на сервере было добавлены поля timestamp исключительно для поддержки януса. Была добавлена таблица, которая отслеживала изменения/удаления топиков. Без этого нормальная синхронизация януса невозможна. При этом работа с этой таблицой делается в местах, не имеющих к янусу прямого отношения. И как это расценивать, как большую связность или как маленькую?
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[38]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 14.01.07 21:03
Оценка: 1 (1)
Здравствуйте, GlebZ, Вы писали:

GZ>Второе. Вроде и не утверждал обратного.


Т.е. необходимость в DTO диктуется нефункциональными требованиями. Другими словами с помощью DTO уменьшается трафик и количество обращений к серверу. Другой пользы от DTO нет.

Но дело в том, что без этой "пользы" легко обойтись, а вместе с "пользой" и без вреда. Например, как выяснилось MaximVK называл DTO классы своей объектной модели клиента. Т.е. он совершенно безболезненно исключил DTO, но продолжил так называть то, что уже DTO не является. DTO как паттерн появился в джаве в бинах из-за каких то там проблем сериализации. Из-за пробем, которых в .NET никогда не было. Фаулер об этом паттерне расказал, забыв при этом упомянуть реальные проблемы, и вот уже все благодарные читатели пихают DTO куда ни попадя или же называют так всё, что уходит за пределы сервера.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[39]: DTO внутри BusinessObject
От: GlebZ Россия  
Дата: 14.01.07 22:18
Оценка:
Здравствуйте, IT, Вы писали:

IT>Т.е. необходимость в DTO диктуется нефункциональными требованиями. Другими словами с помощью DTO уменьшается трафик и количество обращений к серверу. Другой пользы от DTO нет.

Ну я бы так не сказал. Лучше более обще — повышает эффективность взаимодействия клиента с сервером. Любую фичу можно описать в чистых BE, но не всегда это эффективно.

IT>Но дело в том, что без этой "пользы" легко обойтись, а вместе с "пользой" и без вреда.

Мало того. У меня есть смутное подозрение что в большинстве приложений бизнес-логика так проста, что понятие BE избыточно. А работают с "совокупностью данных заказываемых/полученных клиентом".
IT>Например, как выяснилось MaximVK называл DTO классы своей объектной модели клиента. Т.е. он совершенно безболезненно исключил DTO, но продолжил так называть то, что уже DTO не является.
Честно говоря я сам грешен. Сам из так иногда называю. Не могу подобрать нормального термина под объекты пришедшие с сервера чтобы не путаться.
IT>DTO как паттерн появился в джаве в бинах из-за каких то там проблем сериализации. Из-за пробем, которых в .NET никогда не было.
Не уверен что нету.
IT>Фаулер об этом паттерне расказал, забыв при этом упомянуть реальные проблемы, и вот уже все благодарные читатели пихают DTO куда ни попадя
+1
IT> или же называют так всё, что уходит за пределы сервера.
Мне стыдно, и я промолчу.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re[29]: DTO внутри BusinessObject
От: MaximVK Россия  
Дата: 15.01.07 04:02
Оценка: 16 (3)
Здравствуйте, IT, Вы писали:

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

Мои опасения — результат практического опыта. Основная проблема таких ошибок — они трудно уловимы, т.к. ислючение не вылетит, а поломается бизнес-логика. Т.к. частично проинициализированный объект ничем не отличается от объекта с такими же пустыми полями. Особенно активно такие ошибки вылазят в процессе поддержки приложения. Когда тут надо что-то подкрутить, там подправить, здесь учесть еще одно требование. Когда программист добавляет один маленький if по какому-то полю в одном из бизнес-компонентов, а потом выясняется, что это поле в 1% случаев бывает непроинициализированным. Твой аргумент "минусы мизерны по сравнению с плюсами" — ну никак не отвечает на вопрос, т.к. неизмерим. А на практике выясняется, что "плюсы" — это быстрое снятие 1% нагрузки на сервер, а "мизерные минусы" — это несколько баг репортов, затертые поля в базе, 3 дня работы саппорта и пара ушедших клиентов. Резюмируя:

1. Ошибки которые влечет такой подход трудно обнаружимы и не покрываются юнит-тестами.
2. Снижается универсальность бизнес-компонент в системе. Т.к. если при условии выполнения правила "все поля проинициализированы" предусловие контракта компонента выглядит как "дайте мне на вход экземпляр класса MyBE", то в случае отказа от этого правила выглядит как "дайте мне на вход экземпляр класса MyBE с проинициализированными полями p1,...pn". Думаю, не нужно пояснять, что контролировать выполнение такого контракта значительно труднее.
3. Снижается устойчивость кода к модификации, т.к. изменения совершаемые на уровне оперирования объектами должны учитывать более низкоуровневые сущности (поля объектов).
4. Попустительствование ошибкам в дизайне, связанным с удовлетворением такого нефункционального требования к системе, как производительность.
5. Усложняется паралельная разработка кода, т.к. увеличивается количество неявных условий, которые должны быть учтены программистом.
6. Усложняется процесс введения в проект новых людей, тоже по причине названной в пункте пять.

IT>Дать определение большого проекта не затруднит?

Большой проект термин, конечно, относительный. Поэтому определения не дам. Я опишу проект в котором эта проблема сказалась. Проект занял 4 года, коллектив рос от 5 до 12 человек(я считаю только программистов). Количество BE в проекте превышает 1000, не считая сторонних SDK, база состоит где-то из 500 таблиц, все это дело крутиться на 9 серверах. Большим проект назвать, конечно, трудно, а маленьким язык тоже не поворачивается.

IT>Тогда вернёмся на несколько постов назад. По-твоему, если у тебя есть объект из 30 полей, но тебе нужно только 5, то ты создаш новый объект. Если же тебе понадобились 6 полей, то ещё один объект, если 6, но других, то по объекту на каждую комбинацию, если 7, то все возможные комбинации и так далее. Я тебя правильно понимаю?


Нет, не правильно. Это крайность, которая, как и любая другая, популярна, потому что избавляет от необходимости думать, утверждая: делай всегда так и будет тебе счастье.
Для принятия правильного решения в твоем примере недостаточно информации. Для полноты картины нужно знать:
1. Процент таких случаев от общего числа использования объекта или более полно — статистика использования полей объекта на достаточно протяженном интервале работы системы.
2. Контекст использования объекта(см. мой пример с гридом).
3. Статистика распределения данных по полям объекта. Упрощенно говоря, может выясниться, что в 99% случаев использования объекта нужно поле, вес которого составляет 99% от всех данных в объекте.
Но, даже обладая такой информацией у тебя не будет формализованного механизма принятия решения(хотя его можно значительно упростить). Нахождение удачного решения — задача проектировщика и насколько успешно он с ней справиться зависит от его опыта и таланта.

Я отмечу несколько полезных, с моей точки зрения, моментов/правил при разработке классов BE которые я учитываю:
1. Есть такой эмпирический факт, что в подавляющем большинстве случаев 90% данных находяться в 10% полей класса.
2. На этапе проектирования можно выделять особо жирные поля в отдельные классы. Например, в классах часто встречается поле Description, которое весит в десятки или сотни раз больше чем все остальные поля класса вместе взятые. Скорее всего, этот самый Descrption будет востребован лишь когда его будет редактировать/просматривать пользователь. Создайте отдельный класс для таких desciption-ов и вместо поля string в BE используйте его.
3. По возможности избегать создания классов с большим количеством полей.
4. Если есть плоский класс с большим количеством полей, то имеет смысл его отрефакторить и сделать композитным. Наиболее часто используемые поля оставить в самом классе, а остальные поля разбить на группы и вынести в другие классы.
5. Используйте или напишите средство профилирования, которое позволит оценить как часто и какие группы полей используются для каждой BE. В каком контексте они используются. Эти данные позволяют обоснованно(sic!) принять решение о необходимости рефакторинга кода.
6. Ну и уже заезженное правило, не оптимизировать пока не появиться в этом необходимость.


IT>Так в чём проблема? Если речь идёт о большом проекте, то сопроводи свой метод спецификаций.

Если мы говорим о внешнем API — то это само-собой разумеющийся факт. А вот для кода внутри системы — это ничего не даст, все равно придется анализировать цепочку возможных вызовов. Я правлю какой-нить метод бизнес логики который получает на вход BE. В результате правки в методе используется на одно поле этой BE больше. Следуя твоей логике, я должен просмотреть все цепочки вызовов этого метода от момента создания и инициализации BE. После чего прочитать спецификацию по методам инициализации.

IT>Блин, ну вот опять начинается Как же они не принимают участие во внутренних процессах, если задача внутренных процессов как раз и заключается в том, чтобы создать структуру из таких объектов и вернуть её клиенту. Это и есть работа этих самых внутренных процессов.

IT>Эти изменения прежде всего неразрывно связаны с изменением логики работы сервера.

Требования к таким классам близки к требованиям к внешнему API системы. Изменения API и изменение внутренней логики, бесспорно, могут зависеть друг от друга, но это не является правилом. В данном случае я делаю допущение, что изменения в коде связанные с изменением ответа от API(скажем, еще одно поле в ответ добавили) не относятся к изменению "внутренней логики работы сервера".

IT>И почему же они тогда не разделены?

Где они не разделены?


P.S. Напоследок позволю себе небольшую аналогию, раз уж в топике поднялся вопрос о функциональных и нефункциональных требованиях. Я думаю, многим доводилось крутить в руках деталь какого-нибудь хитрого механизма. Эта деталь может иметь какую-нибудь загогулистую форму, а ее назначение, скажем, хитро передавать вращательный момент. "Хитро передавать вращательный момент" — это функциональные требования к этой детали и ее форма определяется именно им. Если расмотреть деталь поближе, то выясняется что она композитна и состоит из каких-то дополнительных втулок, хомутов и т.д. На первый взгляд, необходимости в этих сложностях нет, можно было отлить все единой загогулиной. Но если присмотреться, то выясняется, что эти самые втулки, хомуты, прокладки находяться в местах повышенного трения или усиленной нагрузки. Сделано это с целью удовлетворения уже нефункциональных требований: износостойкость, ремонтопригодность, надежность. Замечу, что необходимость многих этих втулок выяснилась уже в ходе эксплуатации механизма, т.к. при первичном проектировании все учесть крайне тяжело. В проектировании классов наших BE фактически все тоже самое. Первоначально класс появляется в результате анализа функциональных требований. Это может быть обыкновенный плоский класс из 20 полей. В дальнейшем этот класс может быть разбит на несколько классов, у него появяться дополнительные поля, а некоторые поля будут сгруппированы в новые классы. Все эти изменения произойдут с целью удовлетворения нефункциональных требований и необходимость многих из них выяснится только в ходе эксплуатации системы.
Re[30]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 15.01.07 05:53
Оценка:
Здравствуйте, MaximVK, Вы писали:

MVK> Мои опасения — результат практического опыта. Основная проблема таких ошибок — они трудно уловимы, т.к. ислючение не вылетит, а поломается бизнес-логика. Т.к. частично проинициализированный объект ничем не отличается от объекта с такими же пустыми полями. Особенно активно такие ошибки вылазят в процессе поддержки приложения. Когда тут надо что-то подкрутить, там подправить, здесь учесть еще одно требование. Когда программист добавляет один маленький if по какому-то полю в одном из бизнес-компонентов, а потом выясняется, что это поле в 1% случаев бывает непроинициализированным. Твой аргумент "минусы мизерны по сравнению с плюсами" — ну никак не отвечает на вопрос, т.к. неизмерим. А на практике выясняется, что "плюсы" — это быстрое снятие 1% нагрузки на сервер,


1% нагрузки, даже 5% лично меня вообще не волнуют. Если бороться, то за минимум за 20. Плюсы — это maintenance. Если у меня одно представление данных, то мне нужно сопровождать ровно одно, если у меня их пять, то работы будет в пять раз больше.

MVK>а "мизерные минусы" — это несколько баг репортов, затертые поля в базе, 3 дня работы саппорта и пара ушедших клиентов.


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

Мои опасения — результат практического опыта. Основная проблема таких ошибок — они трудно уловимы, т.к. ислючение не вылетит, а поломается бизнес-логика. Т.к. частично проинициализированный объект ничем не отличается от объекта с такими же пустыми полями. Особенно активно такие ошибки вылазят в процессе поддержки приложения. Когда тут надо что-то подкрутить, там подправить, здесь учесть еще одно требование. Когда программист добавляет один маленький if по какому-то полю в одном из бизнес-компонентов, а потом выясняется, что это поле в 1% случаев бывает непроинициализированным.

Твои слова один в один применимы к данной ситуации.

Забытый класс гораздо труднее найти, особенно, если он писался не тобой. В этом случае ты фактически вообще без понятия есть ли ещё какие-либо представления тех же самых данных в программе. На сегодняшний день мы имеем два места в коде, где у нас полностью отсутствует типизация и можно полагаться только на себя — это DAL и баиндинг типов на формы. Первое возможно в скором времени можно будет решить с помощью метапрограммирования, со вторым пока сложнее. Так вот, увеличивая количество типов в программе, связанных с этими вещами ты пропорционально увеличиваешь проблемы при сопровождении.

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

MVK>Резюмируя:


MVK>1. Ошибки которые влечет такой подход трудно обнаружимы и не покрываются юнит-тестами.


Обнаруживаются элементарно даже если тестируются сценарии.

MVK>2. Снижается универсальность бизнес-компонент в системе. Т.к. если при условии выполнения правила "все поля проинициализированы" предусловие контракта компонента выглядит как "дайте мне на вход экземпляр класса MyBE", то в случае отказа от этого правила выглядит как "дайте мне на вход экземпляр класса MyBE с проинициализированными полями p1,...pn". Думаю, не нужно пояснять, что контролировать выполнение такого контракта значительно труднее.


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

MVK>3. Снижается устойчивость кода к модификации, т.к. изменения совершаемые на уровне оперирования объектами должны учитывать более низкоуровневые сущности (поля объектов).


Этого утверждения не понял.

MVK>4. Попустительствование ошибкам в дизайне, связанным с удовлетворением такого нефункционального требования к системе, как производительность.


При чём тут производительность тоже не понял.

MVK>5. Усложняется паралельная разработка кода, т.к. увеличивается количество неявных условий, которые должны быть учтены программистом.

MVK>6. Усложняется процесс введения в проект новых людей, тоже по причине названной в пункте пять.

Это всё ерунда, по сравнению с введением новых типов на каждый чих.

IT>>Тогда вернёмся на несколько постов назад. По-твоему, если у тебя есть объект из 30 полей, но тебе нужно только 5, то ты создаш новый объект. Если же тебе понадобились 6 полей, то ещё один объект, если 6, но других, то по объекту на каждую комбинацию, если 7, то все возможные комбинации и так далее. Я тебя правильно понимаю?


MVK>Нет, не правильно. Это крайность, которая, как и любая другая, популярна, потому что избавляет от необходимости думать, утверждая: делай всегда так и будет тебе счастье.


Т.е. в некоторых случаях ты всё же добавишь поле вместо создания нового типа

MVK>Для принятия правильного решения в твоем примере недостаточно информации. Для полноты картины нужно знать:

MVK>1. Процент таких случаев от общего числа использования объекта или более полно — статистика использования полей объекта на достаточно протяженном интервале работы системы.

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

MVK>2. Контекст использования объекта(см. мой пример с гридом).

MVK>3. Статистика распределения данных по полям объекта. Упрощенно говоря, может выясниться, что в 99% случаев использования объекта нужно поле, вес которого составляет 99% от всех данных в объекте.
MVK>Но, даже обладая такой информацией у тебя не будет формализованного механизма принятия решения(хотя его можно значительно упростить). Нахождение удачного решения — задача проектировщика и насколько успешно он с ней справиться зависит от его опыта и таланта.

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

MVK>Я отмечу несколько полезных, с моей точки зрения, моментов/правил при разработке классов BE которые я учитываю:

MVK>1. Есть такой эмпирический факт, что в подавляющем большинстве случаев 90% данных находяться в 10% полей класса.
MVK>2. На этапе проектирования можно выделять особо жирные поля в отдельные классы. Например, в классах часто встречается поле Description, которое весит в десятки или сотни раз больше чем все остальные поля класса вместе взятые. Скорее всего, этот самый Descrption будет востребован лишь когда его будет редактировать/просматривать пользователь. Создайте отдельный класс для таких desciption-ов и вместо поля string в BE используйте его.
MVK>3. По возможности избегать создания классов с большим количеством полей.
MVK>4. Если есть плоский класс с большим количеством полей, то имеет смысл его отрефакторить и сделать композитным. Наиболее часто используемые поля оставить в самом классе, а остальные поля разбить на группы и вынести в другие классы.
MVK>5. Используйте или напишите средство профилирования, которое позволит оценить как часто и какие группы полей используются для каждой BE. В каком контексте они используются. Эти данные позволяют обоснованно(sic!) принять решение о необходимости рефакторинга кода.
MVK>6. Ну и уже заезженное правило, не оптимизировать пока не появиться в этом необходимость.

Всё это лишь способстует увеличению количества типов в системе, что само по себе есть зло. Да и не понимаю я, зачем мне разбивать сущность на три типа, если они никогда не используются раздельно. Глупости это всё. Хотя если вам платят за строчки кода, то why бы и not.

IT>>Так в чём проблема? Если речь идёт о большом проекте, то сопроводи свой метод спецификаций.

MVK>Если мы говорим о внешнем API — то это само-собой разумеющийся факт. А вот для кода внутри системы — это ничего не даст, все равно придется анализировать цепочку возможных вызовов. Я правлю какой-нить метод бизнес логики который получает на вход BE. В результате правки в методе используется на одно поле этой BE больше. Следуя твоей логике, я должен просмотреть все цепочки вызовов этого метода от момента создания и инициализации BE. После чего прочитать спецификацию по методам инициализации.

Ну откуда я знаю? Приводи код будем разбираться что с ним делать.

IT>>Блин, ну вот опять начинается Как же они не принимают участие во внутренних процессах, если задача внутренных процессов как раз и заключается в том, чтобы создать структуру из таких объектов и вернуть её клиенту. Это и есть работа этих самых внутренных процессов.

IT>>Эти изменения прежде всего неразрывно связаны с изменением логики работы сервера.

MVK>Требования к таким классам близки к требованиям к внешнему API системы. Изменения API и изменение внутренней логики, бесспорно, могут зависеть друг от друга, но это не является правилом. В данном случае я делаю допущение, что изменения в коде связанные с изменением ответа от API(скажем, еще одно поле в ответ добавили) не относятся к изменению "внутренней логики работы сервера".


И в чём проблема?

IT>>И почему же они тогда не разделены?

MVK>Где они не разделены?

Да, где?

MVK>В проектировании классов наших BE фактически все тоже самое. Первоначально класс появляется в результате анализа функциональных требований. Это может быть обыкновенный плоский класс из 20 полей. В дальнейшем этот класс может быть разбит на несколько классов, у него появяться дополнительные поля, а некоторые поля будут сгруппированы в новые классы. Все эти изменения произойдут с целью удовлетворения нефункциональных требований и необходимость многих из них выяснится только в ходе эксплуатации системы.


Такая необходимость возникает крайне редко и связана она в основном, простите за каламбур, со связями внутри объекта, которые пораждаются обилием и разнообразием типов в приложении. Меньше типов — меньше связности. Добавление одного поля — это детский сад по сравнению с добавлением новго типа.

ЗЫ. Впрочем, мы уже отвлеклись от заданной темы. DTO к этому отношения не имеет. Добавление поля vs. добавление типа это уже совсем другая история. И если я категорически против DTO, то добавление нового типа, в случае необходимости, не считаю жутким преступлением.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[34]: DTO внутри BusinessObject
От: Blazkowicz Россия  
Дата: 15.01.07 10:38
Оценка:
Здравствуйте, GlebZ, Вы писали:

GZ>Нет. И к тому же это чаще просто невозможно сделать. Зависимости всегда остаются. Вызовы только с одной стороны можно сделать. Но изменение кода на одном слое могут выливаться изменения на соседних слоях.


Зависимости остаются, но они должны быть односторонними. Ты же выше сказал "зависят друг от друга", что подразумевает двухстороннюю зависимость и не есть хорошо.
Re[31]: DTO внутри BusinessObject
От: MaximVK Россия  
Дата: 15.01.07 12:15
Оценка:
Здравствуйте, IT, Вы писали:

Видимо происходит некоторое непонимание. Есть единственный случай, когда я считаю разумным дублирование полей в новых сущностях — это опять же мой пример с гридом. Т.е. классов, которые, фактически, эквиваленты view в базе данных. Я против создания классов вида MyClassView1, MyClassView2 и т.д. которые будут описывать разные наборы полей одного и того же класса MyClass — т.к. это действительно увеличивает сложность. Я утверждаю, что при грамотном подходе частичной загрузки объекта можно избежать через разбиение (а не создание различных представлений) класса на несколько и использовании композита. Т.е. был MyClass с 30 полями, а стал скажем класс MyClass c 12 полями из которых два MyClassPart1 и MyClassPart2 содержат остальные поля. Более того, частичная загрузка до того простой механизм, что им пользуются даже не особо задумываясь — даст ли это хоть какое-то преимущество.

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


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

IT>Твои сопровождения тоже справедливы, но они не так страшны. Попробуй добавить ещё одно поле в любой из своих типов и ты увидишь, что не изменилось ровным счётом ничего. Вообще ничего. А теперь попробуй переименовать одно поле в базе данных и сравни количество работы, необходимой для корректировки этого изменения по всему коду для одного типа данных и, например, для пяти.

Опять же в свете сказанного выше такая проблема не возникнет.

IT>Обнаруживаются элементарно даже если тестируются сценарии.

IT>Это выглядит как дайте мне данные и никак иначе. Добавление нового и изменение старого функционала должно вообще-то хотя бы как-нибудь тестироваться. Проблемы, о которых ты говоришь вылезут моментально. Но скорее всего ничего не случится, т.к. добавление нового поля в сущность не ломает старого кода.

Определенно, такой код сложнее поддается тестированию.

MVK>>3. Снижается устойчивость кода к модификации, т.к. изменения совершаемые на уровне оперирования объектами должны учитывать более низкоуровневые сущности (поля объектов).

IT>Этого утверждения не понял.
Следуя правилу "все поля объекта должны быть загружены" я могу оперировать объектами, забыв о полях. А ты фактически оперируешь группами полей, хотя передаешь везде объекты.

IT>При чём тут производительность тоже не понял.

Частичная загрузка объектов призвана снизить нагрузку на сервер с целью увеличения производительности. Необходимость частичной загрузки может быть вызвана кривизной дизайна класса (ну скажем, в классе Order поля отвечающие за доставку заказа не выделены в отдельный класс), но вместо того чтобы правильно перепроектировать класс мы заткнем проблему частичной загрузкой.

IT>Т.е. в некоторых случаях ты всё же добавишь поле вместо создания нового типа

Разумеется.

IT>Случаи всегда возникают по одному. Второй всегда возникает после первого, третий после второго. Сколько их будет никому заранее не известно. А если бы было известно, то это надо бы было заранее учитывать в дизайне.

Это верно и для частичной загрузки класса за исключением дизайна.

IT>Проектировщик не всегда обладает всей информацией. Точнее почти всегда ей не обладает. Дизайн системы не только должен удовлетворять текущим функциональным требованиям, но и быть готовым к добавлению новых и изменению существующих. Обилие типов в системе вовсе не способствует этому требованию.


На самом деле количество типов в системе не так сильно увеличивается. Ну было 100, стало 120-130. Наиболее жирные классы представлены как композиты. Для наиболее жирных полей(аля Description) определены свои типы и унифицированы механизмы работы с такими типами. При этом выделения нескольких полей класса ClassA в новый класс ClassB приводит лишь к появлению связи класса ClassB с классом ClassA.

IT>Всё это лишь способстует увеличению количества типов в системе, что само по себе есть зло. Да и не понимаю я, зачем мне разбивать сущность на три типа, если они никогда не используются раздельно. Глупости это всё. Хотя если вам платят за строчки кода, то why бы и not.

Если никогда не используется раздельно — то и не надо

IT>Такая необходимость возникает крайне редко и связана она в основном, простите за каламбур, со связями внутри объекта, которые пораждаются обилием и разнообразием типов в приложении. Меньше типов — меньше связности. Добавление одного поля — это детский сад по сравнению с добавлением новго типа.

Я не согласен с "меньше типов лучше". Мы же разносим по каким-то загадочным причинам тип Address и тип Order, создавая в Order-e поле ShippingAddress типа Address. Появление нового типа должно быть обоснованным. Я считаю, что первичное выделение типов основывается на анализе функциональных требований к системе и предметной области, а затем еще раз, но уже основанное на анализе нефункциональных требований.


IT>ЗЫ. Впрочем, мы уже отвлеклись от заданной темы. DTO к этому отношения не имеет. Добавление поля vs. добавление типа это уже совсем другая история. И если я категорически против DTO, то добавление нового типа, в случае необходимости, не считаю жутким преступлением.


Да, согласен. Тем не менее беседа получилась для меня познавательная
Re[35]: DTO внутри BusinessObject
От: GlebZ Россия  
Дата: 15.01.07 13:27
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Зависимости остаются, но они должны быть односторонними. Ты же выше сказал "зависят друг от друга", что подразумевает двухстороннюю зависимость и не есть хорошо.

Хоть не всегда получается как хотелось бы, но в принципе ты прав.
Re[34]: DTO внутри BusinessObject
От: akasoft Россия  
Дата: 15.01.07 19:06
Оценка:
Здравствуйте, IT, Вы писали:

IT>Датасеты передаются через веб-сервис как xml-структура, которая не опысана в WSDL. Это делает их неприменимыми из других платформ кроме .NET.


Почему? Можно же парсить вручную. Впрочем, это не та тема.

IT>Что значит дыры?


Ну, я так понял, что ты утверждаешь
Автор: IT
Дата: 09.01.07
, что ДТО обычно используется для затыкания дыр в архитектуре. Вот, я её не вижу. Потому интересуюсь, куда глядеть, чтобы увидеть то же, что и ты.

IT> Речь идёт о том, что дизайн и имплеинтация сервиса для януса мог бы быть значительно лучше, если бы это учитывалось изначально при разработке сайта. Но в 2000 году об офлай клиенте речи вообще не было.


Это понятно.

IT>Менее связными понятие очень относительное. Например, в несколько таблиц на сервере было добавлены поля timestamp исключительно для поддержки януса. Была добавлена таблица, которая отслеживала изменения/удаления топиков. Без этого нормальная синхронизация януса невозможна. При этом работа с этой таблицой делается в местах, не имеющих к янусу прямого отношения.


Ты мне расказываешь про развитие, как принято говорить, "движка форума". Само собой появившияся Янус потребовал учитывать свой собственный минимальный набор, при котором ещё возможно его функционирование. Но ведь Янус не мог появится без этого минимума в принципе. А в пределах контракта сервер и клиент (Янус) могли развиваться неортогонально друг другу.

Ну и кроме того, разве система отслеживания изменений в сообщениях не нужна для вебинтерфейса и, в частности, для модерирования/администрирования? Ведь без надлежащего учёта будет бардак.

IT> И как это расценивать, как большую связность или как маленькую?


Есть система со своим движком форумов. Она предоставляет вебслужбу (контракт) для удалёного взимодействия с собой. Есть Янус, который этот контракт использует. Развитие обоих взаимодействующих по контракту частей может идти и без учёта друг дружки, но при условии соблюдения контракта.

Связность имеет место быть. Сильная она или слабая? А вот шут его. Я ещё путаюсь в терминологии. Хотел с твоей помощью разобраться.

Если при изменениях (сервера, Януса) не затрагивается контракт, то зависимость слабая. Если же изменения требуют больших затрат на приведение кода в соответсвие контрату, то зависимость сильная.

У меня логическое (или терминологическое) противоречие. Помоги разрешить.
... << RSDN@Home 1.2.0 alpha rev. 672>> SQL Express 2005
Re[35]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 16.01.07 01:22
Оценка: 94 (8)
Здравствуйте, akasoft, Вы писали:

IT>>Датасеты передаются через веб-сервис как xml-структура, которая не опысана в WSDL. Это делает их неприменимыми из других платформ кроме .NET.

A>Почему? Можно же парсить вручную. Впрочем, это не та тема.

Как минимум это косяк.

IT>>Что значит дыры?


A>Ну, я так понял, что ты утверждаешь
Автор: IT
Дата: 09.01.07
, что ДТО обычно используется для затыкания дыр в архитектуре. Вот, я её не вижу. Потому интересуюсь, куда глядеть, чтобы увидеть то же, что и ты.


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

A>Ты мне расказываешь про развитие, как принято говорить, "движка форума". Само собой появившияся Янус потребовал учитывать свой собственный минимальный набор, при котором ещё возможно его функционирование. Но ведь Янус не мог появится без этого минимума в принципе. А в пределах контракта сервер и клиент (Янус) могли развиваться неортогонально друг другу.


Против это никто не возражает, пусть себе развиваются. Только вот без изменения сервера работа януса была бы не возможна в принципе. Т.е. любая независимость весьма условная вещь. А раз так, то нет никакого смысла бороться за эту независимость изо всех сил. Если что-то проще и эффективнее сделать для януса на сервере, то это надо делать на сервере. Об этом я и говорю.

A>Ну и кроме того, разве система отслеживания изменений в сообщениях не нужна для вебинтерфейса и, в частности, для модерирования/администрирования? Ведь без надлежащего учёта будет бардак.


В существующей архитектуре не нужна. Зато для веба нужен пейджинг почти для всех методов. Для януса не нужен, а для веба нужен. Это опять к слову о независимости клиентов от сервера.

IT>> И как это расценивать, как большую связность или как маленькую?


A>Есть система со своим движком форумов. Она предоставляет вебслужбу (контракт) для удалёного взимодействия с собой. Есть Янус, который этот контракт использует. Развитие обоих взаимодействующих по контракту частей может идти и без учёта друг дружки, но при условии соблюдения контракта.


У нас не стоит задачи предоставить вебслужбу (контракт) для удалённого взаимодействия с собой. У нас стоит задача обеспечить соответствующими сервисами янус, веб и NNTP клиентов. Контракт — это очень здорово, это позволяет максимально изолировать различные части системы друг от друга. Мне это всё очень нравится как правильный паттерн и хороший инструмент для достижения обеспечения более простого сопровождения. Но при всём при этом это всего лишь инструмент и относится к нему нужно соответственно.

A>Связность имеет место быть. Сильная она или слабая? А вот шут его. Я ещё путаюсь в терминологии. Хотел с твоей помощью разобраться.


A>Если при изменениях (сервера, Януса) не затрагивается контракт, то зависимость слабая. Если же изменения требуют больших затрат на приведение кода в соответсвие контрату, то зависимость сильная.


A>У меня логическое (или терминологическое) противоречие. Помоги разрешить.


Я думаю, что у тебя наблюдается некоторая путаница с системой твоих приоритетов. Это потребует некоторого объяснения. Я уже много раз об этом безуспешно говорил, например, здесь
Автор: IT
Дата: 10.11.05
, здесь
Автор: IT
Дата: 21.08.06
, здесь
Автор: IT
Дата: 07.05.05
. Но можно попробовать ещё раз

Итак, проблема в том, что нам постоянно, решая те или иные задачи, приходится выбирать между двумя или более решениями. Чаще всего этот выбор тривиален, иногда довольно труден, а порой вообще невозможно спрогнозировать к чему приведёт то или иное решение. Всё это усугубляется ещё и тем, что одно и тоже решение в разных ситуациях может оказаться как плохим так и хорошим. Однажды мне всё это надоело и я разработал для себя набор простых правил, которые в 99% случаев позволяют быстро принять более менее адекватное решение. А так же уже после принятия какого-либо решения при изменении определённых условий с чистой совестью "поступиться принципами", отменить ранее принятое решение и принять другое.

Базируется это хозяйство на очень простой системе приоритетов и разрешения противоречий. Список приоритетов у меня такой:

1. Функциональные требования.
2. Нефункциональные требования.
3. Сопровождаемость системы.

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

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

Что это значит? Это значит, что наша главная задача — это реализация функционала. Не создание объектной модели, не определение контракта, не использование паттернов, а реализация функционала. Если у нас есть какой-то контракт и для добавления нового функционала его нужно изменить или переделать, то его нужно изменить или переделать. Вообще, неследование этому правилу очень часто наблюдается у молодёжи. Зачастую паттерны, polymorphic behaviour, контракты, структура базы данных или объектной модели и т.п. ставятся выше главных целей, выше разработки функциональности системы. В результате функционал начинает подгоняться под контракты и модели, что в свою очередь ведёт к краху. Типичная подмена целей и приоритетов.

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

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

Так же стоит понимать, что иногда наши изменения могут стоить слишком дорого, в этом случае стоит задуматься о их целесообразности вообще.

Возникает вопрос, а бывают ли исключения? Нет, исключений не бывает. Бывает переход задач в категорию функциональных / нефункциональных требований. Например, в некоторых системах публичный контракт является тем, для чего собственно сама система и делается. Тогда контракт со всеми вытекающими последствиями переводится в разряд функциональных требований и ему начинает подчиняться всё остальное. Бывает, когда чистота и непротиворечивость объектной модели становятся так же функциональным требованием. Возьмём к примеру .NET Framework или любые другие публичные библиотеки. В таких случаях, к объектным моделям и интрефейсам предъявляются особые требованмя. Например, для обеспечения согласованности объектной модели в .NET в своё время в MS была организована целая группа, главной задачей которой была разработка рекомендаций и обеспечение надзора за соблюдением требованмй к публичным интерфейсам.

Очевидно, что в твоём случае ты не можешь определиться с тем, как ты позиционируешь для себя веб-сервис януса. Является ли он для тебя чем-то вроде функциональных требований или нет. Лично для меня он таковым не является. Для меня это всего лишь инструмент для достижения необходимой функциональности. А раз так, то я не вижу большого смысла с ним церемониться. Я за то, чтобы контракт был, чтобы он был продуман и удобен в использовании, но это для меня не главный приоритет, это лишь следствие из моих правил, и до тех пор пока оно не противоречит самим правилам, я буду ему следовать, но принесу его в жертву более приоритетным вещам не задумываясь. Если же ты, например, решишь для себя, что веб-сервим януса должен быть вынесен на уровень функциональных требований, то нам с тобой договариваться о деталях уже не будет иметь никакого смысла. Бесполезно спорить о мелочах, не договорившись о главных приоритетах. Если же ты решишь наоборот, то очень скоро увидишь, что гораздо важнее не сам по себе контракт, а простота сопровождения интерфеса между сервером и янусом.

Вот такой набор правил. Пожалуй главное, что он мне даёт — это возможность быстро принимать решения и также быстро от них отказываться и принимать другие, наиболее подходящие, если меняются требования или появляется дополнительная информация. Это не значит, что я вот такой непостоянный. Это значит, что у меня нет идолов в коробке с инструментами, моя главная и единственная задача — написать требуемый функционал, который бы хорошо работал и который было бы легко сопровождать. И этому всё подчинено.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[31]: DTO внутри BusinessObject
От: Gollum Россия  
Дата: 16.01.07 07:21
Оценка: 8 (1) :)
Здравствуйте, IT, Вы писали:

IT>Всё это лишь способстует увеличению количества типов в системе, что само по себе есть зло. Да и не понимаю я, зачем мне разбивать сущность на три типа, если они никогда не используются раздельно. Глупости это всё. Хотя если вам платят за строчки кода, то why бы и not.


Читаю я тут все это, читаю... По-моему, тут просто терминологическая путаница. Сам же писал
Автор: IT
Дата: 06.09.06
, еще недавно:

Бизнес сущности, они же Domain Entities, они же Data Transfer Objects (DTO).


Видимо конечно правильно определять DTO как сущности, введенные только для того, чтобы передавать данные. Но вот я лично до того как прочел эту дискуссию считал BE и DTO синонимами По-моему отсюда и происходит путаница, ты говоришь про одно, а твои собеседники про другое.
Скорость перебора паролей прямо пропорциональна квадрату температуры утюга...
Eugene Agafonov on the .NET

Re[32]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 16.01.07 15:01
Оценка:
Здравствуйте, Gollum, Вы писали:

G>Читаю я тут все это, читаю... По-моему, тут просто терминологическая путаница.


100%. При чём, заметь, я постоянно пытаюсь уточнить что я под этим понимаю.

Сам же писал
Автор: IT
Дата: 06.09.06
, еще недавно:

G>

Бизнес сущности, они же Domain Entities, они же Data Transfer Objects (DTO).


Когда я это писал ещё не все дочитали до конца Фаулера.

G>Видимо конечно правильно определять DTO как сущности, введенные только для того, чтобы передавать данные. Но вот я лично до того как прочел эту дискуссию считал BE и DTO синонимами По-моему отсюда и происходит путаница, ты говоришь про одно, а твои собеседники про другое.


Посмотри на название топика. Как ты думаешь, что оно означает? Из-за этого я и завёлся. А потом уже началась неразбериха с терминологией.
Если нам не помогут, то мы тоже никого не пощадим.
Re[33]: DTO внутри BusinessObject
От: Mika Soukhov Stock#
Дата: 16.01.07 15:22
Оценка:
Здравствуйте, IT, Вы писали:

IT>Сам же писал
Автор: IT
Дата: 06.09.06
, еще недавно:


G>>

Бизнес сущности, они же Domain Entities, они же Data Transfer Objects (DTO).


IT>Когда я это писал ещё не все дочитали до конца Фаулера.


Сейчас-то дочитал до конца?
Re[34]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 16.01.07 16:03
Оценка:
Здравствуйте, Mika Soukhov, Вы писали:

IT>>Когда я это писал ещё не все дочитали до конца Фаулера.


MS>Сейчас-то дочитал до конца?


Типа подколол, молодец, смешно.

Фаулер, конечно, грамотный мужик, но его всегда выдавало его джавовское прошлое. Лучше читать майкрософтовские практики, особенно ранние. Они и появились раньше и чуши типа DTO в них поначалу не было.
Если нам не помогут, то мы тоже никого не пощадим.
Re[35]: DTO внутри BusinessObject
От: Mika Soukhov Stock#
Дата: 16.01.07 16:32
Оценка:
Здравствуйте, IT, Вы писали:

IT>Фаулер, конечно, грамотный мужик, но его всегда выдавало его джавовское прошлое.


На архитектуру это не особо влияет. Мне больше мелкие моменты у него не нравились, да и все, что связано с Remote Interfaces.

IT>Лучше читать майкрософтовские практики, особенно ранние. Они и появились раньше и чуши типа DTO в них поначалу не было.


Тут тоже не все так гладко. В начале практики напирали на ООП подход, затем на сервисный. + для меня была в свое время путаница с оракловой терминологией (у них есть свой СОА).

Фаулер все же более понятливый автор. Не боится засучить рукава, и полезть разгребать. Плюс обилие примеров помогает легче понять, нежели тот же практик от МС, где демо идет в конце, а не поэтапно.
Re[36]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 16.01.07 16:55
Оценка:
Здравствуйте, Mika Soukhov, Вы писали:

IT>>Фаулер, конечно, грамотный мужик, но его всегда выдавало его джавовское прошлое.


MS>На архитектуру это не особо влияет.


На архитектуру влияет всё и уж тем более платформа. Другое дело, что у .NET и джавы много общего, больше, например, чем у .NET и COM. Но разница есть и уши местами торчат.

MS>Фаулер все же более понятливый автор. Не боится засучить рукава, и полезть разгребать. Плюс обилие примеров помогает легче понять, нежели тот же практик от МС, где демо идет в конце, а не поэтапно.


Мне у него больше всего нравятся определения. То же определение архитектуры — кратко, ёмко и удивительно точно.
Если нам не помогут, то мы тоже никого не пощадим.
Re[36]: DTO внутри BusinessObject
От: akasoft Россия  
Дата: 16.01.07 16:55
Оценка:
Здравствуйте, IT, Вы писали:

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


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

А новый сервис был сделан уже с учётом этого? Хотя, ты уже писал, что с ним не разбирался...

IT>Зато для веба нужен пейджинг почти для всех методов. Для януса не нужен, а для веба нужен. Это опять к слову о независимости клиентов от сервера.


Пейджинг — разбиение на страницы?


IT>У нас не стоит задачи предоставить вебслужбу (контракт) для удалённого взаимодействия с собой. У нас стоит задача обеспечить соответствующими сервисами янус, веб и NNTP клиентов. Контракт — это очень здорово, это позволяет максимально изолировать различные части системы друг от друга. Мне это всё очень нравится как правильный паттерн и хороший инструмент для достижения обеспечения более простого сопровождения. Но при всём при этом это всего лишь инструмент и относится к нему нужно соответственно.


Насчёт задачи согласен. А разве контракт не является способом её решения? Или так: есть другие способы решения этой задачи?

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

IT>Я думаю, что у тебя наблюдается некоторая путаница с системой твоих приоритетов. Это потребует некоторого объяснения. Я уже много раз об этом безуспешно говорил, например, здесь
Автор: IT
Дата: 10.11.05
, здесь
Автор: IT
Дата: 21.08.06
, здесь
Автор: IT
Дата: 07.05.05
. Но можно попробовать ещё раз


Большое спасибо за ссылки и за объяснение.

IT>1. Функциональные требования.

IT>2. Нефункциональные требования.
IT>3. Сопровождаемость системы.

Функциональные — значат, что должен делать или чего не делать разрабатываемый продукт.

Нефункциональные — где он это должен делать или не делать. Выбор платформы (ОС, среда программирования, язык, библиотеки, алгоритмы, ...) для реализации функциональных требования относится к нефункциональным требованиям?

С сопровождением мне как бы всё понятно.

Эти определения подходят или нужно уточнить?


IT>Очевидно, что в твоём случае ты не можешь определиться с тем, как ты позиционируешь для себя веб-сервис януса.


Для меня он жизненно необходим. Т.е. в случае его отключения наступит ломка, и придётся забыть о форумах РСДН. Ну, либо домогаться по нескольким хорошо известным адресам его включения. После тех удобств, что предоставляет мне лично Янус, веб-мордой пользоваться я просто не могу.


Но возвращаясь к вопросу большей и меньшей связанности, не хочешь ли ты мне так длинно сказать (ну, чтобы я сам попробовал сделать вывод), что собствеено пофигу, есть или нет этой связности. Что это для функционала Януса и сервера вовсе не важно и дело сотого порядка. И собственно, обсуждать такие малозначимые вопросы — просто терять время, ну или мозг разминать, если больше нечем занятся.

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

IT> ...моя главная и единственная задача — написать требуемый функционал, который бы хорошо работал и который было бы легко сопровождать. И этому всё подчинено.


Это надо написать большими буковами и поместить на самое видное место.
... << RSDN@Home 1.2.0 alpha rev. 672>> SQL Express 2005
Re[37]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 16.01.07 18:08
Оценка: 22 (2)
Здравствуйте, akasoft, Вы писали:

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


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

A>Пейджинг — разбиение на страницы?


Да.

A>Насчёт задачи согласен. А разве контракт не является способом её решения?


Является.

A>Или так: есть другие способы решения этой задачи?


Если под контрактом понимать веб-сервис и WSDL, то другие способы, конечно же есть. В том числе более эффективные, но менее кошерные. Например, избыточность XML можно убрать с помощью своего доморощенного формата передачи, допустим по записи на строку с запятой в качестве разделителя. Объём передаваемых данных уменьшиться в несколько раз. Можно применить маппер, который не будет создавать промежуточных структур данных. Т.е. прямо из ридера рекордсета данные будут прямиком уходит в html стрим. Т.е. на сервере не будет тратится лишнее время и память на преобразование данных из формата БД в формат объектной модели. На клиенте html стрим также без лишних ресурсов можно мапить прямо в БД клиента.

У этого решения есть свои недостатки, но есть и свои преимущества. Но как минимум это альтернативный способ.

A>Поверь, у меня нет иллюзий на счёт использования правильных инструментов, лично я использую те, которыми владею и настолько, насколько владею. Если цель в принципе достижима с их использованием.


Это хорошо

A>Эти определения подходят или нужно уточнить?


Сойдёт.

IT>>Очевидно, что в твоём случае ты не можешь определиться с тем, как ты позиционируешь для себя веб-сервис януса.


A>Для меня он жизненно необходим. Т.е. в случае его отключения наступит ломка, и придётся забыть о форумах РСДН. Ну, либо домогаться по нескольким хорошо известным адресам его включения. После тех удобств, что предоставляет мне лично Янус, веб-мордой пользоваться я просто не могу.


Жизненно необходим именно веб-сервис или та функциональность, которую предоставляет янус?

A>Но возвращаясь к вопросу большей и меньшей связанности, не хочешь ли ты мне так длинно сказать (ну, чтобы я сам попробовал сделать вывод), что собствеено пофигу, есть или нет этой связности. Что это для функционала Януса и сервера вовсе не важно и дело сотого порядка. И собственно, обсуждать такие малозначимые вопросы — просто терять время, ну или мозг разминать, если больше нечем занятся.


Нет, я не это хочу сказать. Всё это не пофигу и это дело не сотого порядка. Выбор средств, дизайн и имплементация функционала напрямую влияют на третий пункт — на сопровождаемость. Веб-сервис можно реализовать многими способами, я предпочту тот, который мне даст более лёгкую сопровождаемость и при этом не войдёт в противоречие с функциональными/нефункциональными требованиями. Я хочу сказать, что такие вещи как связность — это инструмент для достижения главных целей, это та разменная монета, которой я готов легко пожертвовать, если я увижу другое, более приемлемое решение. Сама по себе связность не является для меня целью, это лишь средство достижения цели. Цель — сопровождаемоесть. Но при этом надо чётко понимать, что сопровождаемость складывается из правильных средств, грамотного дизайна и приличной имплементации.

Опять, блин, получилось как-то путанно

A>Т.е. есть какая связанность между Янусом и сервером, нету ли её, это не имеет ни малейшего значения с точки зрения изложенной базы из трёх пунктов выше.


Это не является целью. Говорить о связанности можно и нужно только в контексте сопровождаемости.
Если нам не помогут, то мы тоже никого не пощадим.
Re[34]: Оффтопик про приоритеты
От: akasoft Россия  
Дата: 16.01.07 18:56
Оценка:
Здравствуйте, IT, Вы писали:

IT>Речь идёт о том, что дизайн и имплеинтация сервиса для януса мог бы быть значительно лучше, если бы это учитывалось изначально при разработке сайта. Но в 2000 году об офлай клиенте речи вообще не было. Для нас тогда даже форумы имели второстепенное значение, соответственно и появились они лишь бы было.


Что-то я пропустил этот пункт.

А вот интересно, что имело первостепенное значение в 2000 году?

И какое значение, с твоей точки зрения, имеют форумы сейчас?

(Если ответы на эти вопросы не потребуют раскрытия какой-либо тайны.)
... << RSDN@Home 1.2.0 alpha rev. 672>> SQL Express 2005
Re[38]: DTO внутри BusinessObject
От: akasoft Россия  
Дата: 16.01.07 18:56
Оценка:
Здравствуйте, IT, Вы писали:

IT>Если под контрактом понимать веб-сервис и WSDL, то другие способы, конечно же есть. В том числе более эффективные, но менее кошерные. Например, избыточность XML можно убрать с помощью своего доморощенного формата передачи, допустим по записи на строку с запятой в качестве разделителя. Объём передаваемых данных уменьшиться в несколько раз. Можно применить маппер, который не будет создавать промежуточных структур данных. Т.е. прямо из ридера рекордсета данные будут прямиком уходит в html стрим. Т.е. на сервере не будет тратится лишнее время и память на преобразование данных из формата БД в формат объектной модели. На клиенте html стрим также без лишних ресурсов можно мапить прямо в БД клиента.


Собственно под контрактом я подразумевал нечто в стиле interface, т.е. формулирование и документирование некоторого набора методов, порядка их вызова и форматов данных, которыми будут обмениваться Янус и сервер. Не имея оговоренного набора этого самого interface мне предствляется затруднительным решить задачу взаимодействия.

В то же время, сам контракт можно модифицировать, модернизировать и быть может не требовать совместимости между предыдущими версиями, если это не скажется на сопровождении.

IT>Жизненно необходим именно веб-сервис или та функциональность, которую предоставляет янус?


Конечно же Янус. А что, есть способ поднять Янус "по воздуху"? Читай, не через вебслужбу?

IT>Нет, я не это хочу сказать. Всё это не пофигу и это дело не сотого порядка. Выбор средств, дизайн и имплементация функционала напрямую влияют на третий пункт — на сопровождаемость. Веб-сервис можно реализовать многими способами, я предпочту тот, который мне даст более лёгкую сопровождаемость и при этом не войдёт в противоречие с функциональными/нефункциональными требованиями. Я хочу сказать, что такие вещи как связность — это инструмент для достижения главных целей, это та разменная монета, которой я готов легко пожертвовать, если я увижу другое, более приемлемое решение. Сама по себе связность не является для меня целью, это лишь средство достижения цели. Цель — сопровождаемоесть. Но при этом надо чётко понимать, что сопровождаемость складывается из правильных средств, грамотного дизайна и приличной имплементации.


Получается, что на реализацию вебслужбы Януса большее влияние оказало именно требование сопровождаемости? Т.е. по другому — умения и навыки разработчиков вебслужбы нарабатывались и развивались по мере реализации вебслужбы? Потом пересматривались, переделывались. В то время как с функциональными и нефункциональными требованиями вопросов не возникало.
... << RSDN@Home 1.2.0 alpha rev. 672>> SQL Express 2005
Re[35]: Оффтопик про приоритеты
От: IT Россия linq2db.com
Дата: 16.01.07 19:39
Оценка:
Здравствуйте, akasoft, Вы писали:

A>А вот интересно, что имело первостепенное значение в 2000 году?


Предполагалось делать упор на контент, а именно:

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




A>И какое значение, с твоей точки зрения, имеют форумы сейчас?


С моей точки зрения только общение может сделать из просто сайта комьюнити. Так что форумы тут имеют первостепенное значение.
Если нам не помогут, то мы тоже никого не пощадим.
Re[39]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 17.01.07 03:35
Оценка:
Здравствуйте, akasoft, Вы писали:

A>Собственно под контрактом я подразумевал нечто в стиле interface, т.е. формулирование и документирование некоторого набора методов, порядка их вызова и форматов данных, которыми будут обмениваться Янус и сервер. Не имея оговоренного набора этого самого interface мне предствляется затруднительным решить задачу взаимодействия.


Я задам другой вопрос. Имеет ли смысл создавать такой интерфейс между сервером и веб-интерфейсом? Они ведь тоже должны как-то взаимодействовать?

A>В то же время, сам контракт можно модифицировать, модернизировать и быть может не требовать совместимости между предыдущими версиями, если это не скажется на сопровождении.


IT>>Жизненно необходим именно веб-сервис или та функциональность, которую предоставляет янус?


A>Конечно же Янус. А что, есть способ поднять Янус "по воздуху"? Читай, не через вебслужбу?


Например, через WCF или банально через HTTP

A>Получается, что на реализацию вебслужбы Януса большее влияние оказало именно требование сопровождаемости? Т.е. по другому — умения и навыки разработчиков вебслужбы нарабатывались и развивались по мере реализации вебслужбы? Потом пересматривались, переделывались. В то время как с функциональными и нефункциональными требованиями вопросов не возникало.


RSDN — это вообще тренировочный полигон для девелоперов, народ тут и технологии изучал и идеи отрабатывал. По-этому, сказать чем руководствовались разработчики веб-службы сказать крайне сложно.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[33]: DTO внутри BusinessObject
От: Gollum Россия  
Дата: 17.01.07 04:15
Оценка:
Здравствуйте, IT, Вы писали:

IT>Посмотри на название топика. Как ты думаешь, что оно означает? Из-за этого я и завёлся. А потом уже началась неразбериха с терминологией.


Слона то я и не заметил Согласен, название такого двоякого толкования не допускает.
Моя смерть ездит в черной машине с голубым огоньком
Eugene Agafonov on the .NET

Re[40]: Про общее между луком и Шреком
От: akasoft Россия  
Дата: 17.01.07 09:01
Оценка:
Здравствуйте, IT, Вы писали:

IT>Я задам другой вопрос. Имеет ли смысл создавать такой интерфейс между сервером и веб-интерфейсом? Они ведь тоже должны как-то взаимодействовать?


Попробую ответить.

На мой взгляд, при работе через вебморду мы фактичекски работаем с трёхзвенкой. Имеется клиентский броузер со скриптовыми языками, имеется IIS с ASP.NET и языками программирования, имеется БД с хранимыми процедурами. За слой бизнеспроцессов отвечает прослойка с IIS, он же осуществляет проверку данных, вводимых пользователем, аудит работы. Долговременным и кратковременным хранилищем данных выступает серверная БД. Интерфейсом для броузера выступает набор URL, передаваемые данные представляют собой XHTML с JavaScript (или C#), принимаемые данные обусловлены протоколом HTTP и тоже поддаются описанию, как то имена полей, ограничения, содержимое.

Попробую оценить эту конструкцию с точки зрения трёх правил. У меня нет опыта эксплуатации IIS под серьёзной нагрузкой, но вот опыт использования виртуального хостинга на базе Апача и php говорит мне, что быстродействие и взаимодействие с базой является узким местом. Поэтому быстродействие (способность обслужить нужное количество клиентов за приемлимое время) я ставлю в функциональные требования. А красивость кода и его количество — в сопровождение.

С моей точки зрения необходимость делать ещё один слой между БД и IIS будет означать потерю быстродействия, хотя возможно, при этом уменьшится количество кода, приходящегося на слой IIS (ASP.NET, C#), что будет означать лучшую сопровождаемость.

Но предположим, что я всё-таки введу ещё один слой между БД и IIS. Что я с этого могу иметь? Могу поднять быстродействие за счёт кеширования в памяти каких либо данных, наиболее часто выбираемых. Могу централизованно управлять аудитом, причём не только от вебморды, но и от других возможных служб, взаимодействующих с этим слоем вместо непосредственной работы с БД. Если я начну кешировать не только на чтение, но и на запись в БД, то могу понизить надёжность системы. Электроэнергия теоретически может пропасть. Могу получить некий framework, с которым будет удобно и приятно работать мне, разработчику. Я могу стянуть весь теоретически общий код для всех предоставляемых служб во вне в один framework, отладить его и забыть. Но ведь это будет просто напоминать некоторую библиотеку функций, которой будет удобно пользоваться как для обслуживания веб-запросов, так и Януса, NNTP и того, что ещё может появиться. Разве это слой? Чем он будет отличаться от кода, написанного и работающего под IIS.

С тем же Янусом будет взаимодействовать опять же вебслужба, работающая под управлением IIS, а значит опять же ASP.NET и C#. Опять будет 4 слоя вместо трёх.

Если IIS и SQL Server умеют продуктивно настраиваться и работать с кешированием и частозапрашиваемыми данными нет особого смысла дублировать их работу. Это будет сопровождаемость по части кода, ведь при этом не понадобиться писать и отлаживать свой framework. И нефункциональные требования по части надёжности.

Ну а теперь ты мне скажи, зачем на самом деле нужен ещё один слой между "сервером и веб-интерфейсом"?
... << RSDN@Home 1.2.0 alpha rev. 672>> SQL Express 2005
Re[41]: Про общее между луком и Шреком
От: IT Россия linq2db.com
Дата: 19.01.07 17:53
Оценка:
Здравствуйте, akasoft, Вы писали:

A>С моей точки зрения необходимость делать ещё один слой между БД и IIS будет означать потерю быстродействия, хотя возможно, при этом уменьшится количество кода, приходящегося на слой IIS (ASP.NET, C#), что будет означать лучшую сопровождаемость.


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

A>Я могу стянуть весь теоретически общий код для всех предоставляемых служб во вне в один framework, отладить его и забыть. Но ведь это будет просто напоминать некоторую библиотеку функций, которой будет удобно пользоваться как для обслуживания веб-запросов, так и Януса, NNTP и того, что ещё может появиться. Разве это слой? Чем он будет отличаться от кода, написанного и работающего под IIS.


А что в твоём понимании слой?

A>Ну а теперь ты мне скажи, зачем на самом деле нужен ещё один слой между "сервером и веб-интерфейсом"?


Речь шла не о слое, а о контракте. Например, между янусом и сервером имеется веб-служба с определённым контрактом. Вопрос нужен ли такой контракт между сервером и веб-мордой, точнее между ASP.NET и сервером. Теоретически это может дать определённые преимущества, практически — кучу проблем. Иногда может перевесить одно, иногда другое. Вот я и хотел узнать твоё мнение.
Если нам не помогут, то мы тоже никого не пощадим.
Re[42]: Про общее между луком и Шреком
От: akasoft Россия  
Дата: 20.01.07 11:47
Оценка:
Здравствуйте, IT, Вы писали:

Мои телепатические возможности подвели меня. Вместо того, чтобы прямо тебя спросить, что ты имеешь ввиду, говоря "сервер" в контекстах "между сервером и Янусом" и "между сервером и веб-интерфейсом", я начал фантазировать и смоделировал трёхзвенку. Чтобы не фантазировать дальше, так и спрошу: что такое сервер?

IT>А что в твоём понимании слой?


Со слоями я впервые столкнулся в графике при использовании Corel Draw, оттуда вышло понимание слоя как нечта логически выделенного и изолированного, взаимодействующего с др. слоями с помощью контрактов (интерфейсов), слой можно "выключить" и заменить на другой, реализующий такой же контракт.

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

Гугль сказал, что слой:

Совокупность категорий классов или подсистем одного уровня абстракции.


Так что, скорее всего я путаю и смешиваю понятия.

IT>Речь шла не о слое, а о контракте. Например, между янусом и сервером имеется веб-служба с определённым контрактом. Вопрос нужен ли такой контракт между сервером и веб-мордой, точнее между ASP.NET и сервером. Теоретически это может дать определённые преимущества, практически — кучу проблем. Иногда может перевесить одно, иногда другое. Вот я и хотел узнать твоё мнение.


Я перешёл на слои потому, что плохо понимаю, что ты называешь сервером. Ну, не про ОС Windows 2003 Server же ты говоришь? В озвученной мною трёхзвенной модели и БД (SQL Server), и IIS, и ASP.NET, и вебслужба работают "на сервере", и только Янус работает "на клиенте".
... << RSDN@Home 1.2.0 alpha rev. 672>> SQL Express 2005
Re[36]: DTO внутри BusinessObject
От: GlebZ Россия  
Дата: 20.01.07 14:17
Оценка:
Здравствуйте, IT, Вы писали:


IT>Базируется это хозяйство на очень простой системе приоритетов и разрешения противоречий. Список приоритетов у меня такой:

IT>1. Функциональные требования.
IT>2. Нефункциональные требования.
IT>3. Сопровождаемость системы.

Вот в данном случае я абсолютно не согласен. Во первых "Сопровождаемость системы" — часть нефункциональных/функциональных требований. Во вторых, если ты не выполнил наиболее важные нефункциональные требования, то значит проект провален и клиент убежит от тебя. Ну и в третьих, приоритеты должны расставляться внутри функциональных/нефункциональных требования.
IMHO Возьмем, к примеру, rsdn. Основным нефункциональным требованием к нему должна быть масштабируемость. То есть работоспособность при пиковой нагрузке. Если сервер будет неработоспособен, то всем будет наплевать какие у нас остальные функциональные/нефункциональные требование. Всем будет абсолютно по фигу с каким быстродействием может отвечать сервер, насколько красива архитектура, и как мало на это времени потратили разработчики. Под это бывает (и наверняка случалось на rsdn) нельзя сделать некоторые функциональные требования.
Поэтому приоритеты нужно расставлять по каждому пункту в функциональных и нефункциональных требованиях.
Re[37]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 20.01.07 15:05
Оценка:
Здравствуйте, GlebZ, Вы писали:

GZ>Вот в данном случае я абсолютно не согласен. Во первых "Сопровождаемость системы" — часть нефункциональных/функциональных требований. Во вторых, если ты не выполнил наиболее важные нефункциональные требования, то значит проект провален и клиент убежит от тебя. Ну и в третьих, приоритеты должны расставляться внутри функциональных/нефункциональных требования.


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

GZ>Поэтому приоритеты нужно расставлять по каждому пункту в функциональных и нефункциональных требованиях.


Выше я упомянул, что требования могут переходить из одной категории в другую. Давай скажем так, наша задача разработать софт для поддержки большого портала. Большой — это уже требование, являющееся одной из наших основных задач и к нему следует относиться как к функциональному требованию.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[38]: DTO внутри BusinessObject
От: GlebZ Россия  
Дата: 20.01.07 15:34
Оценка:
Здравствуйте, IT, Вы писали:

IT>Т.е. ты хочешь свалить всё в одну кучу, а потом уже в ней расставить приоритеты? В результате у тебя получатся те же 1, 2, 3

Нет. Приоритеты расставляются отдельно для функциональных требований, и отдельно для нефункциональных. И делятся на три группы по степени важности.

IT>Выше я упомянул, что требования могут переходить из одной категории в другую.

Нет. Не могут. Функциональные требования — это достаточно строгая конструкция которая определяет сценарии/действия пользователя. Они могут зависить друг от друга (например требования по администрированию), но они совершенно разные по форме и содержанию.
IT>Давай скажем так, наша задача разработать софт для поддержки большого портала. Большой — это уже требование, являющееся одной из наших основных задач и к нему следует относиться как к функциональному требованию.
Игорь. Откуда такое требование ты взял? Это нормально для пользователя, но для разработчика это ничего не значит. Что такое большой портал? Относительно кого? В чем измеряется? В количестве форм, в количестве строк, или просто формы показываемые порталом должны быть большими? Все равно что, делайте что хотите, но решение должно быть большим и красивым.
Re[39]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 21.01.07 02:59
Оценка:
Здравствуйте, GlebZ, Вы писали:

IT>>Т.е. ты хочешь свалить всё в одну кучу, а потом уже в ней расставить приоритеты? В результате у тебя получатся те же 1, 2, 3

GZ>Нет. Приоритеты расставляются отдельно для функциональных требований, и отдельно для нефункциональных. И делятся на три группы по степени важности.

Это всё становится слишком сложно. У меня ведь нет цели разработать формальную систему принятия решений. Моя задача упростить для себя принятие решений в 99% случаев. Пока эта система проста, она работает. Усложнение сделает её бесполезной.

IT>>Выше я упомянул, что требования могут переходить из одной категории в другую.

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

Могут, могут. Например, строгость объектной модели одно из функциональных требований для публичных библиотек, и всего лишь средство достичь лучшего сопровождения для обычных задач.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[40]: DTO внутри BusinessObject
От: GlebZ Россия  
Дата: 21.01.07 11:38
Оценка: 10 (3)
Здравствуйте, IT, Вы писали:


IT>Это всё становится слишком сложно. У меня ведь нет цели разработать формальную систему принятия решений. Моя задача упростить для себя принятие решений в 99% случаев. Пока эта система проста, она работает. Усложнение сделает её бесполезной.

Она не проста. Она просто неверна. Не может быть приоритета функциональных требований над нефункциональными. Может быть приоритет одного набора требований над другими. Независимо от того, функциональные они, или нефункциональные. Что касается формализма, то как результат он работает. И весьма верно работает. Функциональные/нефункциональные требования — это набор достижимых целей. Все остальное — это средства. Достижимость обозначает что по каждому требованию мы можем точно сказать что цель либо достигнута, либо не достигнута. Оно не допускает абстракции. И как результат, мы можем точно сказать что есть цель, а что средство. А какие цели не должны быть реализованы поскольку никому на фиг не сдались, хоть программисту и хочется это сделать.

IT>Могут, могут. Например, строгость объектной модели одно из функциональных требований для публичных библиотек, и всего лишь средство достичь лучшего сопровождения для обычных задач.

Видишь ли, объектная модель — это не есть цель. Это средство. Даже контракт не является целью. Цель может быть например:
Для функц. требований:
1. Пользователь может получить набор сообщений находящихся на определенном форуме и зарегистрированных начиная с определенного времени.
2. Пользователь может получить текст определенного сообщения.
3. Пользователь может получить сумму оценок для определенного сообщения.
Для нефункц. требований другое:
1. Система оставаться работоспособной при 100 одновременных запросах.
2. Время ответа при выполнении пункта 1,2,3 функц. требований не должно превышать n секунд при m одновременных запросах.

Пропишем ли мы, например, текст как неотъемлимое свойство сообщения, или будет запрашиваться по каждому сообщению — это уже выводится из данных целей. Вероятнее мы не сможем выполнить пункт 2 нефункц. требований если будем спрашивать по каждому сообщению. Но самое главное, при проектировании контракта, мы точно можем сказать что мы непротиворечим пунктам, и они остались достижимы.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re[41]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 21.01.07 22:21
Оценка:
Здравствуйте, GlebZ, Вы писали:

GZ>Она не проста. Она просто неверна.


А я клятвы верности никому и не давал

GZ>Не может быть приоритета функциональных требований над нефункциональными.


Ещё как может. Быстрая, но не делающая то, что нужно система нифиг никому не нужна. А вот работающая, но тормознутая имеет определённую ценность.

GZ>Может быть приоритет одного набора требований над другими. Независимо от того, функциональные они, или нефункциональные.


Какие ещё наборы? А как насчёт приоритетов внутри наборов? В общем, это всё усложнение на ровном месте.

GZ>Что касается формализма, то как результат он работает. И весьма верно работает.


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

GZ>Функциональные/нефункциональные требования — это набор достижимых целей. Все остальное — это средства. Достижимость обозначает что по каждому требованию мы можем точно сказать что цель либо достигнута, либо не достигнута. Оно не допускает абстракции. И как результат, мы можем точно сказать что есть цель, а что средство. А какие цели не должны быть реализованы поскольку никому на фиг не сдались, хоть программисту и хочется это сделать.


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

GZ>Видишь ли, объектная модель — это не есть цель. Это средство.


Я могу ещё раз привести пример с командой MS по надзору за согласованностью FW.

GZ>Даже контракт не является целью. Цель может быть например:


Это очень узкая трактовка, которая может быть справедливой только для одного узкого круга задач. Вот тебе ещё некоторые трубования к системе:

1. Обеспечение расширяемости функционала за счёт предоставления соответствующего API 3d party продуктам.
2. Обеспечение интерфейса для поступа внешних систем.

Это какой тип требований?

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

Что здесь является функциональными требованиями?
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[42]: DTO внутри BusinessObject
От: GlebZ Россия  
Дата: 22.01.07 08:20
Оценка:
Здравствуйте, IT, Вы писали:

GZ>>Не может быть приоритета функциональных требований над нефункциональными.

IT>Ещё как может. Быстрая, но не делающая то, что нужно система нифиг никому не нужна. А вот работающая, но тормознутая имеет определённую ценность.
Это неверно определенные требования. Значит быстрота должна либо не быть целью, либо быть целью с низким приоритетом. Но например если в редакторе скорость вставки символа меньше чем скорость с которой его набирает пользователь, то такое решение никому не нужно.

GZ>>Может быть приоритет одного набора требований над другими. Независимо от того, функциональные они, или нефункциональные.

IT>Какие ещё наборы? А как насчёт приоритетов внутри наборов? В общем, это всё усложнение на ровном месте.
Нет. Упрощение. Фактически мы видим набор целей важных для пользователя и не особо важных. Набор требований без которых пользователь будет считать проект неуспешным, и набор требований которые пользователи может перетерпеть.

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

Оно точно. Второй раз писать почему?

IT>Это ошибочное мнение. Существует вещи, которые не являются ни функциональными, ни нефункциональными требованиями, они даже нафиг не сдались ни юзеру, ни заказчику, тем не менее они являются первостепенными целями.

Например?

GZ>>Видишь ли, объектная модель — это не есть цель. Это средство.

IT>Я могу ещё раз привести пример с командой MS по надзору за согласованностью FW.
Ссылку.

IT>Это очень узкая трактовка, которая может быть справедливой только для одного узкого круга задач. Вот тебе ещё некоторые трубования к системе:

IT>1. Обеспечение расширяемости функционала за счёт предоставления соответствующего API 3d party продуктам.
IT>2. Обеспечение интерфейса для поступа внешних систем.
IT>Это какой тип требований?
Концепция. Оно абстрактно. Неабстрактно и достижимо будет набор требований — что должны делать данные библиотеки.

IT>В конце концов существуют системы, в которых вообще нет пользовательского интерфейса и любая из функций системы не может подойти под категорию "Пользователь может получить текст определенного сообщения".

IT>Что здесь является функциональными требованиями?
А что клиентская программа не может является пользователем системы?
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re[43]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 22.01.07 13:27
Оценка:
Здравствуйте, GlebZ, Вы писали:

GZ>Это неверно определенные требования. Значит быстрота должна либо не быть целью, либо быть целью с низким приоритетом. Но например если в редакторе скорость вставки символа меньше чем скорость с которой его набирает пользователь, то такое решение никому не нужно.


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

IT>>Какие ещё наборы? А как насчёт приоритетов внутри наборов? В общем, это всё усложнение на ровном месте.

GZ>Нет. Упрощение. Фактически мы видим набор целей важных для пользователя и не особо важных. Набор требований без которых пользователь будет считать проект неуспешным, и набор требований которые пользователи может перетерпеть.

Зачем такие усложнения? Функциональные требования всегда являются целями.

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

GZ>Оно точно. Второй раз писать почему?

Напиши

IT>>Это ошибочное мнение. Существует вещи, которые не являются ни функциональными, ни нефункциональными требованиями, они даже нафиг не сдались ни юзеру, ни заказчику, тем не менее они являются первостепенными целями.

GZ>Например?

Например, сопровождаемость.

GZ>>>Видишь ли, объектная модель — это не есть цель. Это средство.

IT>>Я могу ещё раз привести пример с командой MS по надзору за согласованностью FW.
GZ>Ссылку.

Было интервью на channel9 года три назад. Ссылка была кажется на www.theserverside.net.

IT>>Это какой тип требований?

GZ>Концепция. Оно абстрактно. Неабстрактно и достижимо будет набор требований — что должны делать данные библиотеки.

Какая ещё концепция? Это можно быть требованием и целью разработки одной системы и может не быть требованием для другой.

IT>>Что здесь является функциональными требованиями?

GZ>А что клиентская программа не может является пользователем системы?

Ну так приведи пример требований для программы, пользователями которой являются другие программы.
Если нам не помогут, то мы тоже никого не пощадим.
Re[44]: DTO внутри BusinessObject
От: GlebZ Россия  
Дата: 22.01.07 14:41
Оценка:
Здравствуйте, IT, Вы писали:

IT>С чего ты взял, что не нужно. Может быть это редактор, делающий нечно, что невозможно сделать никакими другими способами. Пусть он подтормаживает, но зато хоть как-то это делает.

Если он что-то делает лучше, но на нем плохо редактировать, то не стоит называть его редактором. Минимум — имиджевые потери. Максимум — отсыл пользователем к такой-то матери.

IT>Гораздо хуже, если бы он делал быстро, но не то, что нужно.

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

IT>Зачем такие усложнения? Функциональные требования всегда являются целями.

Безусловно. Но функциональные цели также имеют приоритеты. Ну например, на RSDN — если я нажимаю на "рейтинг активности" — то в результате получаю ошибку timeout. И никто не плачет, поскольку цель редкоиспользуема и маловажна. Ее вполне можно убрать, привлекательность сайта не уменьшится. Если то же самое будет при просмотре сообщения или статьи — думаю здесь вообще ни одного посетителя не останется. Также и с клиентами. Если ты сможешь определить маловажные цели, то если не успеваешь по срокам их вполне можно опустить. Это не слишком понизит бизнес-привлекательность решения. Если не сделать хоть одну высокоприоритетное требование — это будет считаться провалом проекта.

GZ>>Оно точно. Второй раз писать почему?

IT>Напиши

Функциональные требования — это достаточно строгая конструкция которая определяет сценарии/действия пользователя.

Нефункциональные требования — все остальные требования к программе.

IT>Например, сопровождаемость.

Сопровождаемость в разных задачах значат разные вещи. Что ты в данном случае имеешь ввиду под сопровождаемостью?

IT>Было интервью на channel9 года три назад. Ссылка была кажется на www.theserverside.net.

Сейчас посмотреть не могу, потом когда будет возможность.

IT>>>Это какой тип требований?

GZ>>Концепция. Оно абстрактно. Неабстрактно и достижимо будет набор требований — что должны делать данные библиотеки.
IT>Какая ещё концепция? Это можно быть требованием и целью разработки одной системы и может не быть требованием для другой.
Это может быть требованием другой системы, и обозначать совершенно разные вещи. Ну смотри — твое требование:

Обеспечение интерфейса для поступа внешних систем.

О чем говорит это требование? Да ни о чем. Может быть целью этого требования получение объекта по идентификатору и все оставшееся время мы можем париться на Канарах. А может быть клиенту нужны ad hoc запросы и без этого он работу не примет. И в результате при выполнении этого требования мы получим гемморой который будет стоить больше чем вся остальная часть программного продукта. При такой постановке требования — нет достижимой и ясно понимаемой цели которую возможно достигнуть.

IT>>>Что здесь является функциональными требованиями?

GZ>>А что клиентская программа не может является пользователем системы?
IT>Ну так приведи пример требований для программы, пользователями которой являются другие программы.
Ну так я и написал. Не нравится термин "пользователь", замени его на термин "пользовательская программа" или еще как-то. Смысл не меняется.
Re[45]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 22.01.07 15:40
Оценка: +1
Здравствуйте, GlebZ, Вы писали:

IT>>С чего ты взял, что не нужно. Может быть это редактор, делающий нечно, что невозможно сделать никакими другими способами. Пусть он подтормаживает, но зато хоть как-то это делает.

GZ>Если он что-то делает лучше, но на нем плохо редактировать, то не стоит называть его редактором. Минимум — имиджевые потери. Максимум — отсыл пользователем к такой-то матери.

А вот это не нам с тобой решать И само собой не на абстрактном примере.

IT>>Гораздо хуже, если бы он делал быстро, но не то, что нужно.

GZ>Вот для этого и стоит определять что нам нужно быстро делать, что не столь важно, а на что вообще не стоит обращать внимание и бить разрабочика по ковырялкам если его заносит.

И в чём проблема? Мы же вроде как говорим о приоритетности одних требований над другими

IT>>Зачем такие усложнения? Функциональные требования всегда являются целями.

GZ>Безусловно. Но функциональные цели также имеют приоритеты. Ну например, на RSDN — если я нажимаю на "рейтинг активности" — то в результате получаю ошибку timeout.

Это баг, а не цель. Этот баг нужно просто исправить и всех делов, хотя похоже там дело в железе.

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


Ты говоришь совершенно о другом. Я говорил о приоритетах при принятии конкретных решений при реализации той или иной функциональности. Ты же пытаешься свалить всё в одну кучу и тем самым усложнить весь процесс. Меня этот вопрос сейчас вообще не интересует.

GZ>

Функциональные требования — это достаточно строгая конструкция которая определяет сценарии/действия пользователя.


Это примерно тоже самое, что "Функциональное требование — это предложение, записанное на бумаге". В таком смысле да, это строгая конструкция. Но любые функциональные требования базируются на предпочтениях человека их составялющих, а значит не могут быть чётко категоризированы. К каким, например, категориям относятся требования к тёплости и мякгости?

GZ>Нефункциональные требования — все остальные требования к программе.


А как же концептуальные требования?

IT>>Например, сопровождаемость.

GZ>Сопровождаемость в разных задачах значат разные вещи. Что ты в данном случае имеешь ввиду под сопровождаемостью?

Готовность системы к будущим изменениям.

IT>>Какая ещё концепция? Это можно быть требованием и целью разработки одной системы и может не быть требованием для другой.

GZ>Это может быть требованием другой системы, и обозначать совершенно разные вещи. Ну смотри — твое требование:
GZ>

Обеспечение интерфейса для поступа внешних систем.

GZ>О чем говорит это требование? Да ни о чем. Может быть целью этого требования получение объекта по идентификатору и все оставшееся время мы можем париться на Канарах. А может быть клиенту нужны ad hoc запросы и без этого он работу не примет. И в результате при выполнении этого требования мы получим гемморой который будет стоить больше чем вся остальная часть программного продукта. При такой постановке требования — нет достижимой и ясно понимаемой цели которую возможно достигнуть.

Так именно это и является целью — обеспечение интерфейса для внешних систем

IT>>>>Что здесь является функциональными требованиями?

GZ>>>А что клиентская программа не может является пользователем системы?
IT>>Ну так приведи пример требований для программы, пользователями которой являются другие программы.
GZ>Ну так я и написал. Не нравится термин "пользователь", замени его на термин "пользовательская программа" или еще как-то. Смысл не меняется.

Меняется очень сильно. В зависимости от "замени, если не нравится" у тебя будет совсем другая реализация.
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: DTO внутри BusinessObject
От: Аноним  
Дата: 23.01.07 12:55
Оценка: :))) :))
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, снежок, Вы писали:


С>>Суть в том чтобы все get-ы и set-ы BO работали с DTO, а не приватными мемберами соответствующих свойств BO.


IT>Я вот никогда не понимал, в чём вообще смысл разделения на DTO и BO? Потому что Фаулер так сказал?


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

Если польза от разделения BO и BL вам не ясна — значит небыло еще в вашей жизни проекта, где такое разделение было бы критическим.
Re[3]: DTO внутри BusinessObject
От: Blazkowicz Россия  
Дата: 23.01.07 12:57
Оценка:
Здравствуйте, Аноним, Вы писали:

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


Вы с DAO не путаете?

А>Если польза от разделения BO и BL вам не ясна — значит небыло еще в вашей жизни проекта, где такое разделение было бы критическим.


А в чьей-то жизни такой проект был? Если в Вашей, то может поделитесь опытом откуда критичность возникла?
Re[3]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 23.01.07 14:14
Оценка: :))
Здравствуйте, <Аноним>, Вы писали:

А>DTO — инкапсуляция работы с бд.,


Надо же, я всегда думал, что это называется DAL. Оказывается это тоже называется DTO. Буду знать.

А>Если польза от разделения BO и BL вам не ясна — значит небыло еще в вашей жизни проекта, где такое разделение было бы критическим.


Простите, был не прав.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[46]: DTO внутри BusinessObject
От: GlebZ Россия  
Дата: 25.01.07 07:41
Оценка:
Здравствуйте, IT, Вы писали:

IT>>>Гораздо хуже, если бы он делал быстро, но не то, что нужно.

GZ>>Вот для этого и стоит определять что нам нужно быстро делать, что не столь важно, а на что вообще не стоит обращать внимание и бить разрабочика по ковырялкам если его заносит.
IT>И в чём проблема? Мы же вроде как говорим о приоритетности одних требований над другими
Разница в том, что ты говоришь о некой приоритетности функциональных над нефункциональными требованиями. Я утверждаю, что важность требований не зависит от того — функциональное или нефункциональное оно.

IT>Ты говоришь совершенно о другом. Я говорил о приоритетах при принятии конкретных решений при реализации той или иной функциональности. Ты же пытаешься свалить всё в одну кучу и тем самым усложнить весь процесс. Меня этот вопрос сейчас вообще не интересует.

Нет. Это как раз и создает приоритет конкретных решений. Приоритет требований, их частота использования и риски — создают как раз последовательность и качество решений. Есть важные требования которые мы должны сделать в первую очередь, и при этом они работали достаточно эффективно. Есть менее важные требования, которые мы можем пока не учитывать а подумать о них по мере реализации важняка. А вот что такое приоритет требований мы и обсуждаем.

GZ>>

Функциональные требования — это достаточно строгая конструкция которая определяет сценарии/действия пользователя.

IT>Это примерно тоже самое, что "Функциональное требование — это предложение, записанное на бумаге". В таком смысле да, это строгая конструкция. Но любые функциональные требования базируются на предпочтениях человека их составялющих, а значит не могут быть чётко категоризированы.
Однако предпочтения клиента/аналитика точны и достаточны чтобы их точно выполнять. Мне как разработчику на это наплевать.

IT>К каким, например, категориям относятся требования к тёплости и мякгости?

А могут быть такие требования?

GZ>>Нефункциональные требования — все остальные требования к программе.

IT>А как же концептуальные требования?
А что концепция? Концептуальные документы показывают нужность программы, ее абстактные цели, ограничивают задачу рамками. При разработке

IT>>>Например, сопровождаемость.

GZ>>Сопровождаемость в разных задачах значат разные вещи. Что ты в данном случае имеешь ввиду под сопровождаемостью?
IT>Готовность системы к будущим изменениям.
К каким изменениям? Для одних это подмена всего сервера, для других версионификация контракта, для третьих возможность добавления новых типов и т.д. и т.п. Low Coupling/High Cohesion — есть свойство любой правильной архитектуры.

IT>Так именно это и является целью — обеспечение интерфейса для внешних систем

Слишком абстрактно чтобы данное требование можно было выполнить.

IT>Меняется очень сильно. В зависимости от "замени, если не нравится" у тебя будет совсем другая реализация.

Повторю. Я писал данные требования для уровня сервера. "Пользователем" является клиентская программа.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re[4]: DTO внутри BusinessObject
От: adontz Грузия http://adontz.wordpress.com/
Дата: 27.01.07 02:52
Оценка: 8 (1)
Здравствуйте, IT, Вы писали:

IT>А зачем вообще нужно это разделение? По мне так оно выглядит очень натянуто.


Давай простой пример. Бизнес-объект User. Что с ним можно делать? Скажем сменить пароль, залогиниться, получить список пользователей. Итого у нас есть

На клиентской стороне
class BusinessObjectUser
{
    public string SystemName { get; }
    public string DisplayName { get; }

    public void ChangePassword(string oldPassword, string newPassword);
    public static BusinessObjectUser GetCurrentUser();
    public static IList<BusinessObjectUser> GetUsers();
}

class BusinessObjectSystem
{
    public BusinessObjectUser Login(string systemName, string password);
}

Но это совсем не то что мы посылаем серверу и принимем с сервера. А посылаем и принимаем мы вот что
struct DataTrasferUserChangePasswordRequest
{
    public string SystemName;
    public string OldPassword;
    public string NewPassword;
}

struct DataTrasferUserLoginRequest
{
    public string SystemName;
    public string Password;
}

struct DataTrasferUserGetListResponseItem
{
    public string SystemName;
    public string DisplayName;
}

struct DataTrasferUserGetListResponse
{
    public List<DataTrasferUserGetListResponseItem> Users;
}


А если посылать и принимать BO, то мало того что мы резко увеличит траффик, так ещё и нагрузим BO всяким мусором. Например в BusinessObjectUser пришлось бы завести write-only поля OldPassword и NewPassword которые бы почти никогда не использовались (но всегда гонялись по сети туда-обратно). Это не только неэффективно, но и приводит к трудно поддерживаемому коду с оттенком процедурного, а не ОО программирования, когда в один класс запихали то что нужно в разных местах.

Пример с User несколько экстремальный, но лично я всегда выделяю DTO. Особенно это важно в .Net, где можно "за компанию" незаметно для себя сериализовать кучу левый вещей, а потом играть в игру "какая клиентская сборка нужна на сервере". А ещё бывает, что на клиенте есть свой кеш, но храниться там не совсем то, что используеться и не совсем то, что получается с сервера.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[5]: DTO внутри BusinessObject
От: akasoft Россия  
Дата: 27.01.07 19:33
Оценка:
Здравствуйте, adontz, Вы писали:

A>Но это совсем не то что мы посылаем серверу и принимем с сервера. А посылаем и принимаем мы вот что


А почему? Пример замечательный привёл. Так почему нельзя получить удалённую ссылку на опубликованный класс BusinessObjectUser и дёргать его методы? Зачем опускаться до обмена сообщениями? Ведь приведённые затем структуры мне представляются попыткой полезть на уровень ниже, где происходит обмен сообщениями между удалённым объектом и его прокси, и подменить их. Зачем?
... << RSDN@Home 1.2.0 alpha rev. 673>> SQL Express 2005
Re[6]: DTO внутри BusinessObject
От: adontz Грузия http://adontz.wordpress.com/
Дата: 27.01.07 20:49
Оценка:
Здравствуйте, akasoft, Вы писали:

A>Так почему нельзя получить удалённую ссылку на опубликованный класс BusinessObjectUser и дёргать его методы?


В веб-сервисах? Может, я что-то в этой жизни упустил, но я так не умею.
А Remoting через Интернет вообще не стоит использовать — пол мира за HTTP proxy сидят.

Вот так и мучаемся с DTO
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[5]: DTO внутри BusinessObject
От: IB Австрия http://rsdn.ru
Дата: 27.01.07 20:50
Оценка: 33 (3) +4
Здравствуйте, adontz, Вы писали:

A>Давай простой пример. Бизнес-объект User.

На самом деле, все выглядит немного не так... Для начала, в чем у нас проблема с объектом User? Проблема в том, что в него почему-то положили и бизнес-логику, то есть сделали как раз то, от чего Игорь предостерегал, да еще, помимо этого и UI-логикой нагрузили. На самом деле свойство DisplayName, видимо должно представлять собой какой-то из UI-ных методов, методы же GetCurrentUser() и GetUsers() — должны лежать в специальных классах бизнес-логики, которые знают, где брать пользователей вообще, и где брать текущих пользователей... Очевидно, сам-по себе бизнес-объект User подобными знаниями обладать не должен, так как подобное знание гвоздями его пришпилит к конкретному месту в системе или, говоря по модному, увеличит связность.
Далее ChngePassword. Этому методу так же место, скорее всего, в каком-нибудь UserManager-е, который и занимается насущным обслуживанием объекта User...
Вот после этих преобразований можно начинать прикручивать к Юзеру DTO. Надо ли это делать, учитывая что теперь в объекте User осталось? Вопрос для домашнего задания... =)
Мы уже победили, просто это еще не так заметно...
Re[6]: DTO внутри BusinessObject
От: adontz Грузия http://adontz.wordpress.com/
Дата: 27.01.07 20:54
Оценка:
Здравствуйте, IB, Вы писали:

IB>Здравствуйте, adontz, Вы писали:


A>>Давай простой пример. Бизнес-объект User.

IB>На самом деле, все выглядит немного не так... Для начала, в чем у нас проблема с объектом User? Проблема в том, что в него почему-то положили и бизнес-логику, то есть сделали как раз то, от чего Игорь предостерегал, да еще, помимо этого и UI-логикой нагрузили. На самом деле свойство DisplayName, видимо должно представлять собой какой-то из UI-ных методов, методы же GetCurrentUser() и GetUsers() — должны лежать в специальных классах бизнес-логики, которые знают, где брать пользователей вообще, и где брать текущих пользователей... Очевидно, сам-по себе бизнес-объект User подобными знаниями обладать не должен, так как подобное знание гвоздями его пришпилит к конкретному месту в системе или, говоря по модному, увеличит связность.
IB>Далее ChngePassword. Этому методу так же место, скорее всего, в каком-нибудь UserManager-е, который и занимается насущным обслуживанием объекта User...
IB>Вот после этих преобразований можно начинать прикручивать к Юзеру DTO. Надо ли это делать, учитывая что теперь в объекте User осталось? Вопрос для домашнего задания... =)


Ну ты фактически используешь внутри программы DTO, а всю логику выносишь во внешние манипуляторы. А потом говоришь, что DTO не нужны
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[7]: DTO внутри BusinessObject
От: IB Австрия http://rsdn.ru
Дата: 27.01.07 21:04
Оценка: 14 (2) +1
Здравствуйте, adontz, Вы писали:

A>Ну ты фактически используешь внутри программы DTO, а всю логику выносишь во внешние манипуляторы. А потом говоришь, что DTO не нужны

Bingo! =) Хоть горшком назови..
Собственно Игорев поинт в том и состоит, если я правильно понял, что уж коли BO и так практически не содержит логики, так почему бы и не использовать его в качестве DTO, вместо того, чтобы городить дополнительные конструкции и обзывать их разными умными словами...
Мы уже победили, просто это еще не так заметно...
Re[8]: DTO внутри BusinessObject
От: adontz Грузия http://adontz.wordpress.com/
Дата: 27.01.07 22:12
Оценка:
Здравствуйте, IB, Вы писали:

IB>Bingo! =) Хоть горшком назови..

IB>Собственно Игорев поинт в том и состоит, если я правильно понял, что уж коли BO и так практически не содержит логики, так почему бы и не использовать его в качестве DTO, вместо того, чтобы городить дополнительные конструкции и обзывать их разными умными словами...

Ну с одной строны это хорошо, потому что переливания данных между объектами не будет. С другой плохо, потому что с инкапсуляция тю-тю. получаем обычное процедурное программирование. Ну и кроме того... как ты себе представляешь этот самый облегчённый объект User из моего примера? С двумя полями OldPassword и NewPassword? Хоть все методы оттуда выкинь, если есть передача частичных, неполных, нехранимых данных, то выделение DTO делает логику более чёткой, а протокол обмена менее избыточным. И всё ради того, чтобы избежать переливания данных между объектами? Мне кажется избыточность протокола больше повлияет на производительность.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[5]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 27.01.07 23:06
Оценка: 16 (3) +3
Здравствуйте, adontz, Вы писали:

class User
{
    public int    ID          { get; }
    public string SystemName  { get; }
    public string DisplayName { get; }
}

class UserManager
{
    public void       ChangePassword(int userID, string oldPassword, string newPassword);
    public User       GetUser(int userID);
    public List<User> GetUserList();
}


Всего два класса. User не прибит гвоздями к источнику данных и может использоваться любой частью системы от UI до серверной бизнес логики. ChangePassword великолепно реализуется функцией с параметрами.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[6]: DTO внутри BusinessObject
От: adontz Грузия http://adontz.wordpress.com/
Дата: 27.01.07 23:46
Оценка:
Здравствуйте, IT, Вы писали:

IT>Всего два класса. User не прибит гвоздями к источнику данных и может использоваться любой частью системы от UI до серверной бизнес логики. ChangePassword великолепно реализуется функцией с параметрами.


Тут нет DTO или того что используется как DTO. Что шлёт ChangePassword серверу, где этот класс?
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[7]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 27.01.07 23:54
Оценка:
Здравствуйте, adontz, Вы писали:

IT>>Всего два класса. User не прибит гвоздями к источнику данных и может использоваться любой частью системы от UI до серверной бизнес логики. ChangePassword великолепно реализуется функцией с параметрами.


A>Тут нет DTO или того что используется как DTO. Что шлёт ChangePassword серверу, где этот класс?


class ClientUserManager
{
    public void       ChangePassword(int userID, string oldPassword, string newPassword);
    public User       GetUser(int userID);
    public List<User> GetUserList();
}
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[8]: DTO внутри BusinessObject
От: adontz Грузия http://adontz.wordpress.com/
Дата: 28.01.07 00:10
Оценка:
Здравствуйте, IT, Вы писали:

A>>Тут нет DTO или того что используется как DTO. Что шлёт ChangePassword серверу, где этот класс?


IT>
IT>class ClientUserManager
IT>{
IT>    public void       ChangePassword(int userID, string oldPassword, string newPassword);
IT>    public User       GetUser(int userID);
IT>    public List<User> GetUserList();
IT>}
IT>


Эээ, может я неудачно выразился. "Что шлёт ChangePassword серверу" имелось ввиду какие данные и в каком формате. Где класс хранитель тех данных, которые ChangePassword шлёт классу?
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[9]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 28.01.07 01:01
Оценка: +1
Здравствуйте, adontz, Вы писали:

A>Эээ, может я неудачно выразился. "Что шлёт ChangePassword серверу" имелось ввиду какие данные и в каком формате. Где класс хранитель тех данных, которые ChangePassword шлёт классу?


ChangePassword шлёт 3 переменных. Создвавать для этого специальный класс нет никакой необходимости.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[10]: DTO внутри BusinessObject
От: adontz Грузия http://adontz.wordpress.com/
Дата: 28.01.07 01:04
Оценка:
Здравствуйте, IT, Вы писали:

A>>Эээ, может я неудачно выразился. "Что шлёт ChangePassword серверу" имелось ввиду какие данные и в каком формате. Где класс хранитель тех данных, которые ChangePassword шлёт классу?


IT>ChangePassword шлёт 3 переменных. Создвавать для этого специальный класс нет никакой необходимости.


Если ты не выделил DTO в класс, это ещё не значит что у тебя совсем нет DTO, это значит что абстрактное понятие DTO реализовано в виде трёх переменных. А DTO всё равно есть, пусть и не так явно.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[11]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 28.01.07 01:16
Оценка:
Здравствуйте, adontz, Вы писали:

A>Если ты не выделил DTO в класс, это ещё не значит что у тебя совсем нет DTO, это значит что абстрактное понятие DTO реализовано в виде трёх переменных. А DTO всё равно есть, пусть и не так явно.


Рома, это чушь, против которой я собственно говоря и протестую. Таким образом DTO можно обозвать всё что угодно, даже пакеты TCP. А назвав всё что можно DTO мы начинаем пихать его куда ни поподя уже не понимая нужно оно там или нет. Твой пример с ChangePassword это очень хорошо демонстрирует. Там где можно обойтись тремя параметрами ты создал целый класс. Класс здесь, класс там, а потом мы удивляемся почему сложность системы выходит из под контроля.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[12]: DTO внутри BusinessObject
От: adontz Грузия http://adontz.wordpress.com/
Дата: 28.01.07 01:43
Оценка:
Здравствуйте, IT, Вы писали:

IT>Рома, это чушь, против которой я собственно говоря и протестую. Таким образом DTO можно обозвать всё что угодно, даже пакеты TCP. А назвав всё что можно DTO мы начинаем пихать его куда ни поподя уже не понимая нужно оно там или нет. Твой пример с ChangePassword это очень хорошо демонстрирует. Там где можно обойтись тремя параметрами ты создал целый класс. Класс здесь, класс там, а потом мы удивляемся почему сложность системы выходит из под контроля.


Игорь, честное слово, я не идиот Я просто явно выделил DTO чтобы было точно понятно о чём я говорю, и только. В реальном проекте я конечно же создам вебметод с 3 параметрами, а не вебметод с одним параметром и вспомогательный класс.
Я просто не хотел приводить излишне громоздкие примеры, которые многим покажутся надуманными. Повторюсь — когда передются частичные данные, DTO в явном или не явном виде нужны.
Вот тебе такой пример. Пусть у User есть список некоторых именованных свойств (DAL ничего не знает об их смысле) которые хранят вспомогательные данные. Например свойство с именем "email" хранит адрес электронной почты. На клиенте у тебя будет
class User
{
    public IDictionary<string, string> NamedProperties {get;}
}

Но когда я хочу просто получить список всех пользователей в группе Administrators мне глубоко наплевать на их номер ICQ и количество детей женского пола. С сервера вернётся список пользоватей, где для каждого пользователя будут личь частичные данные и гнать кучу классов с пустым Dictionary<string, string> нет решительно никакого смысла. Надо делать отдельный класс — DTO.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[13]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 28.01.07 03:04
Оценка:
Здравствуйте, adontz, Вы писали:

A>Надо делать отдельный класс — DTO.


Зачем? Просто не передавай данные, которые не используются.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[14]: DTO внутри BusinessObject
От: adontz Грузия http://adontz.wordpress.com/
Дата: 28.01.07 06:14
Оценка:
Здравствуйте, IT, Вы писали:

IT>Зачем? Просто не передавай данные, которые не используются.


Во-первых, объявление даже пустых структур анимает место. Кроме того приписывать к классу кучу комментариев — "если объект этого класса возвращён методов А, то поле Б не заполнено" дло ИМХО бесперспективное
Во-вторых бывает обратная ситуация, когда данные передаются, но не хранятся в том виде, в котором передаются.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[15]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 28.01.07 06:23
Оценка:
Здравствуйте, adontz, Вы писали:

A>Во-первых, объявление даже пустых структур анимает место.


Ну и что? Пусть себе занимает, тебе жалко что ли?

A>Кроме того приписывать к классу кучу комментариев — "если объект этого класса возвращён методов А, то поле Б не заполнено" дло ИМХО бесперспективное


А создавать кучу классов и к каждому приписывать где, когда и зачем он используется — это дело перспективное?

A>Во-вторых бывает обратная ситуация, когда данные передаются, но не хранятся в том виде, в котором передаются.


И в чём проблема?
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[14]: DTO внутри BusinessObject
От: GlebZ Россия  
Дата: 28.01.07 07:23
Оценка: 1 (1) +1
Здравствуйте, IT, Вы писали:

IT>Зачем? Просто не передавай данные, которые не используются.

Ну нельзя так. Об этом уже говорили. В результате мы получаем вообще четырехзначную логику. Да/Нет/Пустое/Не загружен. В результате получается что мы избавляемся от главного плюса business entity — а именно абстрагирование от внутренней структуры объекта. В результате при вызове функции, мы должны всегда будем помнить — загрузили ли мы данные в BE для данной конкретной функции. Упрощения не будет, и как результат — разница между DataSet и business entity нивелируется.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re[16]: DTO внутри BusinessObject
От: adontz Грузия http://adontz.wordpress.com/
Дата: 28.01.07 07:30
Оценка:
Здравствуйте, IT, Вы писали:

A>>Во-первых, объявление даже пустых структур анимает место.

IT>Ну и что? Пусть себе занимает, тебе жалко что ли?

Вобщем-то да, хотя это далеко не главный фактор.

A>>Кроме того приписывать к классу кучу комментариев — "если объект этого класса возвращён методов А, то поле Б не заполнено" дло ИМХО бесперспективное

IT>А создавать кучу классов и к каждому приписывать где, когда и зачем он используется — это дело перспективное?

Вполне. Приписывать ничего не надо, так как такие классы — заточенные под определённую цель, локально используемые сущности. Ну и вменяемые имена рулят. Usr32 плохое имя, даже для служебного класса. А Company.Project.Dto.UserLoginRequest вполне хорошее. с таким именем ничего не надо приписывать, и так всё ясно.

A>>Во-вторых бывает обратная ситуация, когда данные передаются, но не хранятся в том виде, в котором передаются.

IT>И в чём проблема?

В том, что соответвующего бизнес объекта, пусть даже рыхло заполняемого, просто не существует.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[15]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 28.01.07 07:39
Оценка: 1 (1) +1
Здравствуйте, GlebZ, Вы писали:

IT>>Зачем? Просто не передавай данные, которые не используются.

Z>Ну нельзя так. Об этом уже говорили. В результате мы получаем вообще четырехзначную логику. Да/Нет/Пустое/Не загружен. В результате получается что мы избавляемся от главного плюса business entity — а именно абстрагирование от внутренней структуры объекта.

Об обратной стороне медали мы тоже уже говорили — на каждый новый запрос нам понадобится новая сущность.

Z>В результате при вызове функции, мы должны всегда будем помнить — загрузили ли мы данные в BE для данной конкретной функции. Упрощения не будет, и как результат — разница между DataSet и business entity нивелируется.


Это всё теоретические домыслы. На практике ничего помнить не надо. Случаи, когда некоторые поля игнорируются в основном связаны с отображением данных в гридах. При этом как правило под такое отображение пишется специфический запрос начиная с клиента и заканчивая БД. Если тебе вдруг захочется отобразить дополнительное поле и его не окажется в ответе сервера, то такая вещь выплывет мгновенно и чтобы её поправить нужно будет лишь включить ещё одно поле в запрос БД.

В общем, мы поехали по второму кругу.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[17]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 28.01.07 07:44
Оценка:
Здравствуйте, adontz, Вы писали:

A>>>Во-первых, объявление даже пустых структур анимает место.

IT>>Ну и что? Пусть себе занимает, тебе жалко что ли?
A>Вобщем-то да, хотя это далеко не главный фактор.

А какой главный?

IT>>А создавать кучу классов и к каждому приписывать где, когда и зачем он используется — это дело перспективное?


A>Вполне. Приписывать ничего не надо, так как такие классы — заточенные под определённую цель, локально используемые сущности. Ну и вменяемые имена рулят. Usr32 плохое имя, даже для служебного класса. А Company.Project.Dto.UserLoginRequest вполне хорошее. с таким именем ничего не надо приписывать, и так всё ясно.


Для логина, как мы уже выяснили, никакого объекта не надо вообще. Для остальных случаев твои имена будут конечно же не User1, User2... Они будут UserForForm1, UserForForm2 и т.п. Т.е. для каждого конкретного случая тебе понадобится новый класс. При этом, даже если стурктуры вдруг случайно совпадут, то тебе всё равно придётся создавать новый класс, т.к вполне вероятно, что тебе придётся изменить один из них в будущем и тогда некоторые в одном из случаев поля останутся пустыми, что по твоей теории недопустимо.

A>>>Во-вторых бывает обратная ситуация, когда данные передаются, но не хранятся в том виде, в котором передаются.

IT>>И в чём проблема?
A>В том, что соответвующего бизнес объекта, пусть даже рыхло заполняемого, просто не существует.

И в чём проблема?
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[9]: DTO внутри BusinessObject
От: IB Австрия http://rsdn.ru
Дата: 28.01.07 08:16
Оценка:
Здравствуйте, adontz, Вы писали:

A> С другой плохо, потому что с инкапсуляция тю-тю.

Почему это? Просто вся логика вынесена в сервисные классы бизнес-слоя, где ей вообщем-то и место, там она и инкапсулируется... Что такого нетривиального содержится в бизнес-объекте User, что должно быть инкапсулировано? Сам по себе он логики не содержит, там нечего скрывать.

A> С двумя полями OldPassword и NewPassword?

Зачем? OldPassword и NewPassword отлично передаются в обычных строках... Хотя это конечно тоже можно считать в некотором роде DTO.. =)

A> Хоть все методы оттуда выкинь, если есть передача частичных, неполных, нехранимых данных,

Я, на самом деле, не придерживаюсь столь радикальной точки зрения как Игорь, но есть одно жизненное наблюдение... Если позволишь, аналогию проведу: в физике, еще в школе учили одному хорошему правилу — если есть задачка и кажется, что данных не хватает — решай задачу с теми данными, которые есть, скорее всего окажется, что лишние переменные просто сократятся.... Так и здесь — когда все четко распишешь, то в большинстве случаев оказывается, что все что хотелось сделать DTO, и так есть в бизнес-объектах (которые, естественно, не содержат логики), а что осталось вполне можно передать в примитивных типах.

A> Мне кажется избыточность протокола больше повлияет на производительность.

Ну, во-первых никакой избыточности на самом деле нет, а во вторых, на производительность, если говорить о сети, гораздо больше влияет частота запросов, в виду ее латентности, нежели размер передаваемых данных. В этом разрезе скорее окажется выгоднее один раз передать 1000 байт, чем три раза по 10. Но это уже отдельный вопрос.. )
Мы уже победили, просто это еще не так заметно...
Re[14]: DTO внутри BusinessObject
От: akasoft Россия  
Дата: 28.01.07 09:16
Оценка:
Здравствуйте, IT, Вы писали:

IT>Зачем? Просто не передавай данные, которые не используются.


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

Типа, надо только ID — заполнили в методе слоя логики ID, но передали класс целиком (в др. полях null), надо ID и DisplayName — вернули их. Так, я правильно понял?

И накладными расходами можно пренебречь?


class User
{
    public int    ID          { get; }
    public string SystemName  { get; }
    public string DisplayName { get; }
}

class UserManager
{
    public void       ChangePassword(int userID, string oldPassword, string newPassword);
    public User       GetUser(int userID);
    public List<User> GetUserList();
}
... << RSDN@Home 1.2.0 alpha rev. 673>> SQL Express 2005
Re[16]: DTO внутри BusinessObject
От: GlebZ Россия  
Дата: 28.01.07 09:27
Оценка:
Здравствуйте, IT, Вы писали:

IT>>>Зачем? Просто не передавай данные, которые не используются.

Z>>Ну нельзя так. Об этом уже говорили. В результате мы получаем вообще четырехзначную логику. Да/Нет/Пустое/Не загружен. В результате получается что мы избавляемся от главного плюса business entity — а именно абстрагирование от внутренней структуры объекта.
IT>Об обратной стороне медали мы тоже уже говорили — на каждый новый запрос нам понадобится новая сущность.
Смотря какой запрос. Что касается запроса сервера баз данных — то тут будет избыточность получаемых данных, и это нормально. Что касается запросов к серверу — надо думать в каждом конкретном случае.

Z>>В результате при вызове функции, мы должны всегда будем помнить — загрузили ли мы данные в BE для данной конкретной функции. Упрощения не будет, и как результат — разница между DataSet и business entity нивелируется.

IT>Это всё теоретические домыслы.
Окей. Как бы ты решал аналогичную задачу?
[Flags]
public enum DogLoadMode
{
  Dog,
    Foots,
    Head,
    Nose,
    Tail
}
public string GetDog(string id, DogLoadMode loadMode)
{
    Stream stream=DTOHelper.CreateStream();
  if ((loadMode&DogLoadMode.Dog)!=0)    
        DTOHelper.Serialize(stream, Dogs.GetDogById(id));
  if ((loadMode&DogLoadMode.Foots)!=0)    
        DTOHelper.Serialize(stream, Foots.GetFootsByDog(id));
  if ((loadMode&DogLoadMode.Head)!=0)
        DTOHelper.Serialize(stream, Heads.GetHeadByDog(id));
  if ((loadMode&DogLoadMode.Nose)!=0)    
        DTOHelper.Serialize(stream, Noses.GetNoseByDog(id));
  if ((loadMode&DogLoadMode.Tail)!=0)    
        DTOHelper.Serialize(stream, Tails.GetTailByDog(id));
  return DTOHelper.StreamToString(stream);
}
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re[12]: DTO внутри BusinessObject
От: varely  
Дата: 28.01.07 11:52
Оценка:
Здравствуйте, IT, Вы писали:

IT>Таким образом DTO можно обозвать всё что угодно, даже пакеты TCP. А назвав всё что можно DTO мы начинаем пихать его куда ни поподя уже не понимая нужно оно там или нет. Твой пример с ChangePassword это очень хорошо демонстрирует. Там где можно обойтись тремя параметрами ты создал целый класс. Класс здесь, класс там, а потом мы удивляемся почему сложность системы выходит из под контроля.


Ок. Но как же быть с технологиями которые предполагают и рекомендуют использование DTO? Взять тот же WCF, например... Ведь дата контракты это чистейшей воды DTO.

Вот возьмем к примеру многоуровневое и распределенное приложение которое использует WCF и "легкие" сущности. Так мы можем дойти до ситуации когда на каждом свойстве наших сущностей будет навешано до десятка атрибутов (валидация, дата контракт, маппинг бд и т.д.). А эти атрибуты определены в других сборках которые тоже надо тащить по всем уровням. Все это увеличивает связность приложения.
В этом случае не лучше ли будет разделить сущности и раздать им ту функциональность которая необходима на конкретном уровне? Клиентским сущностям привязка к UI и простая валидация, серверным — маппинг в базу данных, валидация уровня бизнес логики и DTO для передачи по WCF. Все это уменьшит связность уровней и четко очертит зоны применения конкретных сущностей. Разве это сделает систему сложней? Или увеличит сложность поддержки?
Re[17]: DTO внутри BusinessObject
От: TK Лес кывт.рф
Дата: 28.01.07 13:31
Оценка:
Hello, "GlebZ"

> Окей. Как бы ты решал аналогичную задачу?


Задачка из разряда "специально не придумаешь" Это, что реальный код? Что в итоге возвращает метод GetDog? С одной стороны вроде как собаку. Но, почему тогда в виде строки... С другой стороны, если посмотреть глубже то вроде как возвращает он не только собак но и носы, хвосты и т.п...
Posted via RSDN NNTP Server 2.0
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[18]: DTO внутри BusinessObject
От: GlebZ Россия  
Дата: 28.01.07 15:26
Оценка:
Здравствуйте, TK, Вы писали:

TK>Задачка из разряда "специально не придумаешь" Это, что реальный код? Что в итоге возвращает метод GetDog? С одной стороны вроде как собаку. Но, почему тогда в виде строки...

А какая разница? В виде строки XML, в виде объекта, в виде ... От этого смысл не меняется. Важно то, что вконкретном примере объекты при переносе становятся стримом.
TK>С другой стороны, если посмотреть глубже то вроде как возвращает он не только собак но и носы, хвосты и т.п...
Не носы и хвосты, а конкретный нос и конкретный хвост(если он вообще есть) конкретной собаки.
Я просто попросил сделать аналогичную задачу по той методике которую использует IT. Или, например, ты?
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re[17]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 28.01.07 17:16
Оценка:
Здравствуйте, GlebZ, Вы писали:

GZ>Окей. Как бы ты решал аналогичную задачу?


В такой постановке я бы её решил так:

public Dog GetDog(string id)
{
    return DogAccessor.GetWholeDog(id);
}

Код проще, обращений к БД меньше.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[15]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 28.01.07 17:30
Оценка:
Здравствуйте, akasoft, Вы писали:

A>Давай вернёмся к примеру. Ты хочешь сказать, что нужно описать класс, который будет содержать все мыслимые данные на все случаи жизни, а затем использовать его во всяких вызовах, но заполнять поля "по требованию"?


Нет, я не хочу сказать, что класс будет содержать все мыслимые данные на все случаи жизни. Это тоже самое, что сказать, что одна таблица базы данных будет содержать все данные приложения. Бред, не так ли? Конечно же так никто не делает. Более того, на практике часто получается, что объектная модель приложения несколько отличается от модели БД и вполне допустимо, что разные сущности приложения являются либо подмножеством какой-либо таблицы, либо, чаще, комбинацией данных из нескольких таблиц и/или агрегированных данных. Как правило, такая модель содержит минимум необходимых сущностей, которые покрывают 90% функциональности приложения. Остальные 10% — это где-то местами неиспользуемые поля.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[13]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 28.01.07 18:27
Оценка: 21 (4)
Здравствуйте, varely, Вы писали:

V>Ок. Но как же быть с технологиями которые предполагают и рекомендуют использование DTO? Взять тот же WCF, например... Ведь дата контракты это чистейшей воды DTO.


Кто это сказал?

V>Вот возьмем к примеру многоуровневое и распределенное приложение которое использует WCF и "легкие" сущности. Так мы можем дойти до ситуации когда на каждом свойстве наших сущностей будет навешано до десятка атрибутов (валидация, дата контракт, маппинг бд и т.д.). А эти атрибуты определены в других сборках которые тоже надо тащить по всем уровням. Все это увеличивает связность приложения.


Очень хороший вопрос. Главное конкретный, а не высосанный из пальца. На конкретный вопрос можно привести конкретный пример.

Всё зависит где и зачем используется WCF. Если это часть внутреннего приложения, то я бы не стал заморачиваться отдельными DTO. Или возьмём, к примеру, тот же янус. Контракт, предоставляемый сервером можно было сделать на DTO, но на практике это никаких преимуществ не даст. Вообще никаких. Но сложность сопровождения увеличит. Нужны нам здесь отдельные DTO? Я думаю вряд ли. Теперь возьмём, например, банковскую систему, которая предоставляет некоторую информацию клиентам. Имеет ли здесь выставлять на показ потроха нашей системы? Не имеет. Здесь можно было бы воспользовать DTO. Но! Есть один момент. Скорее всего, на 99%, такая система будет придоставлять данные в виде XML, а следовательно все атрибуты, навешанные на бизнес сущности просто элементарно будут отсечены. Имеет ли смысл в этом случае городить огород? Не знаю, надо разбираться с конкретной задачей.

V>В этом случае не лучше ли будет разделить сущности и раздать им ту функциональность которая необходима на конкретном уровне? Клиентским сущностям привязка к UI и простая валидация,


Клиентская валидация в большинстве случаев делается с помощью контролов. Базовая валидация вообще скорее всего совпадает с серверной базовой валидацией. Странно предположить, что, например, на клиенте длина строки должна быть не более 50-ти строк, а вот на сервере уже не более 40-ка. А раз так, то вполне логично определить такое правило один раз в одном месте, а не на каждом уровне.

V>серверным — маппинг в базу данных, валидация уровня бизнес логики и DTO для передачи по WCF. Все это уменьшит связность уровней и четко очертит зоны применения конкретных сущностей.


Зона применения конкретной сущности не слой, а функция, выполняемая системой. Т.е. мы имеем не горизонтальное по слоям, а вертикальное по функциональности деление. В большинстве приложений 80-90% обращений к серверу представляют собой переадресацию запроса по слоям до самой БД, выборку данных и обратный процесс доставки данных на клиента. Какой смысл переливать данные из одного формата в другой на каждом уровне?

V>Разве это сделает систему сложней? Или увеличит сложность поддержки?


Конечно увеличит. Давай сравним. Допустим нам нужно отобразить список пользователей на гриде. Вот минимальное решение.

BE:
class User
{
    public string FirstName;
    public string LastName;
}

UI:
class UserListDialog
{
    public void OnLoad()
    {
        binder.List = new UserManager().GetUserListByCriteria(...);
    }
}

BL:
class UserManager
{
    public List<User> GetUserListByCriteria(...)
    {
        return UserAccessor.GetUserListByCriteria(...);
    }
}

DAL:
class UserAccessor
{
    public List<User> GetUserListByCriteria(...)
    {
        return GetAndMapData("SELECT * FROM User WHERE...", ...);
    }
}

Всё просто, я бы даже сказал примитивно. Если бы не дань традициям, то UserManager.GetUserListByCriteria вообще можно было бы опустить, унаследовав UserManager от UserAccessor.

Теперь напишем вариант с перекладыванием данных:

UI:
class UserUI
{
    public string FirstName;
    public string LastName;
}

class UserListDialog
{
    public void OnLoad()
    {
        List<UserDTO> userDTOs = new UserManager().GetUserListByCriteria(...);
        List<UserUI>  userUIs  = Map(userDTOs);

        binder.List = userUIs;
    }
}

BL:
class UserDTO
{
    public string FirstName;
    public string LastName;
}

class UserObject
{
    public string FirstName;
    public string LastName;
}

class UserManager
{
    public List<UserDTO> GetUserListByCriteria(...)
    {
        List<UserObject> users    = UserAccessor.GetUserListByCriteria(...);
        List<UserDTO>    userDTOs = Map(users);

        return userDTOs;
    }
}

DAL:
class UserAccessor
{
    public List<UserObject> GetUserListByCriteria(...)
    {
        return GetAndMapData("SELECT * FROM User WHERE...", ...);
    }
}

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

Но это ещё не всё. Допустим в процессе сопровождения нам понадобилось добавить ещё одну колонку MiddleName. Для того, чтобы это сделать, мне нужно будет добавить эту колонку в БД, на форму и в BE User. Тебе — в БД, на форму, в классы UserObject, UserDTO, UserUI. Если у тебя больше слоёв, значит во все существующие. Учитывая, что реальные приложения многократно сложнее этого примера, то и количество телодвижений пропорционально увеличивается, увеличивается запутанность кода, что в свою очередь приводит лавинообразному процессу и выхода сложности системы из под контроля.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[14]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 28.01.07 18:37
Оценка:
Здравствуйте, IT, Вы писали:

V>>серверным — маппинг в базу данных, валидация уровня бизнес логики и DTO для передачи по WCF. Все это уменьшит связность уровней и четко очертит зоны применения конкретных сущностей.


Да... ещё забыл насчёт связности. Какой из примеров теперь выглядит более связным?
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[18]: DTO внутри BusinessObject
От: GlebZ Россия  
Дата: 28.01.07 19:10
Оценка:
Здравствуйте, IT, Вы писали:

IT>
IT>public Dog GetDog(string id)
IT>{
IT>    return DogAccessor.GetWholeDog(id);
IT>}
IT>

IT>Код проще,
Код действительно проще. Но не для клиента.
IT>обращений к БД меньше.
Это не есть верно. Если при нагрузочном тестировании я решу что при загрузке собаки часто используется какие-то доп. сущности и латентность запросов БД влияет на производительность — я могу загружать одновременно их в один запрос. Метод GetDogById etc — это запрос к базе только если он не был загружен ранее в том же контексте запроса сервера (или нет более сложной системы). То есть, у меня есть возможность более гибко управлять системой в отличие от твоего способа. Потому как если кроме собаки появится сороконожка, то мы вполне можем положить сервер.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re[19]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 28.01.07 19:29
Оценка:
Здравствуйте, GlebZ, Вы писали:

IT>>обращений к БД меньше.

GZ>Это не есть верно. Если при нагрузочном тестировании я решу что при загрузке собаки часто используется какие-то доп. сущности и латентность запросов БД влияет на производительность — я могу загружать одновременно их в один запрос.

Я думаю, что не всё так просто. Иначе бы ты привёл такой код сразу. Не так ли?

GZ>Метод GetDogById etc — это запрос к базе только если он не был загружен ранее в том же контексте запроса сервера (или нет более сложной системы). То есть, у меня есть возможность более гибко управлять системой в отличие от твоего способа.


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

GZ>Потому как если кроме собаки появится сороконожка, то мы вполне можем положить сервер.


Вот когда появится сороконожка, тогда мы с ней и будем разбираться. А пока давай о собаке.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[18]: DTO внутри BusinessObject
От: GlebZ Россия  
Дата: 28.01.07 19:30
Оценка:
Здравствуйте, IT, Вы писали:

IT>В такой постановке я бы её решил так:

И еще. В такой постановке ты противоречишь сам себе.

Просто не передавай данные, которые не используются

... << RSDN@Home 1.2.0 alpha rev. 0>>
Re[15]: DTO внутри BusinessObject
От: GlebZ Россия  
Дата: 28.01.07 19:31
Оценка:
Здравствуйте, IT, Вы писали:

IT>Да... ещё забыл насчёт связности. Какой из примеров теперь выглядит более связным?

Что значит выглядит? Твой пример более связный. Допустим, оказалось что агрегирующий запрос по количеству писем отправленных пользователем подсаживает базу данных. И неплохо было бы реализовать агрегат тригерами на новое поле в пользователе. Как бы чистая проблема сервера. Но в твоем случае — оно затронет клиента.
К тому же не забывай. Если DTO объект полностью равнозначен BE то можно воспользоваться BE для сериализации. Если он перестал нас удовлетворять как DTO, то мы вполне можем ввести свой custom объект.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re[20]: DTO внутри BusinessObject
От: GlebZ Россия  
Дата: 28.01.07 19:52
Оценка:
Здравствуйте, IT, Вы писали:

IT>Я думаю, что не всё так просто. Иначе бы ты привёл такой код сразу. Не так ли?

Да нет. Там все просто. Просто я выполняю некоторый принцип что объекты друг к дружке не клеются по ссылкам, а обращаются по идентификаторам. В контекте запроса хранится Hashtable в которой лежат пары идентификатор-объект. Сначала проверяется Hashtable, если не нашли — то уже запрос. И я на уровне бизнес-логики не обращаю внимание — загружается этот объект или уже был загружен. А уже при нагрузочном тестировании при большом кол-ве данных можно выверять что, где и как лучше.

IT>Гибкость хороша когда она востребована. В моём примере она просто не нужна. А раз так, то учитывая, что плата за гибкость есть усложнение системы, то твоё решение не обладая никакими преимуществами является более сложным и трудно сопровождаемым.

А обычно именно такая гибкость и востребована. Ввели для собаки шкуру. Сами BE собаки я могу не трогать. И вполне могу не тестировать, поскольку при реализации шкурного вопроса — это саму собаку как таковую мы не затрагиваем. Я дополняю функциональность сервера по мере развития — но не переопределяю.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re[19]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 28.01.07 19:55
Оценка:
Здравствуйте, GlebZ, Вы писали:

IT>>В такой постановке я бы её решил так:

GZ>И еще. В такой постановке ты противоречишь сам себе.
GZ>

Просто не передавай данные, которые не используются


Это не противоречие. У меня нет комплекса передачи лишнего байта с сервера на клиента. Это просто рекомендация фанатикам DTO.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[16]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 28.01.07 20:10
Оценка: :)
Здравствуйте, GlebZ, Вы писали:

IT>>Да... ещё забыл насчёт связности. Какой из примеров теперь выглядит более связным?

GZ>Что значит выглядит? Твой пример более связный. Допустим, оказалось что агрегирующий запрос по количеству писем отправленных пользователем подсаживает базу данных. И неплохо было бы реализовать агрегат тригерами на новое поле в пользователе. Как бы чистая проблема сервера. Но в твоем случае — оно затронет клиента.

А в твоём можно подумать не затронет. Ещё как затронет, но только лишь с той разницей, что мне нужно будет добавить поле, а тебе целый класс. Короче, сколько можно толочь одну и ту же воду в ступе. Надоело уже.

GZ>К тому же не забывай. Если DTO объект полностью равнозначен BE то можно воспользоваться BE для сериализации. Если он перестал нас удовлетворять как DTO, то мы вполне можем ввести свой custom объект.


Блин, мне уже надоело сегодня задавать этот вопрос. Но всё же... И в чём проблема?
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[16]: Так всё же...
От: akasoft Россия  
Дата: 28.01.07 20:11
Оценка:
Здравствуйте, IT, Вы писали:

IT>Как правило, такая модель содержит минимум необходимых сущностей, которые покрывают 90% функциональности приложения. Остальные 10% — это где-то местами неиспользуемые поля.


Я всё-таки ещё раз уточню, на основе того же примера про пользователя. По-твоему, является нормальным, если в одном случае из десяти класс User, например, будет содержать валидный ID и SystemName и, скажем, инициализированный по умолчанию (null) член DisplayName? Если, к примеру, в этом вызове он "не нужен".

Это не является признаком кривой архитектуры?

(Я не пытаюсь подколоть, я просто хочу разобраться в собственных абстракциях.)
... << RSDN@Home 1.2.0 alpha rev. 673>> SQL Express 2005
Re[21]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 28.01.07 20:15
Оценка:
Здравствуйте, GlebZ, Вы писали:

GZ>А обычно именно такая гибкость и востребована. Ввели для собаки шкуру. Сами BE собаки я могу не трогать. И вполне могу не тестировать, поскольку при реализации шкурного вопроса — это саму собаку как таковую мы не затрагиваем. Я дополняю функциональность сервера по мере развития — но не переопределяю.


В прошлый раз выяснилось, что твоя задача, исходя из которой ты придумываешь сценарии вообще может обойтись без объектов. NameValueCollection — вот твой единственный DTO. Думаю, что продолжая этот спор, через 5-10 топиков мы придём к тому же выводу.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[22]: DTO внутри BusinessObject
От: GlebZ Россия  
Дата: 28.01.07 20:53
Оценка:
Здравствуйте, IT, Вы писали:

IT>В прошлый раз выяснилось, что твоя задача, исходя из которой ты придумываешь сценарии вообще может обойтись без объектов.

Смотря каких. В данной задаче: Если ты имеешь ввиду BE — то нет. Если ты имеешь ввиду DTO — то если понадобится, можно такое организовать. Я и не буду возражать что это возможно. Я специально не стал вводить такое условие в эту исходную задачу. Пока мне интересен вопрос непротиворечивости полузаполненных объектов.

IT> NameValueCollection — вот твой единственный DTO. Думаю, что продолжая этот спор, через 5-10 топиков мы придём к тому же выводу.

Что значит единственный DTO? Вообще-то DTO — это коллекции объектов. Иногда разнотипных объектов связнных каким-то сценарием.

Я не работаю с большими иерархиями в BE. Я не боюсь большого количества BE, если они максимально просты и непротиворечивы. Я привык получать от этого пользу. У меня, действительно, процентов 90 объектов — плоcкие. Но я не могу сказать что от этого система усложняется. Скорее наоборот, она качественее адаптируется к изменениям. Но это не касается DTO.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re[20]: DTO внутри BusinessObject
От: GlebZ Россия  
Дата: 28.01.07 20:53
Оценка:
Здравствуйте, IT, Вы писали:

GZ>>

Просто не передавай данные, которые не используются

IT>Это не противоречие. У меня нет комплекса передачи лишнего байта с сервера на клиента. Это просто рекомендация фанатикам DTO.
Если бы не эта фраза, то я бы и не стал опять вмешиваться. В остальном твоя позиция мне уже известна — но вот это утверждение мне, не нравится.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re[17]: DTO внутри BusinessObject
От: GlebZ Россия  
Дата: 28.01.07 20:57
Оценка:
Здравствуйте, IT, Вы писали:

IT>А в твоём можно подумать не затронет.

Клиент об этом не узнает. Проблема сервера инкапсулирована в сервере за слоем DTO и никак не затрагивает контракт.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re[17]: Так всё же...
От: IT Россия linq2db.com
Дата: 28.01.07 21:12
Оценка: 12 (1)
Здравствуйте, akasoft, Вы писали:

A>Это не является признаком кривой архитектуры?


Признаком кривой архитектуры является громоздкое, запутанное, плохо расширяемое решение. Если то о чём ты говоришь приведёт именно к этому, то да, это криво. Если не приведёт, а наоборот сделает решение более простым и лёгким в сопровождении, то нет.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[18]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 28.01.07 21:16
Оценка:
Здравствуйте, GlebZ, Вы писали:

IT>>А в твоём можно подумать не затронет.

GZ>Клиент об этом не узнает. Проблема сервера инкапсулирована в сервере за слоем DTO и никак не затрагивает контракт.

Как это не узнает. Здрасьте! А поле в грид кто добавлять будет? Сервер?
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[19]: DTO внутри BusinessObject
От: GlebZ Россия  
Дата: 28.01.07 21:49
Оценка:
Здравствуйте, IT, Вы писали:


IT>Как это не узнает. Здрасьте! А поле в грид кто добавлять будет? Сервер?

Перечитай исходное сообщение — Re[15]: DTO внутри BusinessObject
Автор: GlebZ
Дата: 28.01.07
. Здесь не добавление функциональности, а изменение реализации в которой добавилось поле в BE. И утверждение что контракт при этом можно не менять.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re[20]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 28.01.07 22:44
Оценка:
Здравствуйте, GlebZ, Вы писали:

IT>>Как это не узнает. Здрасьте! А поле в грид кто добавлять будет? Сервер?

GZ>Перечитай исходное сообщение — Re[15]: DTO внутри BusinessObject
Автор: GlebZ
Дата: 28.01.07
.


У меня есть своя версия исходного сообщения
Автор: IT
Дата: 28.01.07
, ещё более исходное, чем твоё
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[15]: DTO внутри BusinessObject
От: TK Лес кывт.рф
Дата: 29.01.07 08:50
Оценка:
Hello, "adontz"
>
> IT>Зачем? Просто не передавай данные, которые не используются.
>
> Во-первых, объявление даже пустых структур анимает место. Кроме того
> приписывать к классу кучу комментариев — "если объект этого класса
> возвращён методов А, то поле Б не заполнено" дло ИМХО бесперспективное

ADSI именно так и делает. Можно рассмотреть пример реализации ADSI в стиле
"DTO вокруг"?
Posted via RSDN NNTP Server 2.0
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[19]: DTO внутри BusinessObject
От: TK Лес кывт.рф
Дата: 29.01.07 08:56
Оценка: 1 (1) +1
Hello, "GlebZ"
> TK>С другой стороны, если посмотреть глубже то вроде как возвращает он не
> только собак но и носы, хвосты и т.п...
> Не носы и хвосты, а конкретный нос и конкретный хвост(если он вообще есть)
> конкретной собаки.
> Я просто попросил сделать аналогичную задачу по той методике которую
> использует IT. Или, например, ты?

На самом деле не важно возаращается конкретный нос или нет. Важно то, что
метод под названием ДайСобаку возвращает объекты типа Нос. Для данной задачи
метод GetDog должен возвращать собаку. А уж целую или нет — это дело вкуса.
Posted via RSDN NNTP Server 2.0
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[20]: DTO внутри BusinessObject
От: GlebZ Россия  
Дата: 29.01.07 09:08
Оценка:
Здравствуйте, TK, Вы писали:

TK>На самом деле не важно возаращается конкретный нос или нет. Важно то, что

TK>метод под названием ДайСобаку возвращает объекты типа Нос. Для данной задачи
TK>метод GetDog должен возвращать собаку. А уж целую или нет — это дело вкуса.
По правде говоря да. Если следовать данной логике, и носа без животного нет, то отсечение DogLoadMode.Dog — вряд ли будет использоваться.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re[14]: DTO внутри BusinessObject
От: varely  
Дата: 29.01.07 11:49
Оценка: 18 (1)
Здравствуйте, IT, Вы писали:

V>>Ведь дата контракты это чистейшей воды DTO.

IT>Кто это сказал?

Ну так Microsoft их проталкивает в таком облике. Не в зубах же ими ковырятся!

V>>Вот возьмем к примеру многоуровневое и распределенное приложение которое использует WCF и "легкие" сущности. Так мы можем дойти до ситуации когда на каждом свойстве наших сущностей будет навешано до десятка атрибутов (валидация, дата контракт, маппинг бд и т.д.). А эти атрибуты определены в других сборках которые тоже надо тащить по всем уровням. Все это увеличивает связность приложения.


IT>Очень хороший вопрос. Главное конкретный, а не высосанный из пальца. На конкретный вопрос можно привести конкретный пример.

IT> Имеет ли смысл в этом случае городить огород? Не знаю, надо разбираться с конкретной задачей.

Задача — найти золотую середину для архитектуры приложения работающего с финансовыми данными. Распределенность, Smart & Web clients, серверная часть расчитаная на несколько сот пользователей, разграничение прав/доступа/данных — это главные черты.
И здесь, отсутсвие опыта в это вопросе мне подсказывает подстраховаться... Я не могу как седой мудрец ака Архитектор ткнуть пальцем и сказать: "надо взять вот этот O/R Mapper". Вместо этого, я беру понравившийся мапер, прячу его за еще одним уровнем абстракции чтобы потом, если появятся проблемы было возможно его безболезненно заменить... И так практически со всеми компонентами системы! (включая сущности) Вы скажете паранойя? ДА! Но как по другому обезопасится от ошибок в дизайне при отсутвия опыта и "седого мудреца" за соседним столом?

IT>Конечно увеличит. Давай сравним. Допустим нам нужно отобразить список пользователей на гриде. Вот минимальное решение.


Да, это упрощенный, но тем не менее реальный пример.

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


Да, согласен, некоторые осложнения при поддержке гарантированы — нарушается принцип DRY — Don't repeat yourself.
Но все не так уж и плохо: в некоторых случаях можно совместить например DTO и клиентские сущности и биндить их на формы.

А вобще, следя за развитием этого топика, мне пришла мысль что разногласия не так уж и велики: обе стороны согласны, что обьектная модель не обязательно может совпадать в клиентской и серверной частях приложения. Но если ты, Игорь, (если я правильно понял) за то чтобы серверная часть модели только расширяла клиентскую часть модели предметной области, то мне и другим оппонентам кажется более правильным подход когда существует две разных модели — похожих, но разных. С разными задачами: одна, заточена на прибивание на формы, а другая — для обслуживания нужд серверной бизнес логики... В любом случае мы получаем 2 различных модели. Так не лучше ли разделить их? "Разделяй и властвуй"! Разве нет?

Да, все вышесказаное верно для приложений отличных от "вытащить из базы, протащить по слоям и показать".
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[15]: DTO внутри BusinessObject
От: varely  
Дата: 29.01.07 11:51
Оценка: 1 (1) +1
Здравствуйте, IT, Вы писали:

IT>Да... ещё забыл насчёт связности. Какой из примеров теперь выглядит более связным?


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

Как избежать связности?
Например, UI часть работает со своими своими сущностями, ни о DTO, ни о каком-то сервере ничего не знает. Но! У клиента есть манюсенький слой, который знает какой тропой ходить к серверу, как просить у него данные и разруливать исключительные ситуации. Вот этот слой (иногда его называют Service Agent) и производит упаковку в/из DTO. Далее, все это передается на сервер, где висит сервис который отвечает за вызовы к уровню бизнес логики а также отвечает за маппинг DTO в серверную бизнес сущность. Таким образом, клиент у нас абсолютно никак не связан с сервером — он о нем даже не знает. Вот это я называю слабой связностью (low coupling).

При таком подходе, что мы имеем в минусе:
— поддержка трех разных сущностей как следствие усложнение поддержки.
— дублирование некоторой информации
— ручной или полу-автоматический мапинг DTO <-> сущность
В плюсе у нас:
— разделение ответственности (separation of concerns) — каждая часть занимается тем чем надо и сущности не перегружаются функциональностью и метаинформацией.
— полная независимость клиента от сервера. можно:
а) переписать клиента не затрагивая сервер и наоборот
б) написать еще один клиент (есть декстоп клиент, можно написать Web клиент)
в) присоединить клиент напрямую к серверной логике (и получить однопользовательские приложение)
г) разделить разработку сервера и клиета между разными командами.
— в случае использования продвинутой технологии передачи данных это дает возможность использовать все возможности технологии (к примеру, версионность).

PS: я могу быть не прав. "Я не волшебник, я только учусь". Может быть более опытные архитекторы/програмисты могут создать "с наскоку" более удачную структуру приложения учитывая свой предыдущий опыт. У меня такого опыта нет, так что я пытаюсь минимизировать риски и создать универсальную архитектуру, подходящюю под самое главное требование заказчика: "пойди туда не знаю куда, сделай то не знаю что".
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[15]: DTO внутри BusinessObject
От: IT Россия linq2db.com
Дата: 29.01.07 18:01
Оценка:
Здравствуйте, varely, Вы писали:

V>>>Ведь дата контракты это чистейшей воды DTO.

IT>>Кто это сказал?

V>Ну так Microsoft их проталкивает в таком облике. Не в зубах же ими ковырятся!


Не приведёшь ли какую-нибудь ссылочку, чтобы я мог убедиться в том, что MS действительно это проталкивает?

V>И здесь, отсутсвие опыта в это вопросе мне подсказывает подстраховаться... Я не могу как седой мудрец ака Архитектор ткнуть пальцем и сказать: "надо взять вот этот O/R Mapper". Вместо этого, я беру понравившийся мапер, прячу его за еще одним уровнем абстракции чтобы потом, если появятся проблемы было возможно его безболезненно заменить... И так практически со всеми компонентами системы! (включая сущности) Вы скажете паранойя? ДА! Но как по другому обезопасится от ошибок в дизайне при отсутвия опыта и "седого мудреца" за соседним столом?


Обезопасится очень просто. Нужно стремится получить максимально простое решение.

В моей практике дополнительные абстрактные уровни "на всякий случай" оправдывали себя только в одном случае, когда надо было защититься от бестолковости и упёртости других девелоперов. Вот где абстрактные уровни рулят немерянно. Если я UI девелопер и у меня есть список ФТ и мокапы экранов, то делайте в своей бизнес логике что хотите, только выдайте мне нужные данные хоть в каком-нибудь виде. Но это отмороженные ситуации, которых было не так много.

Обычно же, введение дополнительных уровней и усложнение логики их взаимодействия ни к чему хорошему не приводит и никаких преимуществ не даёт. Что ты будешь делать если, например, тебе нужно будет поменять поле Address на список Addresses? Думаешь можно будет безболезненно спрятаться за одним уровнем? Я очень сильно сомневаюсь. Нужно будет протащить это изменение по всем уровням. Но так как твоё решение сложнее, многословнее и запутаннее, то сделать это будет куда труднее.

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

V>Но все не так уж и плохо: в некоторых случаях можно совместить например DTO и клиентские сущности и биндить их на формы.


Можно, но это уже будут не DTO

V>А вобще, следя за развитием этого топика, мне пришла мысль что разногласия не так уж и велики: обе стороны согласны, что обьектная модель не обязательно может совпадать в клиентской и серверной частях приложения. Но если ты, Игорь, (если я правильно понял) за то чтобы серверная часть модели только расширяла клиентскую часть модели предметной области, то мне и другим оппонентам кажется более правильным подход когда существует две разных модели — похожих, но разных. С разными задачами: одна, заточена на прибивание на формы, а другая — для обслуживания нужд серверной бизнес логики... В любом случае мы получаем 2 различных модели. Так не лучше ли разделить их? "Разделяй и властвуй"! Разве нет?


Нет. Я не против разных моделей, я против выделения DTO как объектов, предназначенных исключительно для транспорта. А если DTO не выделять, то окажется, что между этими моделями больше общего, чем разного и многие вещи можно повторно использовать.
Если нам не помогут, то мы тоже никого не пощадим.
Re[16]: DTO внутри BusinessObject
От: varely  
Дата: 29.01.07 18:57
Оценка:
Здравствуйте, IT, Вы писали:

IT>Не приведёшь ли какую-нибудь ссылочку, чтобы я мог убедиться в том, что MS действительно это проталкивает?


Ну, по крайней мере у меня сложилось такое впечатление. В документации, статьях и примерах Data Contract (и Message) это прежде всего единицы передачи/упаковки данных...

IT>Обезопасится очень просто. Нужно стремится получить максимально простое решение.


Аксиома! Записать и повторять каждый раз перед тем как

IT>Я же поступлю проще. Я уберу лишние уровни и лишний код, а когда появятся проблемы, то просто проведу рефакторинг, который на простом коде сделать будет не сложно.


Спасибо.
С меня

IT>Нет. Я не против разных моделей, я против выделения DTO как объектов, предназначенных исключительно для транспорта. А если DTO не выделять, то окажется, что между этими моделями больше общего, чем разного и многие вещи можно повторно использовать.
Re[47]: DTO внутри BusinessObject
От: Sinclair Россия https://github.com/evilguest/
Дата: 31.01.07 08:59
Оценка: 65 (5) +1 :)
Здравствуйте, GlebZ, Вы писали:

IT>>>>Например, сопровождаемость.

GZ>>>Сопровождаемость в разных задачах значат разные вещи. Что ты в данном случае имеешь ввиду под сопровождаемостью?
IT>>Готовность системы к будущим изменениям.
GZ>К каким изменениям? Для одних это подмена всего сервера, для других версионификация контракта, для третьих возможность добавления новых типов и т.д. и т.п. Low Coupling/High Cohesion — есть свойство любой правильной архитектуры.
Вообще говоря, точно так же, как и при обсуждении масштабируемости, поддерживаемость должна конкретизироваться. Невозможно разработать просто "более готовую к изменениям систему". Нужно хотя бы на элементарном уровне прикинуть, какого рода изменения могут произойти и насколько часто.
Ну вот, например, для бензоколонки цена бензина — очень часто меняющаяся вещь; список действующих дисконтных программ меняется пореже, а новая марка бензина вообще имеет шанс не появиться за время жизни софта.
Это означает, что решение, требующее перекомпиляции для изменения цены идет в топку сразу же, а для внесения нового топлива — нет. Более того, заморачивание над умением системы мгновенно изменять список бензинов чревато тем, что бюрократы называют "нецелевым использованием средств".

Вот, кстати, из моего опыта многие архитекторы совершенно неверно оценивают вот эти перспективы изменений, и получают совершенно ублюдочные системы. Почему?
Да потому, что все эти семь слоев радуги оправдывают "возможностью перейти на другую СУБД с минимальными затратами". А эта возможность не нужна почти никогда. Зато желание "добавить колонку", которое возникает в среднем 20-25 раз в год, требует в 15 раз больше изменений, чем в старой доброй "однослойной" модели. Потому, что надо чинить все 7 слоев и 8 адаптеров между ними.
1.2.0 alpha rev. 655
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[15]: DTO внутри BusinessObject
От: Sinclair Россия https://github.com/evilguest/
Дата: 31.01.07 10:52
Оценка: 6 (1)
Здравствуйте, GlebZ, Вы писали:

GZ>Здравствуйте, IT, Вы писали:


IT>>Зачем? Просто не передавай данные, которые не используются.

GZ>Ну нельзя так. Об этом уже говорили. В результате мы получаем вообще четырехзначную логику. Да/Нет/Пустое/Не загружен. В результате получается что мы избавляемся от главного плюса business entity — а именно абстрагирование от внутренней структуры объекта. В результате при вызове функции, мы должны всегда будем помнить — загрузили ли мы данные в BE для данной конкретной функции. Упрощения не будет, и как результат — разница между DataSet и business entity нивелируется.

Гм. Позволю себе напомнить про SQL, как протокол передачи данных между клиентом и сервером.
Вся сила SQL — именно в том, что в него встроен автоматический вывод типов. Т.е. когда я делаю
select FirstName, LastName from user

я явно указываю, какие поля вернуть. Проблемы "пустое"/"непустое" просто не существует. Можно считать, что каждый запрос неявно вводит отдельный тип DTO. При вызове функции ошибиться невозможно.

Я вижу проблему современных коммуникационных протоколов именно в их чрезмерно жесткой типизации. С одной стороны, приятно иметь компайл-тайм гарантию, что в коде не будет обращения к Address пользователя, полученного аналогом вышеуказанного запроса. С другой стороны, нет возможности, к примеру, разделить операторы фильтра и проекции. Для каждого возможного запроса мы вынуждены явно вводить новый тип результата. Ну либо изобретать членоудлинители типа проверки наличия заполнения значения конкретного свойства.

Одним из возможных выходов является отказ от явной типизации коммуникаций. Почему бы клиенту не использовать всё тот же SQL для общения с сервером приложений? Просто это будет несколько более другой SQL. Точнее, он будет работать не над настоящими table и view, а над бизнес-моделью. К слову, тот же LDAP, насколько я помню, работает примерно так (только язык запросов у них не SQL).

А вопрос компайл-тайм проверки решается средствами того, что и осуществляет этот компайл-тайм. Т.е. языка. См. DLinq в качестве примера. Метаданные о структуре запроса становятся известны компилятору, который может провести статическую валидацию запросов.

Имхо, это всё намного круче объектно-ориентированных транспортов, которые вынуждают к сексу с DTO на ровном месте. Если это не обладает ни identity, ни state, ни bahavior, то какого хрена мы называем это Object, пусть даже и Data Transfer?
1.2.0 alpha rev. 655
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[48]: DTO внутри BusinessObject
От: GlebZ Россия  
Дата: 31.01.07 11:39
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Вот, кстати, из моего опыта многие архитекторы совершенно неверно оценивают вот эти перспективы изменений, и получают совершенно ублюдочные системы.

Аналогично.
Re[16]: DTO внутри BusinessObject
От: GlebZ Россия  
Дата: 31.01.07 14:27
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Гм. Позволю себе напомнить про SQL, как протокол передачи данных между клиентом и сервером.

S>Вся сила SQL — именно в том, что в него встроен автоматический вывод типов. Т.е. когда я делаю
S>
S>select FirstName, LastName from user
S>

S>я явно указываю, какие поля вернуть. Проблемы "пустое"/"непустое" просто не существует. Можно считать, что каждый запрос неявно вводит отдельный тип DTO. При вызове функции ошибиться невозможно.
Чудный пример. SQL — оперирует кортежами. Наборами типизированных данных. Можно сказать — SQL это генерация кортежей с помощью других кортежей. В некотором смысле — BE это некоторая эмуляция кортежа, но с одним, достаточно важным исключением. В BE мы можем абстрагироваться. Мы можем вызвать нужную процедуру имея только знания о типе BE и не зная внутренней структуры. И как ты указал, у нас есть часть гарантий компилятора в нахождении ошибок. Именно это важно и востребованно в сложной бизнес-логике. Во многом, именно это конфликтует с кортежами. В случае если бизнес-логика проста, то и выпендриваться не нужно. Значительно быстрее и надежнее реализовать через DataSet или другую систему кортежей. Если это сложная система над которой работает несколько человек, то Business Entity упрощает жизнь.

S>Я вижу проблему современных коммуникационных протоколов именно в их чрезмерно жесткой типизации.

+1

S>А вопрос компайл-тайм проверки решается средствами того, что и осуществляет этот компайл-тайм. Т.е. языка. См. DLinq в качестве примера. Метаданные о структуре запроса становятся известны компилятору, который может провести статическую валидацию запросов.

К сожалению, вывод типов для полноценного использования — недоделанный,

S>Имхо, это всё намного круче объектно-ориентированных транспортов, которые вынуждают к сексу с DTO на ровном месте. Если это не обладает ни identity, ни state, ни bahavior, то какого хрена мы называем это Object, пусть даже и Data Transfer?

Потому как identity, state у него есть. Behaviour — нет. Идентификация (по крайней мере у меня) происходит через идентфикатор. Иначе мы и не сможем послать его обратно. Состояние — он и есть состояние.

И вообще, есть протокол который делался именно для пересылки данных. Называется XML. Он самоописывающийся(можно просмотреть что там лежит). Он может быть полностью(xsd) или частично(anyType) типизирован. Он может трансформироваться (XQuery). Он сам по себе — набор кортежей, только не плоских как в RDBMS, а иерархических. У него только один единственный недостаток. Он плохо адаптирован в языки программирования.
Re[48]: Оффтоп о басне Крылова
От: akasoft Россия  
Дата: 31.01.07 17:31
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Да потому, что все эти семь слоев радуги оправдывают "возможностью перейти на другую СУБД с минимальными затратами". А эта возможность не нужна почти никогда. Зато желание "добавить колонку", которое возникает в среднем 20-25 раз в год, требует в 15 раз больше изменений, чем в старой доброй "однослойной" модели. Потому, что надо чинить все 7 слоев и 8 адаптеров между ними.


О! Это хорошая иллюстрация тупика в проекте Янус.

На мой взгляд, именно поддержка FireBird привела к тому, что разработчики, владеющие Access/SQL Express перестали развивать проект, потому что они не могут обеспечить преемственность с FB.

А отрубить FB — это отрубить часть пользователей, как-то работающих на нём.

Итого: лебедь, рак и щука....
... << RSDN@Home 1.2.0 alpha rev. 673>> SQL Express 2005
Re[17]: DTO внутри BusinessObject
От: Sinclair Россия https://github.com/evilguest/
Дата: 01.02.07 03:48
Оценка: 6 (1)
Здравствуйте, GlebZ, Вы писали:

GZ>Здравствуйте, Sinclair, Вы писали:

GZ>Чудный пример. SQL — оперирует кортежами. Наборами типизированных данных. Можно сказать — SQL это генерация кортежей с помощью других кортежей.
Совершенно верно. По сравнению с этим, автоматическое конструирование типов в С++ — детский лепет.
GZ>В некотором смысле — BE это некоторая эмуляция кортежа, но с одним, достаточно важным исключением. В BE мы можем абстрагироваться.
Абстрагироваться от чего?
Если в BE нет поведения, то она вообще ничем от кортежа не отличается.

GZ>Мы можем вызвать нужную процедуру имея только знания о типе BE и не зная внутренней структуры.

Ну, никакой внутренней структуры ты на самом деле не знаешь. Какие данные на какой странице, какие индексы есть, а каких нету — тебе этого не видно. Видно только, что есть user с такими-то полями.

GZ>И как ты указал, у нас есть часть гарантий компилятора в нахождении ошибок. Именно это важно и востребованно в сложной бизнес-логике. Во многом, именно это конфликтует с кортежами. В случае если бизнес-логика проста, то и выпендриваться не нужно. Значительно быстрее и надежнее реализовать через DataSet или другую систему кортежей. Если это сложная система над которой работает несколько человек, то Business Entity упрощает жизнь.

Я не против бизнес-логики. Просто как правило с клиента никакой особенной бизнес логики и нету. Выбирай себе список пользователей и всё. Сложности бизнес-логики в этом случае начинаются в предикатах. У нас например есть такой метод "вернуть всех моих пользователей" и есть "вернуть всех пользователей моих пользователей".
Это как раз то, о чем я говорил: нам приходится делать два разных метода. Захоти мы "сузить" в некоторых случаях пользовательские профили — оп-ля, методов уже четыре: GetIntermediateUsersPartial, GetIntermediateUsersFull, GetAllNestedUsersPartial, GetAllNestedUsersFull.
Ну так эта бизнес-логика запросто прячется "внутрь" почти так же, как сейчас!
Можно вообще закрыть всем, кроме админа, доступ к пользователям выше текущего.
Тогда непосредственных пользователей мы будем видеть так:
select * from MyUsers where owner=me


GZ>К сожалению, вывод типов для полноценного использования — недоделанный,

А что там недоделано?
GZ>Потому как identity, state у него есть. Behaviour — нет. Идентификация (по крайней мере у меня) происходит через идентфикатор. Иначе мы и не сможем послать его обратно. Состояние — он и есть состояние.
Ну ладно. В некоторых случаях identity у него есть. Во многих — нету. Как можно послать обратно результат group by или join ?

GZ>И вообще, есть протокол который делался именно для пересылки данных. Называется XML. Он самоописывающийся(можно просмотреть что там лежит). Он может быть полностью(xsd) или частично(anyType) типизирован. Он может трансформироваться (XQuery). Он сам по себе — набор кортежей, только не плоских как в RDBMS, а иерархических. У него только один единственный недостаток. Он плохо адаптирован в языки программирования.

Это не протокол. Это транспорт. Точно так же, как TDS. Протокол должен бы включать в себя некоторые соглашения; что-то типа языка запросов. Язык запросов SOAP (как и прочие строготипизированные штуки) мне не очень нравится. Его основное преимущество — невыносимая легкость биндинга к языкам программирования. Есть конечный набор правил, по которым мы сериализуем параметры метода и возвращаемые данные. В принципе, это всё — то же самое, что и дком/корба/RMI и т.п.
Теоретически можно было бы сделать и такую штуку: изобразить "серверную модель" в виде огромного всеобъемлючщего XML; от клиента едут XQuery-запросы, в ответ на которые приезжает соответствующее данные. Со всей гибкостью и всё такое. Я пока не уверен, что это намного лучше, чем старый добрый SQL.
1.2.0 alpha rev. 655
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[18]: DTO внутри BusinessObject
От: GlebZ Россия  
Дата: 01.02.07 08:58
Оценка:
Здравствуйте, Sinclair, Вы писали:

GZ>>Мы можем вызвать нужную процедуру имея только знания о типе BE и не зная внутренней структуры.

S>Ну, никакой внутренней структуры ты на самом деле не знаешь. Какие данные на какой странице, какие индексы есть, а каких нету — тебе этого не видно. Видно только, что есть user с такими-то полями.
В том-то и дело что не видишь что юзер. Кортеж — это набор типизированных полей. А тут нужен строгий тип.

S>Тогда непосредственных пользователей мы будем видеть так:

S>
S>select * from MyUsers where owner=me
S>

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

S>Ну ладно. В некоторых случаях identity у него есть. Во многих — нету. Как можно послать обратно результат group by или join ?

Согласен.

S>Это не протокол. Это транспорт. Точно так же, как TDS. Протокол должен бы включать в себя некоторые соглашения; что-то типа языка запросов. Язык запросов SOAP (как и прочие строготипизированные штуки) мне не очень нравится. Его основное преимущество — невыносимая легкость биндинга к языкам программирования. Есть конечный набор правил, по которым мы сериализуем параметры метода и возвращаемые данные. В принципе, это всё — то же самое, что и дком/корба/RMI и т.п.

У него есть и другое преимущество. Оно может быть самоописано. И строготипизированность сделать дозируемой(те же anyType).

S>Теоретически можно было бы сделать и такую штуку: изобразить "серверную модель" в виде огромного всеобъемлючщего XML; от клиента едут XQuery-запросы, в ответ на которые приезжает соответствующее данные. Со всей гибкостью и всё такое. Я пока не уверен, что это намного лучше, чем старый добрый SQL.

У XQuery есть огромное преимущество. Это нормальный модульный функциональный язык с поддержкой рекурсии и т.д. Использовать его можно и как самостоятельную базу данных, и как прослойку к другому источнику RDBMS. К сожалению, по сравнению с современными функц. языками он беден. Все таки это язык предназначенный прежде трансформации запросов. Вот если бы на него накатить метапрограммирование да замыкания, да голову от Федот Федотыча — конкурентов не было бы.
Может самим написать?
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re[19]: DTO внутри BusinessObject
От: Sinclair Россия https://github.com/evilguest/
Дата: 01.02.07 10:54
Оценка:
Здравствуйте, GlebZ, Вы писали:
GZ>Есть другой вид бизнес-логики: послать задание для трех человек, которые при выполнении должны отчитаться четвертому, и после получения полного отчета — четветый должен сделать полный отчет по данному заданию и отослать лицам выдавшим задание. На такую бизнес-логику — SQL не навернешь.
Ну так это же совсем-совсем другой тип бизнес логики!
Для него как раз жесткий протокол совершенно показан. Но этому протоколу нафиг не упали частичные объекты и вопросы их сериализации. Максимум, что может возвращать такой бизнес-метод — это список OperationResult.
GZ>У него есть и другое преимущество. Оно может быть самоописано. И строготипизированность сделать дозируемой(те же anyType).

GZ>Может самим написать?

1.2.0 alpha rev. 655
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re: DTO внутри BusinessObject
От: GreatDrag Украина  
Дата: 07.02.07 00:33
Оценка:
Здравствуйте, GlebZ, Вы писали:
GZ>1. За один вызов я должен вернуть/обработать объект состоящий из нескольких элементарных бизнес-объектов и снизить зависимость от латентности сети. Это наиболее частое использование DTO.
GZ>2. Скрытие некоторых не предназначенных для клиента данных. Эта тема уже поднималась на форумах. Не все данные бизнес-объектов должны быть доступны клиентам или должны быть доступны в режиме read-only. Усложняет архитектуру, и я бы не советовал использовать это без явных требований.
GZ>3. Структура используемая в сервере не может быть использована на клиенте. В основном такое встречается в statefull приложениях. Ну например, мне надо было сделать сложновычислимую задачу. Для того, чтобы вся эта шняга быстро вычислялась бизнес-объекты были связаны между собой прямыми указателями. Ессно, на клиенте бизнес-объекты должны быть связаны через идентификаторы. Это и обусловило разность типов на сервере и клиенте.
GZ>4. Кэширование. Размер полных бизнес-объектов был достаточно большой. Кэшировались только те части объекта которые наиболее часто используемы, а не полностью объект. Это сильно повысило эффективность кэша, но и обусловило построение управляемого DTO.
GZ>5. Независимость сервера. Достаточно редкая вещь. Было еще развивающееся решение когда внезапно поступило срочное требование интеграции чужого web-сервера. Решение также равивалось и по данным (то бишь по бизнес-объектам). Для того чтобы обеспечить независимость по данным был сделан слой DTO который отдавал данные в виде утвержденной сторонами XML.

Это сообщение мне показалось наиболее лаконичным объяснением мотивов использования DTO вообще. Поэтому далее от него и буду отталкиваться, в дальнейшем именуя "посылкой".

Тут было сказано много абстрактных слов, и, судя по всему, каждый остался при своем мнении. В связи чем предлагаю следующее: рассмотреть не совсем тривиальный пример, как было раньше с UserObject-UserDTO-etc, а что-то более приближенное к условиям, описанным в посылке. К примеру, пусть ситуация описывается так:
  1. Имеется иерархическая структура с единственным корнем, хранящаяся в БД
  2. В каждом узле могут быть подузлы или листовые объекты. Будем считать, что детей у узла может быть много, потому получать по одному неэффективно (обеспечиваем условие 1 посылки)
  3. С некоторыми узлами связаны наборы прав. Отдача клиенту данных, которые ему не предназначены — понятно недопустима. Для пущей простоты будем считать, что новые данные нашим клиентом не вносятся и существующие не редактируются (обеспечиваем условие 2 посылки)
  4. Условие 3 посылки мне представляется не очень критичным, но, предположим, хранение прямых указателей есть желательным элементом системы. Другими словами, желательно чтобы BE реально представляли собой иерархию, а не просто хранили список ID дочерних объектов.
  5. Листовые объекты содержат некое большое поле (к примеру Description), передавать которое по сети для всех передаваемых объектов неэффективно. То есть нужно получать его только в тот момент, когда клиенту оно реально понадобится (обеспечиваем условие 4 посылки)
  6. Условие 5 довольно редко, и представляет мало практического интереса, как показала дискуссия. Если никто не возражает — плюнем на него
Стоит задача: построить трехуровневую архитектуру, отвечающую сформулированным критериям. Возможные запросы от клиента:
Конечно, на все запросы нужно выдавать только ту информацию, которая доступна текущему пользователю
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[22]: DTO внутри BusinessObject
От: снежок Россия  
Дата: 28.02.07 18:18
Оценка:
GZ>1. За один вызов я должен вернуть/обработать объект состоящий из нескольких элементарных бизнес-объектов и снизить зависимость от латентности сети. Это наиболее частое использование DTO.
Извините пожалуйста за то что я поднимаю эту ветку, но почему то так никто и не сказал что "вернуть/обработать объект состоящий из нескольких элементарных бизнес-объектов" — это чистейшей воды UnitOfWork (который не преобразует BO, а аггрегирует их), а не DTO.
Природа же DTO ближе именно к преобразованию переносимых данных.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[23]: DTO внутри BusinessObject
От: GlebZ Россия  
Дата: 01.03.07 06:09
Оценка:
Здравствуйте, снежок, Вы писали:

GZ>>1. За один вызов я должен вернуть/обработать объект состоящий из нескольких элементарных бизнес-объектов и снизить зависимость от латентности сети. Это наиболее частое использование DTO.

С>Извините пожалуйста за то что я поднимаю эту ветку, но почему то так никто и не сказал что "вернуть/обработать объект состоящий из нескольких элементарных бизнес-объектов" — это чистейшей воды UnitOfWork (который не преобразует BO, а аггрегирует их), а не DTO.
С>Природа же DTO ближе именно к преобразованию переносимых данных.
Причем тут UnitOfWork? UnitOfWork — это средство для согласования транзакции. К данной теме вообще никакого отношения не имеет.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re[24]: DTO внутри BusinessObject
От: снежок Россия  
Дата: 01.03.07 07:02
Оценка:
GZ>Причем тут UnitOfWork? UnitOfWork — это средство для согласования транзакции. К данной теме вообще никакого отношения не имеет.
Да, правильно средство согласования, но не совсем . Если имеется несколько разнородных объектов создаваемых в рамках некоторого... пусть будет бизнес-процесса, они аггрегируются в UnitOfWork и UnitOfWork сохраняется в рамках одной системной системной транзакции.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[25]: DTO внутри BusinessObject
От: GlebZ Россия  
Дата: 01.03.07 07:52
Оценка:
Здравствуйте, снежок, Вы писали:

GZ>>Причем тут UnitOfWork? UnitOfWork — это средство для согласования транзакции. К данной теме вообще никакого отношения не имеет.

С>Да, правильно средство согласования, но не совсем . Если имеется несколько разнородных объектов создаваемых в рамках некоторого... пусть будет бизнес-процесса, они аггрегируются в UnitOfWork и UnitOfWork сохраняется в рамках одной системной системной транзакции.
UnitOfWork — кэширует объекты в течении одной системной транзакции. Но обычно, по крайней мере я, один и тот-же объект я стараюсь не заказывать несколько раз. И в данном пункте — получение разных объектов с помощью разных вызовов которые можно объединить в один вызов. Это одна из целей DTO. Непонятно причем тут Unit of Work.
... << RSDN@Home 1.2.0 alpha rev. 0>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.