MVC چیست به زبان ساده

دسته بندی: برنامه نویسی
سطح مقاله: متوسط
زمان مطالعه: 8 دقیقه
۲۹ تیر ۱۳۹۸
فارسی
ام وی سی
English
MVC

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

فهرست محتوای این مقاله

MVC چیست؟

معماری MVC

(Model View Controller) MVC یک معماری برنامه نویسی است که نرم افزار را به سه بخش مجزا تقسیم می کند. این بخش ها عبارت اند از Model برای ارتباط با پایگاه داده، View برای ایجاد یک رابط کاربری برای نمایش و تغییر در داده های پایگاه داده و Controller برای پردازش درخواست های کاربر.

به عنوان مثال فرض کنید در یک رستوران از منوی آن ها سفارش یک پیتزا داده اید. گارسون سفارش شما را دریافت می کند. سپس به پیشخوان آشپزخانه رفته، و سفارش شما را به آن ها می رساند. پس از آماده شدن غذا، گارسون غذا را از پیشخوان آشپزخانه به میز شما می رساند. در این مثال:

  • آشپزخانه به میز شما وابسته نیست.
  • آشپزخانه به گارسن وابسته نیست.
  • گارسن از طریق دریافت سفارش تمام غذاهای منو و ارسال آن ها به میز شما آگاه است.
  • شما از روش آماده سازی غذا اطلاع ندارید.

در واقع شما نقش کاربر درخواست کننده اطلاعات را دارید. گارسون به عنوان Controller وظیفه درخواست اطلاعات از آشپزخانه را به عنوان Model  و ارسال اطلاعات مدل در قالب سفارش شما یا View را به عهده دارد. به زبان ساده تر:

  • شما یک User هستید.
  • گارسون Controller است.
  • آشپزخانه Model است.
  • غذایی که سفارش داده اید View است.

MVC چیست

مثالی از MVC

حال که دیدید MVC چیست بگذارید تا به سراغ یک مثال واقعی برویم. فرض کنید کاربر آدرس https://7learn.com را در مرورگر خود وارد کرده است. در حالت بدون معماری، پس از فشار دکمه Enter یک Request یا درخواست از سمت کاربر به سمت سرور برای دریافت فایل مورد نظر (به عنوان مثال pizza.php) ارسال می شود. تمام عملیات اتصال به پایگاه داده برای دریافت اطلاعات لازم و همینطور پردازش آن ها، احتمالا در همان فایل یا در فایل های دیگر در کنار و به صورت وابسته به هم انجام می شود.

در حالت  Request ،MVC پس از ارسال به سرور به Router یا مسیریاب برنامه تحویل داده می شود. Router هر درخواست را به Controller مربوط به خود ارسال می کند. Controller اطلاعاتی که لازم است از پایگاه داده گرفته شود از Model درخواست می کند. Model اطلاعات را از پایگاه داده دریافت کرده و به Controller ارسال می کند. در پایان Controller اطلاعات دریافت شده را به View چسبانده و برای نمایش به سمت کاربر می فرستد.

حالت بدون MVC

تصور کنید وبسایتی داریم که قرار است پس از دریافت شماره پیتزای مورد نظر از URL اطلاعات پیتزای متناسب با آن را از جدول pizza_table پایگاه داده دریافت کرده و در صفحه نمایش دهد. کد زیر این کار را با روش بدون MVC انجام می دهد:

<?php
$index = $_GET['index'];
getPizza($index);

function getPizza($index) {
    global $connection;
    $pizza = $connection->get('pizza_table' , $index);
    print_r($pizza)
}
?>

برنامه ابتدا کد یا شماره پیتزای مورد نظر را از URL دریافت می کند. سپس فانکشن getPizza در همین صفحه فراخوانی می شود. در فانکشن getPizza اطلاعات پیتزای درخواست شده در متغیر $pizza قرار می گیرد و پیتزا در صفحه نمایش داده می شود. در این حالت کدهای شما در هم تنیده هستند. این به آن معنی است که اگر تصمیم بگیرید ظاهر برنامه یا View را تغییر دهید مجبور به تغییر و بازنویسی کل برنامه هستید. همینطور اگر روش اتصال به پایگاه داده تغییر کند و یا حتی بخواهید روش جدیدی برای دریافت اطلاعات و پردازش آن ها تعیین کنید!

حالت MVC

پس از ارسال Request به Controller مناسب برای صفحه نمایش پیتزا، Controller اطلاعات پیتزا را از متد getPizza در Model در خواست می کند. سپس با فراخوانی تابع view که وظیفه نمایش فایل View مناسب و چسباندن اطلاعات دریافت شده از پایگاه داده به آن را دارد، نمایش پیتزا را از View درخواست می کند:

class Controller {
    public function getPizza($index) {
        $model = new Model();
        $pizza = $model->getPizza($index);
        return view('pizza.php' , $pizza);
    }
}

در قسمت Model پس از فراخوانی متد getPizza توسط Controller، اطلاعات پیتزا از جدول Pizza_table پایگاه داده دریافت شده و به Controller پاس داده می شود:

class Model {
    public function getPizza($index) {
        global $connection;
        return $connection->get('pizza_table' , $index);
    }
}

تابع view در Controller پس از فراخوانی و دریافت متغیر پیتزای مورد نظر، آن را به فایل pizza.php ارسال کرده و نمایش می دهد:

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <p>
        <?php
        print $pizza;
        ?>
    </p>
</body>
</html>

در این حالت، در صورتی که قصد داشته باشید view را تغییر دهید می توانید به راحتی این کار را از طریق ایجاد تغییر در فایل pizza.php انجام دهید. ایجاد تغییر در روش پردازش اطلاعات پیتزا و درخواست از Model و همینطور طریقه دریافت اطلاعات از پایگاه داده در Model نیز به همان سادگی است.

نتیجه گیری

در مجموع ممکن است الگوی MVC  در ابتدا کمی پیچیده و مشکل به نظر برسد و ترجیح دهید بدون استفاده از این الگو پروژه های خود را پیش ببرید اما اگر قصد انجام پروژه های بزرگ که نیازمند کار تیمی هستند را دارید هرگز از این الگو غافل نشوید. زیرا همانطور که در بالا توضیح داده شد این الگو با جداسازی View ، Model  و Control  امکان کار جداگانه بر روی هر یک از بخش ها را فراهم می کند.

به عنوان مثال متخصص UI می تواند به صورت مستقل بر روی ظاهر تمرکز و کار کند، بدون اینکه توجهی به مسائل منطقی و باگ های برنامه داشته باشد. از دیگر مزایای استفاده از الگوهای معماری می توان به استفاده دوباره از کد ها اشاره کرد. ما در مجموعه سون لرن در جلسه 27 دوره مجازی PHP به این موضوع پرداخته ایم و طراحی و پیاده سازی وبلاگ (CMS) با معماری MVC  را به شما آموزش داده ایم.

نویسنده

نظرات کاربران

علی

سلام یه سوالی…
با این سطح آگاهی از mvc در این پست، میتونم به آموزش دوره لاراول بپردازم؟ یا نیازمند آموزش و تحقیق بیشتری در این مدل دارم؟
(php کار کردم)

مهدی علامه

سلام علی عزیز
این مطلب دید خیلی خوبی در مورد معماری mvc به شما میده ولی برای درک بهتر این موضوع باید سعی کنی این معماری را در عمل ببینی تا نحوه عملکرد و ساختارش رو بهتر درک کنی
اگر به php و شی گرایی تسلط داری، زمان مناسبی برای شروع یادگیری لاراو است

مسعود

مقالاتی که در مدت اخیر در سایت میذارید به هیچ وجه مطالب و نکات جدیدی در اونها وجود نداره و بسیار ابتدایی هستند و هزاران مطلب بهتر از اینها در وب فارسی موجوده . کاملا مشخصه هدف این مقالات اصلا آموزش نیست بلکه صرفا تولید محتوا جهت seo سایت است .

Alireza Shahsavary

خیلی ممنون بابت مطالب عالیتون ، ضمن احترام به نظر آقای مسعود عزیز
همونطور که اقای علامه فرمودن این سری مطالب برای امثال بنده واقعا کاربردی هستن

مهدی علامه

مرسی علی رضای عزیز
خوشحالم که از این مطلب استفاده کردی

مهدی علامه

تشکر مسعود عزیز
برخی از این مقالات برای کاربرانی است که قصد ورود به دنیای برنامه نویسی را دارند، منتشر می شوند.
تمام مقالات سون لرن با هدف آموزش منتشر می شوند، البته در سطح های مختلف
مرسی از بازخوردت
در آینده مطالب تخصصی تری را منتشر خواهیم کرد.

ارسال دیدگاه
خوشحال میشیم دیدگاه و یا تجربیات خودتون رو با ما در میون بذارید :

 
گزارش مشکل