الگو های معماری mvc - mvvm - mvp

سلام . دوستان من یه مشکل دارم دقیقا نمیتونم متوجه بشم تفاوت mvp - mvc - mvvm چی هست و کدومشون بهتر هستن برای چه پروژه هایی . اگه لطف کنید یه توضیح کوتاه برای من بدین ممنون میشم .

mvc رو مثل یه فروشگاه بزرگ در نظر بگیر که در اون مدل میشه انبار جنس تو ، ویو میشه ویترینی که مشتری داره بهش نگاه میکنه ، کنترلر هم میشه صاحب مغازه و شاگردش که دائم بین انبار و ویترین و مشتری در حال حرکتند و از انبار یا همون مدل به ویو یا همین مشتری و ویترین جنس میبرن میارن و کارهای منطقی مثل حساب کتاب و … رو کنترلر انجام میده
اما در مورد mvp وب سایت های ایرانی زیادی بخصوص در مورد اندروید براش مطلب نوشتن یه جستجوی ساده بکنی میفهمی ، تنها چیزی ام که خود من از این معماری نفهمیدم این بود که تو خود mvc هم قرار نیست مدل با ویو در ارتباط باشه اما در این معماری باید کلا ارتباط قطع بشه این لینک رو بخون http://smartlab.ir/آموزش-اندروید-معماری-mvp-اندروید/
این لینک رو هم بخون https://javabyab.com/17667/ساختار-معماری-mvp-model-view-presenter-چگونه-است؟
این رو هم بخون http://www.nilasoftwaregroup.com/معماری-mvp-در-اندروید-و-تفاوت-آن-با-mvc/
این رو هم بخون http://phoenixdevs.ir/tag/الگوی-معماری-mvp/
این لینک ها رو هم در مورد mvvm بخون
https://www.support.day.ir/kb/mvvmarchitecture.aspx
اما در مورد mvvm با mvc :
خب کنترلر به ویو مدل تبدیل شده و فرقش اینجاس که در ام وی سی ویو مستقیما تحت تاثیر منطق کنترلر قرار داره و بر اساس اون ساخته میشه مثلا همون مغازه رو در نظر بگیر که آرایش ویترین و چیدمانش مستقیما دست کنترلر یا همون صاحب مغازه و شاگردشه اما در mvvm
یجورایی کار فرق داره و ویو دیگه مستقیما از منطق کنترلر تبعیت نمیکنه و بجاش ویو مدل وجود داره ! خب کار ویو مدل چیه ؟
همون مثال مغازه رو در نظر بگیر اما اینبار فکر کن که ویترین هوشمنده و برای هر جنسی که داخل ویترین وجود داره خودش تصیمیم میگیره که از کدوم قسمت ویو مدل این جنس رو برداره و ویو مدل کارش فقط به روز رسانی ویو یا بایند کردنه :slight_smile:

1 پسندیده

سلام . من میدونم چی هستن اینا اگر پیامم رو بخونی بازم متوجه میشی گفتم تفاوتشون رو میخام و کاربردشون در پروژه های دیگه من الان نمیدونم باید از کدوم استفاده کنم .

در مورد پیاده سازی هم باید بگم هر کسی یه طوری پیاده سازی کرده تازه توی گیت هاب پروژه های اندروید mvp - mvc رو دانلود کردم هر کسی یه طوری پیاده سازی کرده یکی اکتیویتی هارو پرزنت حساب کرده یکی دیگه کلا اکتیویتی و … رو بیرون کرده از ساختار و …

یه ساختار مشخص براشون نیست . توی سایت های ایرانی هم همه توضیحات و پیاده سازی متفاوت از هم هستن .

1 پسندیده

خب اوکی مشکلی نیست من mvc رو برات توضیح میدم مابقی رو هم از روی این میفهمی :slight_smile:
ببین الان فرض رو بر این میگیریم که تو یه وب سایت فروشگاهی درست کردی و از هیچ الگو و معماری خاصی استفاده نکردی . بعد یه مدت میخوایی مثلا تو قسمت ثبت نام یه گزینه جدید اضافه کنی که قراره تو دیتابیس هم ذخیره بشه
خب برای اینکه این قسمت رو اضافه کنی مجبور میشی کلی کد تغییر بدی ! از کوئری های که نوشتی تا فرمی که کاربر باهاش ثبت نام میکنه و کدهایی که مثلا فرم رو اعتبار سنجی میکنند . عوض کردن این کدها هم کار سختی هست ، علتش چیه ؟
چون کدهایی که مثلاً اعتبار سنجی میکنند با کدی که قراره به دیتابیس وصل بشه و کوئری بگیره با کدی که طراحی داخلشه همشون قاطی پاتی هستند و یه جا و تو برای تغییر یه قسمت ساده باید کل این قسمت ها رو تغییر بدی یا انگولک کنی
همزمان ممکنه که تو در طراحی ظاهر پروژه هم ادم سخت گیری باشی و بخواهی که یک طراح خیلی حرفه ای کار کنه ، خب اینم خودش یه مشکل دیگه هست و علتش اینه :
کدهایی که مربوط به دیتابیس هستند با کدهایی که اعتبار سنجی رو انجام میدن با کدهای html و … همشون ممکنه تو یه فایل باشن و این کار طراح رو اذیت میکنه چون برای پیدا کردن یه تگ html باید همه اون کدها رو هم بررسی کنه و حتی ممکنه یه اشتباه بکنه
و یجا رو ناخواسته تغییر بده و برای تو دردسر ایجاد کنه
از طرفی چون تو خودت هم ممکنه بخواهی این کدها رو تغییر بدی یا همزمان کار کنید کار سخت تر میشه چرا که همه کدها شبیه آش هایی که مادر من میپزه شده و معلوم نیست چیه به چی هست .
بعد فرض کن مثلا دو هفته از روی این پروژه میگذره و تو متوجه میشی که باید یه قسمت دیگه رو هم تو پروژه اضافه کنی یا تغییر و احتیاجم به نیروی جدید داری و تو قراره کار اعتبار سنجی رو انجام بدی و نیروی جدیدم مثلاً میخواد کارهای دیتابیس و کوئری رو انجام بده
خب از اونجایی که کدهای تو قاطی پاتی ان کوئری که اون قراره فرضا روش کار کنه با کدی که تو قراره اعتبار سنجی رو انجام بدی ممکنه تو یه فایل باشن و خب بقیه قصه رو خودت میدونی !
حالا فرض کن بعد یه مدت دیگه پروژه تو بزرگ شده و در عین حال هم یه خطا پیدا شده :frowning: پیدا کردن این خطا کار سختیه چرا که حتی اگر بدونی هم علت خطا چیه باید کلی کد بخونی ، چون کدهایی که مربوط به html هستن با کدی که مثلا داده رو از دیتابیس میگیره با کدی که کاربر رو احراز هویت میکنه باهم مخلوطن .
بعد فرض کن تو میخواهی دکمه ثبت نام رو که رنگش قرمز بود رو آبی بکنی ! خب کد این دکمه کجاست ؟ شاید یجا بین کدهای دیتابیس افتاده یا بین کدهای لاگین کردن ! خب میبینی که کار سختیه و برای عوض کردن یه چیز ساده بازم باید بین فایل های مختلف چرخ بزنی !

اینا مشکلاتی هستند که قبل ما یه عده باهاشون روبه رو شدند و بعد کلی فکر اخر به این نتیجه رسیدن که بهتره کدی که با دیتابیس سر و کار داره با کدی که کاربررو احراز هویت میکنه و… با کدی یا فرمی که جلوی چشم کاربره رو باید از هم جدا کرد تا مشکلاتی مثل موارد بالا پیش نیاد و اسمش هم گذاشتن mvc !
خب mvc مخفف model view controller هست !
مدل :
مدل رو قسمتی فرض کن که کارش گرفتن داده و یا ذخیره داده تو پایگاه داده است
کنترلر :
قسمتی که کارهای منطقی رو انجام میده ، مثلا کاربر لیست خریدش چه چیزهایی هست و …
ویو : مثل فایل هایی xml که تو اندروید ازشون استفاده میکنی در نظر بگیر ! ویو جلوی چشم کاربره و کارش فقط نمایش دادن نتیجه به کاربره ! این یعنی حالت ویو بر اساس منطق کنترلر تنظیم میشه و مثلا تو کنترلر کدی مینویسی که کاربر اگر فرضا کالای ایکس رو انتخاب کرد رنگ صفحه یا همون ویو آبی بشه !
خب حالا اینا با هم چجوری کار میکنن ؟
یه فروشگاه بزرگ رو در نظر بگیر
دقت کردی تو فروشگاه های بزرگ اکثرا یه انباری دارن ؟ مجبورن از انبار استفاده کنن چون کالاهاشون بدون انبار قاطی میشه و کل مغازه رو جنس برمیداره
دقت کردی تو هر فروشگاهی یه سری ویترین و میز و … وجود داره که داخلشون جنس های رنگارنگ رو با تزیئیین کردن ؟
بعد همیشه کسی هم هست که وقتی از خرید تموم شدی یه ماشین حساب دستشه که چندتا دکمه میزنه بهت مبلغ خرید رو میده
mvc دقیقا شبیه همین فروشگاه هست :slight_smile:
انباری میشه همون مدل که دائما از داخلش جنس میره میاد بیرون
بعد یه سری آدم هم وجود دارند که ویترین ها رو تزئیین میکنند و یا وقتی مشتری یه کالای خاص خواست دستور میدن که برن از انباری اونو بیارن
این ادم های فروشگاه که 24 ساعت در حال رفت و امد هستند و به خواسته های مشتری پاسخ میدند یا از انبار جنس میارن بزارن رو ویترین میشن کنترلر
و صورت حسابی که دست مشتری میدن یا ویترین میشه ویو
خب حالا مزیت این کار چیه ؟ مزیتش اینه که قسمت های مختلف پروژه تو از هم جدا میشن ! تو هرقسمت فقط کدهای مربوط به اون قسمت وجود داره
مثلا اگر میخواهی یه کوئری رو عوض کنی یا میخواهی کاربر بعد 30 دیگه logout بشه دیگه لازم نیست کلی کد بخونی خیلی راحت میری تو کدهای کنترلر و کد مینویسی
البته مزیت زیاده ولی انگشتای من خسته شدن و مابقی رو گوگل کن
خب دیگه از این ساده تر نمیتونستم بگم :slight_smile:

3 پسندیده