معماری MVC چیست و چرا باید از آن استفاده کنیم؟!?‍♂️

What is MVC
What is MVC

MVC چیست؟

خیلی از جاها MVC رو یک الگوی طراحی مینامند(Dsign Pattern) ولی در حقیقت، MVC یک معماری نرم افزار است، نه یک الگوی طراحی، چرا؟ اگر بخوام در کوتاه ترین حالت، و در عین حال ملموس ترین حالت ممکن توضیح بدم، معماری نرم افزار ساختار و استراکچر اصلی پروژه نرم افزاری مارو مشخص میکند، اما دیزاین پترن ها تنها راه حل هایی هستند، برای مشکلات رایج در برنامه نویسی شی گرا.

این معماری نرم افزار که مخفف Model-View-Controller هست، همونطور که میبینید از قانون Separation of concern پی روی میکند، یعنی چی؟ یعنی اینکه نگرانی های ما (همون Concern ها) که در اینجا منظورش همین سه بخش نرم افزاری هست، رو از هم جدا میکنه، چه مزیت هایی داره این کار؟!

زمانی که شما این سه بخش نرم افزاری رو از هم جدا میکنید، ساختار پروژتون قابل درک تر میشه (برای یک شخص سومی که قراره با کد های شما کار کنه)، زمانی که به مشکل برخوردید خیلی راحت میتونید مشکل رو رفع کنید، چون بخش های مختلف از هم جدا هستند و شما فقط به سراغ همان بخشی میروید که مشکل دارد، هزینه نگهداری کد ها کاهش میابد، سرعت توسعه افزایش میابد، تایم توسعه کاهش میابد، سرعت دیباگینگ افزایش میابد، خطاهایی که به دلیل تمیز نبودن کد و یا در هم بودن کد ها به وجود آمدند، کاهش میابند و . . .

چرایی استفاده از MVC

زمانی که ما از معماری MVC استفاده میکنیم، Cohesionعه نرم افزار ما افزاریش میابد (Cohesion : به انسجام بخش های نرم افزاری گفته میشود، مثلا زمانی که داریم یک ماژول رو توسعه میدیم، ببینیم که چقدر کلاس ها و متد هایی که درونش استفاده کردیم به هم مربوطه، هر چقدر بیشتر به هم ارتباط داشته باشن، Cohesion نرم افزار ما افزایش میابد، ما همیشه باید برای افزایش Cohesion در نرم افزارمون تلاش کنیم) و
Coupling رو هم کاهش میدهد (Coupling : منظور میزان وابستگی نرم افزار است، میزان وابستگی ماژول ها به یک دیگر و . . . )
توی برنامه نویسی یک جمله معروف وجود داره و اون هم اینه: The problem is money and Time و اگر ما بتونیم با روشی هزینه و تایم توسعه رو کم کنیم، اون روش روش مناسبیه.
زمانی که شما از یک معماری درست برای نرم افزارتون استفاده نکنید ممکنه دچار Spaghetti Code بشید (یعنی کد هاتون مثل اسپاگتی، در هم تنیده باشن، و این اون جمله معروفه رو نقض میکند.?)


هزینه نگهداری یعنی چی ؟! تصور کنید که به مشکل خوردید و چون کدتون استاندار نیست برای رفع مشکل زمان خیلی زیادی از دست میدید و زمان از دست رفته مساوی با پول از دست رفته است، چون شما باید به دولوپر هاتون حقوق بدید و اگر هم محصولی داشته باشید، توی تایم دیباگینگ علاوه بر هزینه ای که باید به دولوپر پرداخت کنید، شما فروشی هم ندارید و این ضرر مالی شما چندین برابر میشود.


اجزا مختلف MVC

اجزا مختلف MVC
اجزا مختلف MVC

Models :

به طور خلاصه ما برای انجام عملیات CRUD ( که مخفف : Create, Read, Update, Delete میباشد) استفاده میکنیم، به طور خلاصه Model اون بخش نرم افزاره که با Data Source ها ارتباط برقرار میکنه، این دیتا سورس ها الزاما نباید دیتابیس های رابطه ای باشند (RDBMS : یا همون Realational DataBase Management System ) بلکه ممکنه اصلا یکسری فایل TXT باشند یا فایل JSON ( اگر نمیدونید JSON چیه حتما پیشنهاد میکنم این مقاله رو بخونید ?) یا هر دیتا سورس دیگه ای.
تقریبا توی پروژه های نرم افزاری که با این معماری Implement شدن (ممکنه همه هم اینطور نباشن) به ازای هر جدول در دیتابیس، یک کلاس تشکیل میدهند و ساختار بخش Model ها اینگونه است.

Views :

در این قسمت تمام کد های Present نرم افزار قرار دارند، در حقیقت کد های سمت کاربر (Client) و این به این معناست که دیگر نباید هیچ گونه کدی از سمت کلاینت در کد های سمت سرور ما باشد، معمولا در بخش View مجددا فایل ها دسته بندی میشوند، به طور مثال، View های مربوط به Athentication جدا هستند و یا View های مربوط به صفحه اصلی و به همین صورت.

Controllers :

اولین بخش پس از Router همین کنترلر هستش، تعداد زیادی کنترلر میتواند در نرم افزار ما وجود داشته باشد که هر یک از آنها مربوط به یک موجودیت (Entity) هستند، و کنترلر مثل یک پل میمونه میان Models و Views و وظیفه Interaction را میان اینها ایفا میکند.



Requst pipeline or Request

ما برای WebServer مشخص میکنیم که زمانی که ریکوئستی از سمت کاربر برایش آمد، هیچ کاری نکنه، و اون ریکوئست رو بده به یک فایلی که ما مشخص کردیم به نام، FrontController و این FrontController میاد و بخش Route ریکوئست (توی یکسری از فریم ورک ها بهش میگن Path ) میده به یک فایلی به نام Router.
Route : بخش URL رو در نظر بگیرید، دامین سایت رو ازش جدا کنید، مقدار باقی مانده میشود Route، یا همون URI

github.com/masoudharooni         =>         URL 
github.com/                                     =>         Domain
 /masoudharooni                             =>         URI || Route

در نرم افزار های MVC یک بخشی وجود دارد به نام Router که این روتر وظیفش مشخص کردن مسیر و هدفی است که ریکوئست برای آن زده شده است، روتر چگونه مسیر رو مشخص میکند؟! روتر ها لیستی دارند از مسیر ها و روت های نرم افزار ما که به آن Route Hub میگویند، و طبق آن مسیر ریکوئست را مشخص میکنند.
Router طبق همون Route Hub مسیر را مشخص میکند، به طور مثال میگوید اگر روت برابر بود با "Login/" شما بورو داخل کنترلر AthenticationController و متد Login رو صدا بزن.


Middleware :

یه بخشی توی معماری MVC هست که شاید به اندازه سه بخش قبلی با اهمیت نباشد، ولی این هم از اهمیت بالایی برخوردار میباشد، این Middleware دقیقا چیه و چه کاری انجام میده؟!

زمانی که روتر مقصد رو مشخص کرده، و ریکوئست به سمت کنترلر حرکت میکند، باید از یک واسط نرم افزاری بگذرد، این واسط نرم افزاری ما یا اجازه میدهد که ریکوئست به کنترلر برسه یا اجازه نمیدهد.
توی خیلی از وب سایت ها دیدید که IP های مربوط به یکسری کشور های خاص بلاک شده، یعنی با اون IP نمیتونید وارد سایت بشید، دقیقا یک Middleware ست کردن و اسم کشور رو داخل بلک لیست قرار دادن، یا مثلا اگر شما بخواهید، کسی نتواند، با مرورگری جز کروم وارد وب سایتتون بشه، یک وایت لیست تشکیل میدید و یه Middleware براش ست میکنید و مشخص میکنید که هیچ مرور گری جز این مرورگری که در وایت لیست من وجود دارد نمیتواند به کنترلر دسترسی داشته باشد، یا میخواهید اگر در یک دقیقه بیشتر از 60 بار درخواست برای لاگین کردن به وب سایت آمد، اون IP رو بلاک کنید (این کار رو برای جلوگیری از حملات Brute force انجام میدهند. ) در تمام این کار ها، قبل از اینکه ریکوئست به کنترلر برسد و منابع نرم افزاری مارو درگیر کنه، جلو اون درخواست گرفته میشود.

یا برای Static Caching هم میتوان از همین Middleware ها استفاده کرد، یعنی زمانی که Route یکسان بود و کش وجود داشت دیگه ریکوئست به کنترلر نمیرسد و منابع مارو مصرف نمیکند، یک فایل استاتیک برای کاربر رندر گرفته میشود، و این فرایند سرعت وب سات رو به طور اعجاب انگیزی افزایش میدهد.

برای بحث Localisation هم استفاده میشود، تا به حال براتون پیش اومده که با VPN یک وب سایت رو باز کنید و اون وب سایت زبانش رو به زبان سرور VPN شما تغیر دهد؟ یک Middleware ست کردند و با استفاده از IP شما زبان وب سایت رو برای شما کاستومایز میکنند.


خیلی ممنونم ازتون که تا اینجای مقاله رو مطالعه کردید، اگر براتون مقدور هست، لطفا مقاله رو لایک کنید و با دوستاتون به اشتراک بذارید.❤?


خب بریم که با هم به چنتا سوال مهم در رابطه با MVC پاسخ بدیم.


چه تغیراتی میتوان در ساختار معماری MVC داد ؟

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

توی نرم افرار های MVC فقط همین 3 بخش وجود دارد؟!

خیر، همانطور که دیدید ما یک مفهومی داشتیم به نام Middleware و این جدایی از سه بخش اصلی است، اینطوری نیست که بگویم اگر معماری ما mvc است دیگر نمیتوانیم بخش هایی جز 3 بخش اصلی داشته باشیم، میتوانیم بخش هایی برای Middleware ها و یا Entity ها و یا Servicec ها و . . . داشته باشیم.


توی ساختار MVC حتما باید این 3 بخش اصلی وجود داشته باشد؟!

خب مسلما این معماری از سه بخش اصلی Model , Views , Controller تشکیل شده، ولی همانطور که گفتیم انعطاف پذیر هم هست، فقط شما باید دانش مورد نیاز آن را داشته باشید.
توی خیلی از نرم افزار ها، مانند وب سرویس ها، چون رابط کاربری وجود ندارد، دیگه بخش View رو ندارند و این وابطه به سیاست های نرم افزاری شماست.


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