Re[5]: Бизнес-слой управляет другим слоем
От: kov_serg Россия  
Дата: 23.05.19 13:16
Оценка:
Здравствуйте, es3000, Вы писали:

E>А если используется асинхронное взаимодействие верхнего и нижнего уровней?

E>Верхний уровень отправил сообщение.
E>Как верхний уровень потом получит ответ от нижнего уровня?
Через очередь сообщений. Поставил в очередь задание, через некоторое время проверил статус, приспичило отменил задание.
Re[9]: Бизнес-слой управляет другим слоем
От: samius Япония http://sams-tricks.blogspot.com
Дата: 23.05.19 13:18
Оценка:
Здравствуйте, es3000, Вы писали:

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

S>>Да, у Мартина так. Но есть примеры других архитектур, где не так.
S>>https://www.oreilly.com/library/view/software-architecture-patterns/9781491971437/ch01.html
S>>https://en.wikipedia.org/wiki/Multitier_architecture#Common_layers

E>Суть та же самая: сделать код одного слоя независимым от других слоев.

E>Причем это даже не архитектура, а общие формулировки.
Верно. Сначала делали независимыми функции, потом объекты, далее слои. Идея та же, масштаб растет. Но нового ничего.

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


S>>У Мартина, но не вообще.


E>Просто подход Мартина — внес новую идею в разделение слоев.

Спрятать БЛ за репозиторием и нарисовать во внешнем слое на диаграмме?
E>За счет этого это разделение слоев стало еще лучше.
Можно конкретнее?

E>Ну это как постепенное развитие например бензиновых двигателей.

E>Ясное дело, что современные двигатели во много превосходят двигатели 50-летней давности.
E>Так и подход к разделению слоев.
E>Подход Мартина — более конкретен чем предыдущие общие формулировки.
Более конкретен чем?
Если БЛ у нас управляет тем, какие Entity ему нужны, какая разница, где мы нарисовали DAL, во внешнем слое, или во внутреннем? Линейно расположили слои, или луковицей?
Re: Бизнес-слой управляет другим слоем
От: Vladek Россия Github
Дата: 23.05.19 18:23
Оценка:
Здравствуйте, es3000, Вы писали:

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


Через абстракции — добавить интерфейс, который внешний слой должен реализовывать. Или же генерировать события, на которые внешний слой подпишется.
Re[10]: Бизнес-слой управляет другим слоем
От: es3000  
Дата: 24.05.19 11:27
Оценка:
S>Аргументация на что? Ты послал меня книжки полистать и найти там тезисы. Им оппонировать?

Нет, не книжкам оппонировать.
А аргументировать свои тезисы.

Мы сильно в "философию" углубились.

Предлагаю "откатиться назад" и вспомнить первые вопросы:

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


Еще раз, скажи пожалуйста, свои тезисы в ответ на эти вопросы.

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

Например, Слой приложения (вышестоящий) использует Бизнес-слой.
Слой приложения отправляет команды Бизнес-слою через интерфейс, а в ответ получает какие-то события.
Надо, чтобы Бизнес-слой как-то повлиял на логику Слоя приложения.
Re[6]: Бизнес-слой управляет другим слоем
От: es3000  
Дата: 24.05.19 11:57
Оценка:
E>>А если используется асинхронное взаимодействие верхнего и нижнего уровней?
E>>Верхний уровень отправил сообщение.
E>>Как верхний уровень потом получит ответ от нижнего уровня?
_>Через очередь сообщений. Поставил в очередь задание, через некоторое время проверил статус, приспичило отменил задание.

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

А можно ведь сделать, что все друг с другом будут общаются через очередь сообщений.
Полная независимость. Красота.
Отредактировано 24.05.2019 11:59 es3000 . Предыдущая версия .
Re[10]: Бизнес-слой управляет другим слоем
От: es3000  
Дата: 24.05.19 12:05
Оценка:
E>>Просто подход Мартина — внес новую идею в разделение слоев.
S>Спрятать БЛ за репозиторием и нарисовать во внешнем слое на диаграмме?

Да.

E>>За счет этого это разделение слоев стало еще лучше.

S>Можно конкретнее?

Ну раньше ломали голову: как отделить БЛ от хранения данных.
А теперь Мартин предложил удобное решение.

E>>Подход Мартина — более конкретен чем предыдущие общие формулировки.

S>Более конкретен чем?

Тем, что предложил удобное архитектурное решение.

S>Если БЛ у нас управляет тем, какие Entity ему нужны, какая разница, где мы нарисовали DAL, во внешнем слое, или во внутреннем? Линейно расположили слои, или луковицей?


Не знаю какая разница. Может быть и никакой.
А что ты сказать-то хочешь?
А то всё задаешь вопросы. Ты мысль свою вырази.
Re[2]: Бизнес-слой управляет другим слоем
От: es3000  
Дата: 24.05.19 12:10
Оценка:
E>>Как сделать внешний слой, о котором по сути Бизнес-логика ничего не знает, управляемым?

V>Через абстракции — добавить интерфейс, который внешний слой должен реализовывать. Или же генерировать события, на которые внешний слой подпишется.


Тогда получается, что оба слоя и внешний и внутренний ничем друг от друга не отличаются:
— и внутренний слой предоставляет свои интерфейсы для управления им извне
— и внешний слой предоставляет свои интерфейсы для управления им извне.
— оба слоя вызывают подписчики событий в ответ

Тут уже и нельзя сказать: какой из них внутренний, а какой внешний.
Они оба получились на одном уровне.

Разве можно так делать?
Re[11]: Бизнес-слой управляет другим слоем
От: samius Япония http://sams-tricks.blogspot.com
Дата: 24.05.19 14:50
Оценка: +1
Здравствуйте, es3000, Вы писали:

E>Предлагаю "откатиться назад" и вспомнить первые вопросы:

E>

E>Бывает ли такое, что бизнес-слой должен управлять поведением (логикой) другого слоя приложения?
E>Если ответ положительный и так делается, то как реализуется такое управление?
E>Как сделать внешний слой, о котором по сути Бизнес-логика ничего не знает, управляемым?


E>Еще раз, скажи пожалуйста, свои тезисы в ответ на эти вопросы.


1. Да, бывает. Вообще обычно бизнес-слой всем и управляет. Пример: пришла почта, нужно показать уведомление в UI. Кто инициатор? Логично что бизнес-слой.
2. Что как? В чем проблема заключается? Я не понимаю, на что отвечать. События, интерфейсы, что по сути одно и то же. События — интерфейсы для бедных. Интерфейсы — события для бедных.
3. См. 2.

E>Только я уточню, что речь идет не о нижележащих слоях, которыми управляют через их интерфейсы.

E>А речь идет об управлении вышестоящим слоем, который как бы неизвестен.
Аналогично.
E>Насколько я понимаю, единственный способ общения нижестоящего слоя с вышестоящим — это через механизм событий-подписок.
Что значит, единственный? БЛ может выставлять флаг/команду, а UI его проверять в каждом оконном сообщении. Суть-то не меняется.

E>Например, Слой приложения (вышестоящий) использует Бизнес-слой.

E>Слой приложения отправляет команды Бизнес-слою через интерфейс, а в ответ получает какие-то события.
E>Надо, чтобы Бизнес-слой как-то повлиял на логику Слоя приложения.
Бизнес-слой тоже может отправлять команды.
Re[11]: Бизнес-слой управляет другим слоем
От: samius Япония http://sams-tricks.blogspot.com
Дата: 24.05.19 15:02
Оценка: +1
Здравствуйте, es3000, Вы писали:

E>>>Просто подход Мартина — внес новую идею в разделение слоев.

S>>Спрятать БЛ за репозиторием и нарисовать во внешнем слое на диаграмме?

E>Да.

Это не нововведение Мартина

E>>>За счет этого это разделение слоев стало еще лучше.

S>>Можно конкретнее?

E>Ну раньше ломали голову: как отделить БЛ от хранения данных.

E>А теперь Мартин предложил удобное решение.
Барьеры абстракций известны много лет (десятков лет). Их использовали даже в LISP. Кому надо было что-то отделить, отделяли.
Чего там ломать голову? Над чем?

E>>>Подход Мартина — более конкретен чем предыдущие общие формулировки.

S>>Более конкретен чем?

E>Тем, что предложил удобное архитектурное решение.

Мне удобнее отделять в тот момент, когда это стало нужно. В каком месте на диаграмме слоев что нарисовано — дело десятое.

S>>Если БЛ у нас управляет тем, какие Entity ему нужны, какая разница, где мы нарисовали DAL, во внешнем слое, или во внутреннем? Линейно расположили слои, или луковицей?


E>Не знаю какая разница. Может быть и никакой.

E>А что ты сказать-то хочешь?
E>А то всё задаешь вопросы. Ты мысль свою вырази.

Я пытаюсь выяснить, чем лучше архитектура, предложенная Мартином? Но конкретно, а не просто "удобнее". Удобнее чем что? Удобнее чем? Для какого типа приложений?
Re[12]: Бизнес-слой управляет другим слоем
От: es3000  
Дата: 25.05.19 18:15
Оценка:
S>1. Да, бывает. Вообще обычно бизнес-слой всем и управляет. Пример: пришла почта, нужно показать уведомление в UI. Кто инициатор? Логично что бизнес-слой.

А если подробнее — какой "сценарий"?
Что бизнес-слой передает в UI?
Просто сообщение "пришла почта"? Или команду "покажи уведомление"?

S>События, интерфейсы, что по сути одно и то же. События — интерфейсы для бедных. Интерфейсы — события для бедных.


А что есть для "богатых"?

S>Бизнес-слой тоже может отправлять команды.


Если два слоя отправляют друг другу команды, тогда они оба связаны друг с другом.
Они оба "равноправные", нету ни "вышестоящего" ни "нижележащего".
Re[13]: Бизнес-слой управляет другим слоем
От: samius Япония http://sams-tricks.blogspot.com
Дата: 25.05.19 18:50
Оценка:
Здравствуйте, es3000, Вы писали:


S>>1. Да, бывает. Вообще обычно бизнес-слой всем и управляет. Пример: пришла почта, нужно показать уведомление в UI. Кто инициатор? Логично что бизнес-слой.


E>А если подробнее — какой "сценарий"?

E>Что бизнес-слой передает в UI?
E>Просто сообщение "пришла почта"? Или команду "покажи уведомление"?
Я пример просто выдумал. Что бы ответить на эти вопросы, мне придется выдумать ответы. Но есть ли в этом какой-то смысл? Принципиальна ли разница между сообщением и командой?

S>>События, интерфейсы, что по сути одно и то же. События — интерфейсы для бедных. Интерфейсы — события для бедных.


E>А что есть для "богатых"?

Теория категорий и монады

S>>Бизнес-слой тоже может отправлять команды.


E>Если два слоя отправляют друг другу команды, тогда они оба связаны друг с другом.

E>Они оба "равноправные", нету ни "вышестоящего" ни "нижележащего".
А если они отправляют команды не друг другу, а на деревню дедушке?
Re[12]: Бизнес-слой управляет другим слоем
От: es3000  
Дата: 25.05.19 19:29
Оценка:
S>Это не нововведение Мартина

S>Барьеры абстракций известны много лет (десятков лет). Их использовали даже в LISP. Кому надо было что-то отделить, отделяли.


S>Мне удобнее отделять в тот момент, когда это стало нужно.


Ну вот как раз мне стало "нужно" отделять.
Поэтому я и задал вопрос.
Нужно разделить два слоя: Бизнес-слой внутренний, его использует внешний слой.
Я их разделил.
И теперь стало "нужно", чтобы внутренний слой повлиял на поведение внешнего.

S>В каком месте на диаграмме слоев что нарисовано — дело десятое.


В принципе я согласен.
Но что ты предлагаешь то?
Делать как попало? Не придерживаясь никаких принципов?

S>Я пытаюсь выяснить, чем лучше архитектура, предложенная Мартином? Но конкретно, а не просто "удобнее". Удобнее чем что? Удобнее чем? Для какого типа приложений?


А зачем это выяснять?
Ты все время пытаешься разговор куда-то в сторону увести.
Ну какая разница какая архитектура лучше или хуже?
Я уверен, что ты и сам понимаешь почему и зачем придуманы архитектуры.
Отредактировано 25.05.2019 19:30 es3000 . Предыдущая версия .
Re[14]: Бизнес-слой управляет другим слоем
От: es3000  
Дата: 25.05.19 20:02
Оценка:
E>>А если подробнее — какой "сценарий"?
E>>Что бизнес-слой передает в UI?
E>>Просто сообщение "пришла почта"? Или команду "покажи уведомление"?
S>Я пример просто выдумал. Что бы ответить на эти вопросы, мне придется выдумать ответы. Но есть ли в этом какой-то смысл?

Я думаю, что смысл есть.
А то странно получается: какие-то философские вопросы мы обсуждаем, а как только дело дошло до конкретного решения — "нет смысла"?
Как будто ты избегаешь предложить конкретное решение.

S>Принципиальна ли разница между сообщением и командой?


По моему мнению, с технической точки зрения — разницы нету.
А вот с точки зрения назначения — есть.

А твое мнение? И как эта разница влияет на решение?

E>>А что есть для "богатых"?

S>Теория категорий и монады

Когда-то пытался читать теорию категорий. Не понял ее практической применимости в программировании.
Про монады не слышал, сейчас почитаю.
Как теория категорий и монады могут помочь в озвученном вопросе?

E>>Если два слоя отправляют друг другу команды, тогда они оба связаны друг с другом.

E>>Они оба "равноправные", нету ни "вышестоящего" ни "нижележащего".
S>А если они отправляют команды не друг другу, а на деревню дедушке?

Опять одни вопросы. Ты кому вопросы задаешь? Тоже наверно на деревню дедушке?
Что сказать то хочешь? Ты как будто стесняешься.
Говори прямо — не стесняйся.
Мне любое мнение интересно.
Re[13]: Бизнес-слой управляет другим слоем
От: samius Япония http://sams-tricks.blogspot.com
Дата: 25.05.19 20:23
Оценка: +1
Здравствуйте, es3000, Вы писали:

E>Ну вот как раз мне стало "нужно" отделять.

E>Поэтому я и задал вопрос.
E>Нужно разделить два слоя: Бизнес-слой внутренний, его использует внешний слой.
E>Я их разделил.
E>И теперь стало "нужно", чтобы внутренний слой повлиял на поведение внешнего.
О, как... (1)

S>>В каком месте на диаграмме слоев что нарисовано — дело десятое.


E>В принципе я согласен.

E>Но что ты предлагаешь то?
E>Делать как попало? Не придерживаясь никаких принципов?
До этого момента было обсуждение вопроса о том, "бывает ли такое". Никаких предложений не требовалось до сообщения, на которое я отвечаю. Я даже и подумать не мог, что мне нужно что-то предложить.
А теперь мне не хватает данных, что бы что-то предлагать. Даже не считаю что тезиса (1) достаточно для качественных предложений.

S>>Я пытаюсь выяснить, чем лучше архитектура, предложенная Мартином? Но конкретно, а не просто "удобнее". Удобнее чем что? Удобнее чем? Для какого типа приложений?


E>А зачем это выяснять?

E>Ты все время пытаешься разговор куда-то в сторону увести.
— Она лучше
— Чем лучше?
— Ты все время пытаешься разговор увести

Ну ладно.

E>Ну какая разница какая архитектура лучше или хуже?

Если разницы нет, бери архитектуру God Project (по аналогии с God Object) и не парься над слоями.

E>Я уверен, что ты и сам понимаешь почему и зачем придуманы архитектуры.

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

Если считаешь мои наводящие вопросы неконструктивными, то я найду куда пойти и чем заняться.
Re[15]: Бизнес-слой управляет другим слоем
От: samius Япония http://sams-tricks.blogspot.com
Дата: 26.05.19 03:08
Оценка:
Здравствуйте, es3000, Вы писали:

S>>Я пример просто выдумал. Что бы ответить на эти вопросы, мне придется выдумать ответы. Но есть ли в этом какой-то смысл?


E>Я думаю, что смысл есть.

E>А то странно получается: какие-то философские вопросы мы обсуждаем, а как только дело дошло до конкретного решения — "нет смысла"?
E>Как будто ты избегаешь предложить конкретное решение.
Конкретное решение чего именно? Отправки сообщения?

S>>Принципиальна ли разница между сообщением и командой?


E>По моему мнению, с технической точки зрения — разницы нету.

E>А вот с точки зрения назначения — есть.

E>А твое мнение? И как эта разница влияет на решение?


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

E>>>А что есть для "богатых"?

S>>Теория категорий и монады

E>Когда-то пытался читать теорию категорий. Не понял ее практической применимости в программировании.

E>Про монады не слышал, сейчас почитаю.
E>Как теория категорий и монады могут помочь в озвученном вопросе?
Они позволяют представить источник событий монадой и связать их bind-ом с нужным кодом.

E>>>Если два слоя отправляют друг другу команды, тогда они оба связаны друг с другом.

E>>>Они оба "равноправные", нету ни "вышестоящего" ни "нижележащего".
S>>А если они отправляют команды не друг другу, а на деревню дедушке?

E>Опять одни вопросы. Ты кому вопросы задаешь? Тоже наверно на деревню дедушке?

E>Что сказать то хочешь? Ты как будто стесняешься.
E>Говори прямо — не стесняйся.
E>Мне любое мнение интересно.
Хорошо, вот мой наводящий вопрос в форме утверждения:
Если слои отправляют команды не друг другу, а кому-то еще, то тогда они не будут связаны друг с другом.
Re[14]: Бизнес-слой управляет другим слоем
От: es3000  
Дата: 26.05.19 09:44
Оценка:
E>>Я уверен, что ты и сам понимаешь почему и зачем придуманы архитектуры.
S>Затем, что бы удовлетворять требованиям. Техническим, и не только. И мне представляется нелепым обсуждать то, чем такое расположение слоев лучше чем другое в контексте неопределенных требований.
S>Собственно, я и пытаюсь склонить обсуждение к перечислению факторов, в рамках которых принято что одна архитектура лучше другой и слои должны взаимодействовать именно таким образом.

Ну так бы прямо и сказал: перечисли факторы такие-то и такие-то.
А то как-то не понятно что и к чему.

S>Если считаешь мои наводящие вопросы неконструктивными, то я найду куда пойти и чем заняться.


Я всегда "ЗА" общение, которое помогает решить проблему.
Только, пожалуйста, выражайся яснее.

S>До этого момента было обсуждение вопроса о том, "бывает ли такое". Никаких предложений не требовалось до сообщения, на которое я отвечаю. Я даже и подумать не мог, что мне нужно что-то предложить.


Ну как же...
Вот я прямо в первом сообщении написал (помимо "бывает ли такое"):
"Если ... так делается, то как реализуется такое управление?
Как сделать внешний слой, о котором по сути Бизнес-логика ничего не знает, управляемым?"


S>А теперь мне не хватает данных, что бы что-то предлагать. Даже не считаю что тезиса (1) достаточно для качественных предложений.


Попробую объяснить подробнее.
Есть сложный бизнес-сценарий, который читает из БД данные, преобразует их, записывает в преобразованном виде во внешний файл, сохраняет в БД новые сформированные данные.
В этом сценарии много ответвлений, условий и "развилок", которые зависят от конкретного состояния данных, от результата выполнения действий с БД и файловой системой.
При возникновении этих развилок нужны дополнительные данные, которые надо запросить у пользователя.
И выполнение сценария продолжается в зависимости от ответа пользователя.

Каким образом запросить данные у пользователя так, чтобы не зависеть от слоя UI?
Ведь слой Бизнес-логики не должен зависеть от UI.

Очень упрощенный пример.
Мы в редакторе сохраняем файл, указываем имя.
Бизнес-логика при попытке сохранения файла обнаруживает, что такой файл уже существует.
Дальше она задает вопрос пользователю: "Что дальше делать?". Обычно предлагаются следующие варианты "Заменить, Сохранить под другим именем, Отменить".
Однако, таких вариантов может быть больше и они определяются возможностями бизнес-слоя.
Например, более "продвинутый" бизнес-слой мог бы предложить такие дополнительные варианты действий: "Дописать в существующий файл", "Сохранить под указанным именем переименовав существующий файл" и т. д.

S>>>Я пытаюсь выяснить, чем лучше архитектура, предложенная Мартином? Но конкретно, а не просто "удобнее". Удобнее чем что? Удобнее чем? Для какого типа приложений?


E>>Ну какая разница какая архитектура лучше или хуже?

S>Если разницы нет, бери архитектуру God Project (по аналогии с God Object) и не парься над слоями.

Ты сам прекрасно понимаешь, почему так не следует делать.
Следуя твоему примеру, покажу как выглядит наш диалог с моей точки зрения:
— Я: "Как разделить слои"
— Ты: "Надо делить для конкретной цели"
— Я: "Цель такая-то. Как делить?"
— Ты: "Можешь не делить"
— Я: "Но лучше разделить. Как правильно разделить?"
— Ты: "А зачем делить?"
— Я: "За тем-то и затем-то"
— Ты: "Не обязательно делить"
Отредактировано 26.05.2019 9:46 es3000 . Предыдущая версия .
Re[16]: Бизнес-слой управляет другим слоем
От: es3000  
Дата: 26.05.19 10:05
Оценка:
S>Конкретное решение чего именно? Отправки сообщения?

Напоминаю:
>> Вообще обычно бизнес-слой всем и управляет. Пример: пришла почта, нужно показать уведомление в UI. Кто инициатор? Логично что бизнес-слой.

Решение отображения уведомления в UI при поступлении почты.
Мне интересно как это правильно сделать по твоему мнению.
Какие действия при этом выполняются и какими объектами\слоями?
Re[16]: Бизнес-слой управляет другим слоем
От: es3000  
Дата: 26.05.19 10:10
Оценка:
E>>Просто сообщение "пришла почта"? Или команду "покажи уведомление"?
S>Принципиальна ли разница между сообщением и командой?

E>>По моему мнению, с технической точки зрения — разницы нету.

E>>А вот с точки зрения назначения — есть.

E>>А твое мнение? И как эта разница влияет на решение?


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


И все-таки разница есть.
В случае сообщения, отправитель не ждет никакого ответа, его логика и дальнейшее поведение продолжается по прямолинейному алгоритму.
А в случае команды, важен результат ее обработки, поэтому логика отправителя зависит от ответа и далее разветвляется.
Re[16]: Бизнес-слой управляет другим слоем
От: es3000  
Дата: 26.05.19 10:12
Оценка:
E>>Как теория категорий и монады могут помочь в озвученном вопросе?
S>Они позволяют представить источник событий монадой и связать их bind-ом с нужным кодом.

Можно пояснить на примере для ООП?
Re[16]: Бизнес-слой управляет другим слоем
От: es3000  
Дата: 26.05.19 10:13
Оценка:
S>Хорошо, вот мой наводящий вопрос в форме утверждения:
S>Если слои отправляют команды не друг другу, а кому-то еще, то тогда они не будут связаны друг с другом.

Ты имеешь ввиду что-то типа шаблона "Медиатор"?
Про него выше говорили.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.