در دنیای برنامه نویسی، هر زبان از یک معماری مشخص پیروی میکند تا برنامه نویسان بتوانند با توجه به این معماری، ساختار درستی به کدهای خود بدهند. هر چه بخشهای مختلف معماری یک زبان از هم مستقلتر باشند، به روزرسانی و اعمال تغییرات در کدهای قدیمی، سادهتر خواهد شد. برای همین است که در میان زبانهای برنامه نویسی، آن دسته از زبانهایی که از معماری MVC پیروی میکنند، طرفداران زیادی دارد. حالا اصلا این معماری یعنی چه و چه کاربردی در برنامه نویسی دارد؟
معماری MVC چیست؟
این عبارت، مخفف سه کلمه Model, View, Controller است که اپلیکیشن یا همان برنامهای که نوشتید را به سه بخش منطقی مجزا تقسیم میکند. این معماری در گذشته برای رابطهای کاربری گرافیکی در کامپیوترها استفاده میشد اما امروزه در برنامه نویسی وب و موبایل نیز کاربرد دارد. البته که طراحی وبسایت به کمک این معماری، بسیار رایج شده است.
این الگوی معماری، با اینکه کل کدهای شما را به سه بخش مجزا و مستقل تقسیم میکند، قانونگذاری کلی روی برنامه را از یک بخش مدیریت میکند. این یعنی اگر میخواهید هنگام کدنویسی، بخشهای برنامه از هم جدا باشند، اما کلیت آن در نهایت از قوانین واحد پیروی کند، به الگوی معماری MVC نیاز خواهید داشت؛ همانطور که در ابتدا اشاره شد، این معماری شامل سه بخش یا همان سه کلمه مخفف شده است که عبارتند از:
- مدل (Model)
- ویو (View)
- کنترلر (Controller)
و هر کدام وظایفی را به عهده دارند که در ادامه جزئیات این وظایف شرح داده شده است. البته پیش از آن بد نیست بدانید که چرا این الگوی معماری، کاربرد بالایی دارد. دو دلیل اصلی برای استفاده از این معماری وجود داره که یکی از آنها، عدم نیاز به تکرار است. یعنی شما نیازی به تکرار تکه کدهای مختلف در بخشهای متفاوت برنامه خود ندارید، چون کل برنامه نهایتا با قوانین واحد اجرا میشوند. دوم اینکه در حال حاضر، معماری MVC در برنامه نویسی وب، یکی از محکمترین ساختارهای ایجاد برنامههای تحت وب است.
وظایف Model در معماری MVC چیست؟
بخش Model از معماری MVC به عنوان پایینترین سطح این الگو شناخته میشود. تمام دادههای برنامه شما در این بخش نگهداری میشوند. در واقع این بخش به پایگاه دادههای برنامه شما متصل است و یک ارتباط منطقی برای شما ایجاد میکند تا نیازی به سر و کار داشتن مستقیم با دادهها نداشته باشید. در نتیجه، هر بلایی سر دادههای بخواهید بیاورید، با مدیریت مدل انجام خواهد شد.
وظایف اصلی این بخش شامل:
- درج، حذف یا بازیابی اطلاعات از پایگاه داده
- پاسخ به درخواستهای کنترلر (کنترلر در این معماری به هیچ وجه با پایگاه داده ارتباط مستقیم ندارد.)
- ارتباط رفت و برگشتی با پایگاه داده برای تبادل اطلاعات و پاسخگویی به درخواستها
نکته بسیار مهم این است که همانطور که کنترلر به هیچ وجه با پایگاه دادهها ارتباط مستقیم ندارد، مدل هم با بخش View هیچ ارتباط مستقیمی برقرار نمیکند.
وظایف View در معماری MVC چیست؟
همانطور که از نامش پیداست، View یا همان نمایش، نقش یک رابط کاربری را بازی میکند. این یعنی وقتی از بخش ویو در معماری MVC صحبت میکنیم، منظور همان کدهای HTML یا CSS برنامه (در اینجا یک وبسایت) هستند. تمام اطلاعاتی که در این بخش برای ایجاد یک رابط کاربری درست نیاز است، از مدل تامین میشود، اما همانطور که گفته شد، مدل و ویو با هم ارتباط مستقیم ندارند. در واقع کنترلر، با درخواست اطلاعات از مدل، دادههای جمعآوری شده را به دست View میرساند.
وظایف اصلی این بخش شامل:
- ایجاد رابط کاربری برای برنامه
- دریافت اطلاعات لازم از کنترلر
وظایف Controller در معماری MVC چیست؟
کنترلر به عنوان هسته مرکزی برنامه شما شناخته میشود. اگر کنترلر وجود نداشته باشد، ویو و مدل هرگز نمیتوانند با هم ارتباط برقرار کنند. اما منطق برنامه شما در این جا نیست، بلکه فقط یک درخواست دهنده به Model و اطلاع دهنده به View خواهد بود. در این میان، یعنی زمانی که اطلاعات را از مدل دریافت کرد، تا زمانی که به ویو منتقل کند، دادهها پردازش میشوند. در این پردازش، نحوهی نمایش اطلاعات برای کاربران را شرح و همراه با دادهها به ویو منتقل میکند. حالا View میداند که به چه روشی رابط کاربری خود را ایجاد کند. همچنین کنترلر با درخواستهای کاربرانی که در آینده از برنامه شما استفاده میکنند، در ارتباط خواهد بود.
وظایف اصلی این بخش شامل:
- دریافت درخواستها از ویو یا کاربران و انتقال آن به مدل، سپس دریافت پاسخ و اطلاعات لازم از مدل و انتقال آن به ویو
- پردازش دادههای دریافت شده
مثالی از معماری مدل – ویو – کنترلر در دنیای خارج از وب
در دنیای واقعی، خارج از دنیای برنامه نویسی و وب هم الگوی MVC کاربردی است. بهترین مثالی که از این الگو میتوان زد، مثال معروف رستوران است. تصور کنید که به یک رستوران میروید و غذا سفارش میدهید. گارسون سفارش شما را دریافت و به آشپزخانه میبرد. غذا بعد از اینکه آماده شد، توسط گارسون به شما رسانده میشود.
در تمام این فرایند، چهار جز اصلی و سه نقش کلیدی به چشم میخورد. این چهار جز اصلی شامل:
- مشتری (خودتان)
- گارسون
- تیم آشپزخانه
- غذایی که سفارش داده شده
که در مقایسه با معماری MVC میتوان سه نقش گارسون، آشپز و مشتری را اینطور تقسیم کرد:
- مشتری، همان کاربر است که قرار است با سایت یا اپلیکیشن شما تعامل داشته باشد.
- آشپزخانه، جایی است که فرایند اصلی روی داده اولیه انجام میشود. پس آشپزخانه Model الگو خواهد بود.
- گارسون که مدام در حال رفت و آمد و تبادل درخواستها است، کنترلر سیستم رستوران به حساب میآید.
- غذایی که نهایتا سرو میشود، View در این مجموعه است.
در این مثال، شما هرگز با آشپزخانه ارتباط مستقیم ندارید و از نحوه تهیه غذا، اطلاعی نخواهید داشت. گارسون هم به هیچ عنوان به مخزن اصلی مواد اولیه دست نمیزند.
مثالی از معماری مدل – ویو – کنترلر در دنیای وب
بیایید الگوی این معماری را با یک مثال در وبسایت خودمان بررسی کنیم. فرض کنید شما میخواهید در وبلاگ سایت همیار آیتی، یک عبارت مشخص را جستجو کنید. برای این کار به عنوان یوزر، به قسمت جستجوی سایت میروید و درخواست خود را تایپ میکنید. با تایید گزینه جستجو، درخواست شما توسط ویو ثبت و به دست کنترلر میرسد. کنترلر درخواست شما را تحلیل و به مدل ارسال میکند تا با جستجو در پایگاه داده، آدرس درست برای پاسخگویی به شما پیدا شود. بعد از این که اطلاعات پیدا شد، کنترلر توسط مدل با خبر میشود. حالا دادهی دریافتی توسط کنترلر پردازش شده و به ویو منتقل میشود. نهایتا ویو، انتقال شما از آدرس صفحه جستجو، به آدرس عبارتی است که جستجو کردید.
مزایا و معایب معماری MVC در برنامه نویسی
طبیعتا هر معماری برنامه نویسی، مزایا و معایب خاص خود را دارد و MVC هم از این قاعده مستثنا نیست. اما زمانی که مزایای یک معماری به معایب آن بچربد، باعث میشود برنامه نویسان بیشتر با آن ارتباط مفید برقرار کنند. برای همین است که MVC امروزه از برترین معماریهای برنامه نویسی وب محسوب میشود.
مزایای معماری MVC در برنامه نویسی
- منطق اصلی برنامه (یعنی همان منطق تجاری آن) از منطق رابط کاربری مجزا است.
- تمام اجزا قابل استفاده مجدد هستند.
- نگهداری این نوع برنامهها آسانتر است.
- هر بخش معماری MVC این قابلیت را دارد که به صورت جداگانه ذخیرهسازی شود.
- در این معماری تست اجزای مختلف برنامه بیدردسرتر است.
معایب معماری MVC در برنامه نویسی
- پیچیدگی آن بالا است.
- برای گسترههای کوچک مناسب نیست. (برای ایجاد یک وبسایت کوچک و کم کاربر، نمیارزد چنین پیچیدگی را متحمل شد)
- گاهی اوقات عدم دسترسی View به دادهها باعث ایجاد کاربرد آن را کاهش میدهد.
بله، معماری MVC در برنامه نویسی سخت و پیچیده است، اما طبیعتا یادگیری و پیادهسازی آن غیرممکن نیست. در واقع زمانی که آن را به درستی درک کرده باشید، چون اجزای برنامه شما به بخشهای مختلف و کوچکتر تقسیم میشود، به مرور زمان به این نتیجه میرسید که معماری MVC ساده و کاربردی است! در این الگوی معماری، منطق کلی برنامه حرف اول را میزند و ارتباط رابط کاربری با دادهها به صفر میرسد. همین امر موجب میشود پیادهسازی تستها و به روزرسانی کدها سادهتر باشد. مثلا اگر بخواهید فقط بخش رابط کاربری را به روزرسانی کنید، بدون نیاز به دستکاری منطق اصلی برنامه، این کار امکانپذیر خواهد بود.
الگوی مدل – ویو – کنترلر، برای پروژههایی که حجم نسبتا بزرگی دارند و عموما قرار است توسط یک تیم با اعضای مختلف پیادهسازی شود، کاربرد بالایی دارد. در این شرایط، با این که همه اعضا در راستای رساندن پروژه به نقطه اجرایی تلاش میکنند، کار اعضای هر بخش با دیگری تداخل نداشته و میتوان آن را به صورت موازی یا متوالی (بسته به ترجیح تیم) پیش برد.