Model View Controller

תבנית Model-View-Controller (בקיצור MVC, בתרגום חופשי: תבנית מודל-תצוגה-בקר) היא תבנית עיצוב בהנדסת תוכנה המשמשת להפשטת יישום כלשהו. התבנית מתארת טכניקה לחלוקת היישום לשלושה חלקים: "מודל", "תצוגה" ו"בקר", המחוברים ביניהם בצימוד רפוי מונחה אירועים. בדרך זו, התלות ההדדית בין ממשק המשתמש לשאר חלקי התוכנה פוחתת, ואת החלקים השונים ניתן לפתח באופן בלתי-תלוי. בנוסף, קל יותר לתחזק את התוכנה וכן לעשות שימוש חוזר בחלקי היישום שהופרדו.

MVC, בדומה לתבניות עיצוב רבות אחרות, תוארה לראשונה בשפת התכנות Smalltalk. התבנית תוארה לראשונה בשנת 1979 על ידי טרִיגְב רִינְסקַאוּג, אז עובד במעבדות המחקר של חברת זירוקס. היישום המקורי מתואר בהרחבה במאמר המשפיע שכתב סטיב ברובק.

תיאור התבנית 
מקובל לחלק יישום תוכנה למספר שכבות נפרדות: שכבת התצוגה (ממשק משתמש), שכבת התחום העסקי (לעיתים נקראת גם "שכבת הלוגיקה העסקית") ושכבת הגישה לנתונים. בתבנית MVC, שכבת התצוגה מחולקת בנוסף ל"תצוגה" ו"בקר". יש המחשיבים את התבנית כתבנית עיצוב, אך בהשוואה לתבניות עיצוב אחרות, MVC עוסקת במבנים בקנה מידה בינוני-גדול ולכן נחשבת גם כתבנית ארכיטקטורה.

מודל
המודל הוא יצוג מסוים, מוכוון תחום עסקי, של המידע עליו פועל היישום. המודל, למרות הדעה הרווחת, אינו שם אחר לשכבת התחום העסקי והוא נפרד ממנה. תבנית MVC אינה מזכירה במפורש את שכבת הגישה לנתונים, מכיוון ששכבה זו היא מתחת למודל, או נעטפת על ידו.

תצוגה
תפקידה להמיר את נתוני המודל לייצוג המאפשר למשתמש לבצע פעולת גומלין כלשהי. לרוב מדובר על המרה לממשק משתמש כלשהו. תבנית MVC משמשת רבות ביישומי Web, בהם התצוגה היא דף HTML והקוד האוסף מידע דינמי לדף.

בקר
תפקידו לעבד ולהגיב לאירועים המתרחשים בתצוגה, לרוב, כתגובה לפעולה של המשתמש. בעיבוד האירועים, הבקר עשוי לשנות את המידע במודל, באמצעות שפעול שירותים המוגדרים בו. בקרים מורכבים מתבססים לרוב על יישום של תבנית Command.

אופן הפעולה 
ניתן ליישם את תבנית העיצוב MVC בדרכים רבות, אך לרוב היא מיושמת כך:
 הבקר נרשם כ-Event Handler או Callback בתצוגה, בדרך כלל סמוך ליצירת הבקר. כלומר, יישום של שיטת היפוך הפיקוח (IoC). משמע, הבקר יקבל פיקוח כאשר יתרחש אירוע קלט בממשק המשתמש.
 ביצוע פעולת גומלין עם הממשק. לדוגמה, לחיצה על כפתור "הוספת מוצר לסל הקניות".
 הבקר שנרשם על התצוגה מקבל פיקוח ומשפעל שירותים המוגדרים במודל, כדי לשקף את הפעולה שבוצעה. לדוגמה, עדכון עגלת הקניות בפריט שנוסף.
 התצוגה מקבלת בצורה עקיפה את חוכמת התצוגה שלה מהבקר, בדרך כלל באמצעות יישום של תבנית Strategy.
 התצוגה משתמשת במודל כדי ליצור את ממשק המשתמש. לדוגמה, התצוגה מפיקה רשימה של הפריטים בעגלה, כפי שאלה מיוצגים כרגע במודל. בין השניים אין קשר הדוק, והמודל אינו מודע לכך שהתצוגה ניגשת למידע המאוחסן בו.
 לעיתים, המודל עשוי להודיע על שינויים המתחוללים בו לצדדים שלישיים נוספים, בדרך כלל באמצעות יישום של תבנית Observer.
 ממשק המשתמש ממתין לפעולות נוספות של המשתמש, וכשאלה מתרחשות, התהליך חוזר על עצמו.

מימושים 
תבנית MVC השפיעה רבות על התכנון של ממשקי משתמש חלונאים רבים, החל מימי Smalltalk ועד ליישומי Web. עשרות מימושים של MVC זמינים לרוב פלטפורמות המחשוב וממשקי המשתמש העיקריים.

סביבות חלונאיות 
 סביבות הפיתוח NeXTSTEP ו-OPENSTEP וכן אלה הנגזרות מהן Cocoa ו-GNUstep.
 Data Core בסביבת מקינטוש של חברת אפל, המבוססת על Cocoa.
 ספריית המסגרת Microsoft Foundation Classes (MFC) מיישמת גם היא MVC תחת השם Document/View Architecture.
 סביבת הפיתוח www.asp.net/mvc
 Java Swing, יישום רב-פלטפורמי של ממשק משתמש מתקדם.
 בסביבת Eclipse, ספריית ממשק המשתמש Standard Widget Toolkit.
 Qt toolkit החל מגרסה Qt4.
 Business Server Pages) BSP) במערכת התוכנה של SAP.

סביבות Web 
 Webwork2, JavaServer Faces ו-Apache Struts הן סביבות הפיתוח מונחות MVC הפופולריות ביותר.
 
 Ruby on Rails
 Laravel
 Fusebox
 Spring MVC
 django
 Mach-II
 Maypole
 CodeIgniter
 Catalyst
 ZNF
 Apache Cocoon
 SAP Web Dynpro
 Zend Framework

ראו גם
MVVM

קישורים חיצוניים 

 סביבת פיתוח של ארכיטקטורת MVC שנכתבה ב-PHP
 מאמר של אלן הולוב ב-Java World, 1999 
 מאמרו של סטיב ברובק "Applictaions Programming in Smalltalk-80™: How to use Model-View-Controller (MVC)"
מרטין פאולר, GUI Architectures

הערות שוליים 

ארכיטקטורת תוכנה
תבניות עיצוב