Model View Controller

תבנית העיצוב Observer).]]
תבנית 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
== קישורים חיצוניים ==

* [https://web.archive.org/web/20051102032523/http://www.phpwact.org/php/mvc_frameworks סביבת פיתוח של ארכיטקטורת MVC שנכתבה ב-PHP]
* [http://www.javaworld.com/javaworld/jw-07-1999/jw-07-toolbox.html מאמר של אלן הולוב ב-Java World, 1999] 
* מאמרו של סטיב ברובק [https://web.archive.org/web/20090801040629/http://st-www.cs.uiuc.edu/users/smarch/st-docs/mvc.html "Applictaions Programming in Smalltalk-80™: How to use Model-View-Controller (MVC)"]
*מרטין פאולר, [http://martinfowler.com/eaaDev/uiArchs.html GUI Architectures] 

== הערות שוליים ==

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