Table of Contents
המודל-View-Controller (MVC) הוא אחד העיצובים האדריכליים המאומץים ביותר בפיתוח אינטרנט מודרני.זה מספק דרך מובנית לארגן קוד על ידי הפרדת יישום לשלושה מרכיבים מקושרים: המודל, הנוף, והבקר.הפרדה הזו מסייעת למפתחים לנהל מורכבות, שיפור יכולת, ומאפשרת שינויים משותפים של מערכות עבודה כגון לארהvel, Django, Rails, Rubys, ו-ASP.
מהו תבנית MVC?
MVC הוא דפוס ארכיטקטוני תוכנה המחלק יישום לשלושה חלקים נפרדים, כל אחד עם אחריות מסוימת.המטרה היא לנתק את הייצוג הפנימי של נתונים (המודל) מאיך הנתונים מוצגים למשתמש (הנוף) ומאיך המשתמש אינטראקציה עם היישום (הבקר) זה מרתיע את זה יותר קל לשנות רכיב אחד ללא השפעה על אחרים, כל עוד הממשקים בין אלה נשארים יציבים.
שלושת המרכיבים הם:
- (FLT:0)Model:BuildFLT:1) המודל מנהל את הנתונים, ההיגיון העסקי ואת הכללים של היישום.זה אחראי על החזרת נתונים ממאגרי נתונים, ביצוע חישובים, אכיפת אימות, וזיהוי רכיבים אחרים כאשר הנתונים משתנים.המודל הוא עצמאי ממשק המשתמש, ולעתים קרובות מכיל את הליבה של היישום.
- (FLT:0)View:veFLT:1) הנוף מטפל בשכבה המצגת.It לוקח נתונים מהמודל והופך אותו לתבנית המתאימה למשתמש, כגון HTML, JSON או XML.הנוף צופה במודל ומעדכן את עצמו כאשר הנתונים משתנים, ומבטיח את ממשק המשתמש תמיד משקף את המצב הנוכחי.
- (FLT:0)Controller:FLT:1 הבקר פועל כתווך בין הנוף לבין המודל.זה מקבל קלט משתמש (למשל, קליקים, טופס הגשתים), פרשים כי קלט, ולהחליט איזה פעולה לעשות.הבקר יכול לעדכן את המודל או לבקש את התצוגה לשנות.
הפרדה זו של חששות מאפשרת למפתחים לעבוד על חלקים שונים של היישום באופן עצמאי.לדוגמה, מפתח חזיתי יכול להתמקד בתבניות התצוגה מבלי צורך להבין את schema מסד הנתונים, בעוד מפתח אחורי יכול לשנות את ההיגיון המודל מבלי להשפיע על ממשק המשתמש. מקבילות זו היא יתרון מפתח בפיתוח מבוסס צוות.
מקורות היסטוריים ואבולוציה
תבנית MVC תוארה לראשונה על ידי Trygve Reenskaug בשנת 1979 תוך עבודה על שפת תכנות Smalltalk ב Xerox PARC. בתחילה, MVC תוכנן עבור ממשקי משתמש גרפיים שולחניים (GUIs), שבו תצוגה תציג נתונים, בקר היה מטפל קלט משתמש, מודל יאחסן את הנתונים הבסיסיים לאורך זמן, כמו פיתוח אינטרנט, מותאם דפוס כדי לבקשה של יישומי טבע מבוססי HTTP.
בימים הראשונים של פיתוח אתרים, יישומים מעורבים שאילתות מסד נתונים, לוגיקה עסקית וקוד מצגת לתוך קבצים בודדים (נקרא לעתים קרובות קוד ספגטי) זה עשה תחזוקה קשה ומניעה בדיקות.העלייה של מסגרות בצד השרת בתחילת שנות ה -2000 - כמו Struts של Java, רובי על Rails, ולאחר מכן מסגרות PHP כמו PHP ולארה - פופולריים MVC כדרך להביא קוד מודרני, כמו MView-MoVdels (Moana-Mo-Moana-Moana-ups) ו-Moana-Moana-Moana-Moana-Moana-Models (Moana-Moana-Moana-Models) כמו קוד מודרני, מודל מודרני, מודל מודרני, ו-Moana-Moana-Moana-Moana-Moana-Moana-Models) כמו MVC (Moana-Models) ו-Moana-Models) כמו MVC-Models (Models) כמו MVC-Models (Models) ו-Models) כמו MVC של ימינו, MVC (Models) ו-Models) כמו MVC (Model, MVC-Moana-
לקבלת פרספקטיבה היסטורית עמוקה יותר, ניתן לקרוא על תבנית MVC המקורית על ההרחבה:0WikipediaFLT:1.
היתרונות של שימוש ב- MVC
אימוץ דפוס MVC מציע מספר יתרונות קונקרטיים לפרויקטים לפיתוח אתרים בכל גודל.
הפרדה של דאגות
לכל רכיב יש אחריות יחידה, מוגדרת היטב.מודלים להתמודד עם לוגיקה של נתונים, תצוגות מצגת ובקרים להתמודד עם זרימת היישום.הפרדה זו מקלה על הבנה, שינוי, ומבחן כל חתיכה בבידוד.כאשר באג מופיע, מפתחים יכולים לאתר במהירות את השכבה האחראית ולתקן אותה ללא תופעות לוואי לא מכוונות.
סקלאה
מכיוון שהקוד הוא מודולרי, הוספת תכונות חדשות לעתים קרובות אינה דורשת כתיבת רכיבים קיימים.You יכול להציג בקרים חדשים לאינטראקציות משתמש נוספות או מודלים חדשים עבור סוגים שונים של נתונים תוך שימוש בנוף הקיים.מודולריות זו תומכת בדרגת הפונקציונליות של היישום ואת צוות הפיתוח.
אחריות
מודלים והשקפות ניתן לעתים קרובות להיות בשימוש מחדש על פני חלקים שונים של יישום או אפילו בפרויקטים שונים.לדוגמה, מודל המייצג משתמש יכול לשמש על ידי אימות, פרופיל, ותכונות ניהול.
התפתחות במקביל
צוותים יכולים לעבוד על מודלים, השקפות, ובקרים בו זמנית מבלי לדרוך על הקוד של זה.מפתח חזיתי יכול לבנות ונוף בסגנון בעוד מפתח אחורי כותב את המודל ואת לוגיקה בקר, בתנאי שהם מסכימים על הממשקים (למשל, אילו נתונים ההשקפה צופה). מקבילות זו מאיצה מחזורי פיתוח.
אחריות
מכיוון שהרכיבים מתחדשים באופן רופף, כל יחידה יכולה להיבדק באופן עצמאי.ניתן לבחון שיטות מודל ללא שרת אינטרנט, פעולות בקר מבחן עם מודלים מטוגנים, ובדיקת מבחן הופכת עם נתונים מפוקפקים.זה מוביל לאיכות קוד גבוהה יותר ופחות תוקפנות.
כיצד MVC עובד בפועל
כדי להבין כיצד MVC פועל ביישום אינטרנט אמיתי, בואו עקוב אחר בקשה למשתמש טיפוסי מההתחלה ועד הסוף.חשב יישום בלוג פשוט שבו משתמש לוחץ על קישור כדי להציג מאמר עם מזהה 42.
- המשתמש לוחץ על הקישור (ראה LT:0) והדפדפן שולח בקשה HTTP GET לשרת.
- מנגנון ההסתה של השרת ממפה את כתובת ה-URL לפעולה מסוימת של בקר (למשל, FLT:1).
- שיטת הבקר (FLT:2) מקבלת את הבקשה ומוציאה את התעודה 37 מפרמטרי ה-URL.
- הבקר קורא שיטה על המודל (למשל, FLT 3:3) כדי לאחזר את הנתונים ממסד הנתונים.
- המודל מבצע חיפוש מסד נתונים, מביא את הרשומה, וחוזר אובייקט נתונים (למשל, מקרה של שיעור ה-FLT:4).
- הבקר לוקח את אובייקט הנתונים ומעביר אותו לתצוגה (לדוגמה, קובץ תבנית).
- התצוגה מקבלת את הנתונים והופכת את HTML, תוך הזרקת הכותרת של המאמר, הגוף ותחומים אחרים למקומות המתאימים.
- הבקר שולח את ה-HTML בחזרה כתגובה HTTP לדפדפן של המשתמש.
- הדפדפן מציג את הדף.
זרימה זו אופיינית לקריאה של נתונים.עבור פעולות שמשנות נתונים (למשל, יצירת מאמר חדש), הבקר תוקף את קלט המשתמש, אינטראקציה עם המודל כדי לחסוך או לעדכן את הנתונים, ולאחר מכן מפנה את המשתמש לדף אחר (בדרך כלל על ידי שליחת תגובה HTTP).
שינויים נפוצים של MVC
לאורך השנים, מפתחים הסתגלו MVC כדי להתאים לסביבות שונות ופרדיגמות תכנות.הבנת הבדלים אלה מסייעות בעת עבודה עם מסגרות שונות.
מודל-View-Controller ב- Web Frameworks
רוב מסגרות האינטרנט ליישם גרסה של MVC שבו התצוגה ניתנת לשרת ושלח כמו HTML.In Laravel (PHP), הנוף הוא תבנית Blade. ב Django (Python), זה תבנית Django.ingo. in Laravel (PHP), ה- Django (Python), זה תבנית Django.The Controller במסגרות אלה נקרא לעתים קרובות "ראיית" ב-Django, אשר יכול לגרום לבלבול.
דגם-View-Model (MVVM)
בשימוש במסגרות לפני רצף כמו Angular, Vue, ו- Knockout, MVVM מחליפ את הבקר עם "מודל תצוגה" שיושב בין הנוף לבין המודל.מודל התצוגה מטפל לוגיקה מצגת והנתונים המחייבים, לעתים קרובות באמצעות תכנות תגובתי.הנוף והמודל מציג תקשורת באמצעות נתונים המחייבים, צמצום הצורך בקוד בקר מפורש.תבנית זו מתאימה במיוחד עבור יישומים עשירים של הלקוח, שבו UI צריך שינויים אוטומטיים.
מודל-View-Adapter (MVA)
ידוע גם כתבנית "המצפה", MVA משמש בכמה מסגרות שולחן העבודה.המתאם פועל כמתווך המאפשר את הנוף והמודל לתקשר ללא הפיכה ישירה.תבנית זו היא פחות נפוצה בפיתוח אינטרנט אבל מופיע בכמה מערכות UI מורכבות.
לכל וריאציות יש את החוזקות שלו, אבל הרעיון המרכזי נשאר זהה: אחריות נפרדת כדי להפחית את התלות ולשפר את התחזוקה.
דוגמאות אמיתיות ל- MVC
בואו נסתכל על שתי מסגרות פופולריות ליישם MVC בפועל.
Laravel (PHP)
[ב] ל[ה] ל[ה]], [ה][ה]], [ה] [ה]][ה]]][ה]], [ה][ה]]]], [ה[[המאה ה-1],] היא בדרך כלל שיעור של [[המאה ה-20]], אשר מסייע ל[[המאה ה-20]], ל[[המאה ה-20]], ו[[המאה ה-20]], ו[[המאה ה-20]],]], ו[[המאה ה-20]], [[המאה ה-20]],]], [[המאה ה-20]], [[המאה ה-20]],]], [[1924]], [[המאה ה-20]],]], [[1924]],]],]],]], [[1924]], [[1924]], [[1924]], [[1924]],]], [[1924]], [[1924]], [[ה[[1924]], [[1924]],]],]], [[1924]], [[1924]], [[1924]], [[1924]], [[1924]],]], [[1924]], [[1924]], [[1924]], [[
Django (Pthony)
(ה) , ⁇ (ה) , ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
תפיסות נפוצות על MVC
למרות השימוש הנרחב שלה, MVC הוא לעתים קרובות לא מובן או לא נכון.כאן הם כמה תפיסות מוטעות נפוצות ואת המציאות שמאחוריהם.
(FLT:0Mis Conception 1: MVC הוא רק עבור יישומים באינטרנט.FLT:1 ⁇ FLT:2 בעוד MVC הוא פופולרי מאוד בפיתוח אינטרנט, הוא מקורו תכנות GUI שולחן העבודה, ניתן להשתמש בכל יישום כי היתרונות של הפרדה נתונים, מצגת, ובקרה. יישומי מובייל, יישומים שולחניים, ואפילו כמה כלי פיקוד יכול ליישם MVC או גרסאות שלה.
(FLT:0Mis Conception 2: The View הוא רק תבנית טיפשית.FLT:103:2 ביישוםים רבים, הנוף יכול להכיל לוגיקה מורכבת מפורמטיקה, בעוד שהנוף לא צריך לבצע לוגיקה עסקית או שאילתות מסד נתונים ישיר, זה לעתים קרובות אחראי על ההחלטה כיצד להציג נתונים המבוססים על תפקידו של המשתמש, המכשיר, או על תצורה אחרת של שפות עשיריות מאפשרות לולאות, מצבים, פונקציות, עוזרות, פונקציות.
(FLT:0Mis Conception 3: The בקר הוא אופציונלי או מינימלי.FLT ( 1:1 ⁇ FLT:2 מפתחי מפתח מסוימים מנסים לשים את כל ההיגיון למודלים (גישה "מודל שומן, בקר רזה" או לתוך הנוף. בעוד זה טוב לשמור על בקרים רזה, לחסל אותם לחלוטין מוביל לבלבול לגבי איפה טיפול קלט שייך.
(FLT:0Mis Conception 4: MVC דורש מבנה קובץ ספציפי.FLT: 1:1 ⁇ FLT:2) אין דרך "תיקון" לארגן תיקיות או קבצים שמות שונים לאכוף מוסכמות שונות, אבל ניתן לשמור על הפרדה מושגית ללא קשר בין מודלים, השקפות, ובקרים חיים במדריכים נפרדים או מקובצים על ידי תכונה.
Best Practices for Implementing MVC
כדי להפיק את המרב מ- MVC, בצע את התרגילים הטובים ביותר אלה נגזר משנים של ניסיון בקהילה היזם.
שמור על המודל "Fat" אבל ממוקד
המודל צריך להכיל את כל ההיגיון העסקי הקשור לנתונים שהוא מייצג.זה כולל כללי אימות, מערכות יחסים, תכונות מגובשות, ואפילו כמה שינויים בנתונים.עם זאת, להימנע מקביעת לוגיקה מצגת או קוד ספציפי HTTP (כמו אובייקטים של טיפול) במודל.כלל טוב של אצבע: אם הקוד עוסק במושג (למשל, "למאמר יש 10 תגים מקסימליים), אם הוא שייך לתבנית לוגית או להגדרה.
שמור על הבקר "Skinny"
בקר צריך רק לתזזז את הזרם.זה צריך לקרוא קלט מן הבקשה, להתקשר שיטות המודל המתאים, ולהחזיר תגובה.הימנע לשים לוגיקה אימות, שאילתות מסד נתונים, או כללים עסקיים מורכבים בבקר.אם אתה מוצא את שיטת הבקר שלך מעל 15-20 שורות קוד, לשקול מחדש על ידי העברת לוגיקה לתוך שיטות מודל, כיתות שירות, או קוהר.
השתמש במודלים תצוגה או מציגים עבור תצוגות מורכבות
כאשר תצוגה צריכה לשלב נתונים ממודלים מרובים או לבצע פורמט משמעותי, ליצור מודל תצוגה ייעודי או כיתה נוכחית.אובייקט זה מכין בדיוק את הנתונים שהתבנית צריכה, שמירה על התבנית נקייה והבקר פשוט.פרקטיקה זו נפוצה ב-ASP.NET MVC ובמסגרות PHP כמו לארהvel עם חבילות תמיכה מלחינים.
פיזור תלותי הזרקת
מסגרות MVC מודרניות לתמוך הזרקת התלות, המאפשרת לבקרים ולמודלים לקבל את המהימנות שלהם (למשל, חיבורי מסד נתונים, שירותי כניסה) מבלי ליצור אותם ישירות. השתמש בכך כדי לשפר את יכולת הבדיקה והגמישות.לדוגמה, להזריק ממשק חסימה במקום להשתמש במודל ישירות, כך שתוכל לעבור בין מסד נתונים אמיתי לבין חנות לאזכרון עבור בדיקות.
עקבו אחרי Singleאחריות
לכל מחלקה צריכה להיות סיבה אחת לשנות.ב- MVC, העיקרון הזה מחזק את ההפרדה: המודל משתנה כאשר חוקי הנתונים משתנים, הנוף משתנה כאשר הפריסה UI משתנה, והבקר משתנה כאשר היישום זורם שינויים.
מתי לא להשתמש ב- MVC
בעוד MVC הוא דפוס חזק, זה לא מתאים לכל פרויקט.חשב חלופות בתרחישים הבאים:
- (FLT:0) יישומים פשוטים מאודFLT:1 עם רק כמה דפים ולוגיקה מינימלית לא יכול ליהנות מראש של מבנה MVC מלא.
- (FLT:0) בזמן אמת, מערכות מונעות אירועים 1LT (למשל, יישומי צ'אט, חי לוחות מחוונים) נהנים לעתים קרובות מתבניות תגובתיות כמו תבנית ה- Observer או מודל השחקן, שבו המדינה משנה את propagate באופן אוטומטי ללא בקר מרכזי.
- (FLT:0Microservices Architectss Architects) 1Ever (בקיצור:0) לפעמים לשבור את תבנית MVC ברמת השירות.כל מיקרו-שירות עשוי לטפל בנתונים ובלוגיקה שלו, אך התקשורת בין-שירות עשויה לא להתאים באופן מסודר לגבולות בקרת מודלים.במקרים כאלה, אדריכלות מוכוונת שירות עם ממשקי API מוגדרים היטב עובדת לעתים קרובות טוב יותר.
- (FLT:0) יישומי JavaScript המלא-סטק 1FLT (FLT:1), שמשתמשים בהוראות של לקוחות לצד הלקוח לעתים קרובות לאמץ דפוסים כגון Flux או Redux, שהם יותר מרכזיים ועוקיים מאשר MVC מסורתי, בעוד אתה עדיין יכול להשתמש MVC בצד השרת, הצד הלקוח מעדיף זרימה שונה.
מסקנה
דפוס MVC יש עם יתר על המידה את המבחן של זמן כי זה מתייחס לאתגר בסיסי בהנדסה תוכנה: כיצד לנהל מורכבות על ידי הפרדה חששות. על ידי חלוקת יישום מודלים, תצוגות, בקרים, מפתחים יכולים לבנות יישומי אינטרנט שהם מאורגנים יותר, מדרגים, ושמירה על ההבנה כיצד כל רכיב אינטראקציה, וכיצד ליישם שינויים כגון MVT או MVVMV, מצייד אותך לעבוד ביעילות עם קוד חדש או פיתוח.