Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

MVVM. Так где таки разместим business logic?

2395  1 2 3 все
  max2_2000 знакомое лицо28.01.22 21:42
NEW 28.01.22 21:42 

здесь, например, утверждается:


ViewModel: ViewModel is the middle layer between the view and model. ViewModel contains the business logic, which manipulates the row data to show in the view. Any kind of function and methods should be in the view model.

а здесь - совсем другое:


the view model, which encapsulates presentation logic and state; and the model, which encapsulates the app's business logic and data.

кто какое утверждение находит правильным (я - второе, если интересно), и почему?

#1 
Срыв покровов патриот29.01.22 00:00
29.01.22 00:00 
в ответ max2_2000 28.01.22 21:42

мое понимание следующее:

Логика поведения во фронте должна быть в VM

Но там не может быть логики самого приложения.

#2 
alex445 коренной житель29.01.22 01:46
NEW 29.01.22 01:46 
в ответ max2_2000 28.01.22 21:42, Последний раз изменено 29.01.22 01:48 (alex445)

Каждый по-своему понимает. И где должна быть бизнес логика, и что такое бизнес логика.


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


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

#3 
AlexNek патриот29.01.22 12:03
AlexNek
NEW 29.01.22 12:03 
в ответ max2_2000 28.01.22 21:42

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

Но в принципе у нас есть:

- Model в которой "располагаются" данные и которыми мы можем обмениваться и сохранять. Значит там нем места для чего-то другого.

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

- ViewModel, связка между данными и отображением, как в одну сторону, так и в другую. Здесь тоже нет места для чего-то другого.

Приходим к тому, что для логики нужны свои собственные объекты, которые могут взаимодействовать и с Model и с ViewModel


#4 
Программист коренной житель29.01.22 12:22
NEW 29.01.22 12:22 
в ответ max2_2000 28.01.22 21:42

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


ViewModel: ViewModel is the middle layer between the view and model. ViewModel contains the business logic, which manipulates the row data to show in the view. Any kind of function and methods should be in the view model.


the view model, which encapsulates presentation logic and state; and the model, which encapsulates the app's business logic and data.

Вывод: кури учебник английского.

#5 
  max2_2000 знакомое лицо29.01.22 12:26
NEW 29.01.22 12:26 
в ответ Срыв покровов 29.01.22 00:00
мое понимание следующее:
Логика поведения во фронте должна быть в VM
Но там не может быть логики самого приложения.

мы не говорим о фронте/бэке. у нас имеется просто ПРИЛОЖЕНИЕ, задизайненное под mvvm pattern. т.е. наше приложение условно разделено на view, viewmodel и model.

под бизнес логикой будем понимать ... эээ... бизнес логику. хотел отослать к википедии, но мне их описание не нравится. там речь идет о real world и т.д. я бы определил бизнес логику как совокупность объектов, задействовованных в выполнении собственно задач приложения. неказисто получилось, можно еще подумать-подкрасить, но не сейчас. в общем, если мы программируем игру "полет на альфа центавра" в компании, похожей на ту, что у капитана кирка (или как его), то для меня это - не real world. но части приложения, которые будут решать, что делать, если в GUI клацнули мышкой на какую-то стрелячку, и попадет ли снаряд в приближающийся метеорит - это и есть для меня бизнес логика.

и я стараюсь выделить ее в "отдельный кусок", со своим интерфейсом, который может работать вообще без GUI (а с каким-нибудь тестером, его симулирующим. или как когда-то "вы можете пойти в калах". там же и в капитана кирка играли. лучи смерти и пр.). и бизнес логика в идеале вообще не должна знать, существует ли какое-то GUI.

и тут читаешь утверждение, что все это нужно поместить во viewmodel! в принципе, можно выполнение этой задачи вообще так размазать по приложению, что части бизнес логики можно будет обнаружить везде. и даже допускаю, что местами так будет казаться удобным: клацнули мышкой - и тут же из code behind запустили ракету. никаких тебе сообщений, вызовов, команд и прочей дребедени, вовлекающей в такое простое действие "лишних" участников.


#6 
  max2_2000 знакомое лицо29.01.22 12:28
NEW 29.01.22 12:28 
в ответ alex445 29.01.22 01:46
Айти страдает от засилья теоретизирующих чудаков, множащих сущности без причины. Домен, модель, бизнес - всё суть одно и тоже.

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


#7 
  max2_2000 знакомое лицо29.01.22 12:30
NEW 29.01.22 12:30 
в ответ AlexNek 29.01.22 12:03
Приходим к тому, что для логики нужны свои собственные объекты, которые могут взаимодействовать и с Model и с ViewModel

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

#8 
AlexNek патриот29.01.22 12:47
AlexNek
NEW 29.01.22 12:47 
в ответ max2_2000 29.01.22 12:30
я ставлю мою подпись

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

Да и от конкретной задачи еще зависит.

#9 
  max2_2000 знакомое лицо29.01.22 14:48
NEW 29.01.22 14:48 
в ответ AlexNek 29.01.22 12:47
, но всё равно ожидается большая дискуссия.

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


#10 
alex445 коренной житель29.01.22 19:26
NEW 29.01.22 19:26 
в ответ max2_2000 29.01.22 12:26, Последний раз изменено 29.01.22 19:44 (alex445)
мы не говорим о фронте/бэке. у нас имеется просто ПРИЛОЖЕНИЕ, задизайненное под mvvm pattern. т.е. наше приложение условно разделено на view, viewmodel и model.

Классическое описание MVVM есть букварь для новичков, мало или вообще не знакомых с многослойными, распределёнными приложениями. С одной стороны, этого достаточно, чтобы сосредоточиться на описании именно этого паттерна проектирования. С другой, многим это сужает кругозор. Лучше думать об архитектуре приложения как о совокупности разных слоёв или систем (распределённое приложение), при этом не обязательно строго иерархически связанных и не обязательно с одними, жёстко заданными направлениями потоков данных. И всякие паттерны проектирования лишь частные случаи конфигураций этих слоёв. В сложном приложении нельзя точно сказать, какой паттерн в нём применён - всего понемногу и не обязательно в целом виде. Когда разрабатываешь сложное приложение, лучше не думать навязанными понятиями, типа "модель", "вью модель", а думать более универсальными, типа "обработка данных домена", "конвертация данных". Как это назвать конкретно - модель или вью модель - дело десятое.


Вот цитата от автора букваря

"The viewmodel of MVVM is a value converter"

Согласен. Некоторые пытаются в том же WPF во вьюшные Value Converters поместить много логики, тогда как вся конвертация должна быть на самом деле во VM.

#11 
alex445 коренной житель29.01.22 19:30
NEW 29.01.22 19:30 
в ответ AlexNek 29.01.22 12:47, Последний раз изменено 29.01.22 19:31 (alex445)
Приятно осознавать, что ты не один в пустыне

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

#12 
alex445 коренной житель29.01.22 19:37
NEW 29.01.22 19:37 
в ответ alex445 29.01.22 19:26

Вообще, странно, что приходят люди после всяких микросервисов, и не вдупляют в VMMV (или MVMV? - модель, вью модель, вью - такой порядок правильнее?). По идее, им это должно сходу залетать, а они чего-то в трёх соснах блуждают.

#13 
  max2_2000 знакомое лицо29.01.22 20:25
NEW 29.01.22 20:25 
в ответ alex445 29.01.22 19:26
многослойными, распределёнными приложениями.

это - из разных систем координат. как сравнивать зеленое со сладким.


#14 
  max2_2000 знакомое лицо29.01.22 20:27
NEW 29.01.22 20:27 
в ответ alex445 29.01.22 19:26
Когда разрабатываешь сложное приложение

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


#15 
alex445 коренной житель29.01.22 21:45
NEW 29.01.22 21:45 
в ответ max2_2000 29.01.22 20:27
когда последний раз приходилось этим заниматься? для кого? опишите вкратце приложение, чтобы можно было оценить его сложность.

"Сложное" я имел ввиду, состоящее более, чем из трёх слоёв (модель, вью модель и вью).

#16 
  max2_2000 знакомое лицо29.01.22 23:02
NEW 29.01.22 23:02 
в ответ alex445 29.01.22 21:45
"Сложное" я имел ввиду, состоящее более, чем из трёх слоёв (модель, вью модель и вью).

hello, hello, hello world! ?


#17 
alex445 коренной житель30.01.22 01:58
NEW 30.01.22 01:58 
в ответ alex445 29.01.22 19:26

Я только ещё могу добавить, что в этом MVVM, который МС изобрела для WPF, есть особенность - тесная связь вью модели и вью. Связь в смысле особенностей проектирования вью модели - там классы вью специально заточены, чтобы во вью модели были реализации определённых интерфейсов. Такой связи и требований между моделью и вью моделью нет.

#18 
spsp посетитель30.01.22 17:50
NEW 30.01.22 17:50 
в ответ max2_2000 28.01.22 21:42

я придерживаюсь таких правил:
- View это сам XAML (в нём только Binding c ViewModel)
- ViewModel желательно ничего не знает о View (или знает как можно меньше)
- Model категорически ничего не знает ни о View, ни о ViewModel (только подозревает о них, потому предоставляет события)


Если программа не слишком примитивна в юзер интерфейсе, и не ограничена для юзера окошками, а является типа графического редактора, т.е. содержит манипуляции с мышью, типа изменений размеров объектов, перетаскиванием их, поворачиванием под углом и подобное, тогда я еще делаю абстрактный класс Controller.
Тогда View всё что делает в своих событиях (обычно мыши) - только вызывает одноименные функции Контроллера.
А вот конкретный Контроллер (не абстрактный) создаётся для каждой операции отдельно и удаляется по ее завершении.
Смысл имеет делать Контроллер только для тех операций которые связаны с более чем одним событием от View.
#19 
alex445 коренной житель30.01.22 18:28
NEW 30.01.22 18:28 
в ответ spsp 30.01.22 17:50, Последний раз изменено 30.01.22 18:30 (alex445)
- ViewModel желательно ничего не знает о View (или знает как можно меньше)

ВМ и В в WPF связаны довольно тесно. Гораздо теснее, чем ВМ и М. Теоретически, одну ВМ можно привязать к разным В, но на практике обычно для каждой В своя ВМ. Одновременно, для одной М на практике обычно несколько ВМ испольуется и соответствующих им В.


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


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

#20 
1 2 3 все