سلام دوستان

در مقاله ای تحت عنوان "Model-View-ViewModel (MVVM)" در سایت مایکروسافت ، در بخشی اش نوشته :

Model-View-ViewModel - .NET | Microsoft Learn


"If an existing model implementation encapsulates existing business logic, it can be difficult or risky to change it. In this scenario, the view model acts as an adapter for the model classes and prevents you from making major changes to the model code."


که معنا و مفهومش این هست که اگر پیاده‌سازی (برای لایه ی) Model موجود ، منطق تجاری موجود را در بر بگیرد و encapsolate کند (یعنی لایه ی model ، شامل منطق تجاری شود)، تغییر آن می‌تواند دشوار یا خطرناک باشد.
در این سناریو، ViewModel به عنوان یک آداپتور (ماینجی گر) برای کلاس های Model عمل می کند و از ایجاد تغییرات عمده در کد Model تان جلوگیری می کند.


در کل من این طور از این جمله متوجه شدم کردم که نباید منطق تجاری را در لایه ی Model ایجاد کرد .


اما همین مقاله در بخش Model ، این طور میگوید :


"Model classes are non-visual classes that encapsulate the app's data. Therefore, the model can be thought of as representing the app's domain model, which usually includes a data model along with business and validation logic. Examples of model objects include data transfer objects (DTOs), Plain Old CLR Objects (POCOs), and generated entity and proxy objects."


که معنا و مفهومش این هست که کلاس‌های Model ، کلاس‌های بدون Visual هستند (یعنی از کلاس Visual و کلا کلاس کنترل ها و کنترل های بصری ارث بری نمیکنند) که داده‌های برنامه را محصور می‌کنند و encapsolate میکند. بنابراین، Model را می توان به عنوان نمایانگر مدل دامنه برنامه در نظر گرفت که معمولاً شامل یک مدل داده همراه با منطق تجاری و منطق اعتبار سنجی است. مثال هایی از اشیاء مدل عبارتند از: اشیاء انتقال داده (DTO)، اشیاء ساده قدیمی CLR (POCO)، و اشیاء موجودیت و پروکسی تولید شده.


خوب ، این دو پاراگراف در این مقاله ، کاملا برعکس همدیگر هستند .
بنابراین اگر اشتباه نکنم ، در یک پاراگراف ، گفت که در لایه ی Model ، منطق تجاری مان را ننویسم چون از بکار بردن تغییرات عمده جلوگیری میکند اما در پاراگراف دیگر گفت که لایه ی Model ، معمولا شامل منطق تجاری هم میشود!!

===========================


آخر داستان چی شد؟
چرا این دو پاراگراف در سایت مایکروسافت ، ضد هم هستند؟!
منطق تجاری در معماری MVVM آخر در کدام لایه باید تعریف شود؟
توجه داشته باشید که در این دو پاراگراف ، از منطق ui حرفی نزد (بلکه صراحتا منطق تجاری را گفتند) . منطق ui معمولا وظیفه ی لایه ی ViewModel هست .

اما در سایت زیر ، گفته که تعریف منطق تجاری ، وظیفه ی لایه ی Model هست :

Learning About MVVM Architecture Android | DataTrained | Data Trained Blogs

"The Model represents the data and business logic, the View displays the UI, and the ViewModel acts as a bridge between the two. "

تشکر