תבנית עיצוב

מתוך ויקיפדיה, האנציקלופדיה החופשית
קפיצה אל: ניווט, חיפוש
Gnome-edit-clear.svg ערך זה זקוק לעריכה: ייתכן שהערך סובל מפגמים טכניים כגון מיעוט קישורים פנימיים, סגנון טעון שיפור או צורך בהגהה, או שיש לעצב אותו.
אתם מוזמנים לסייע ולתקן את הבעיות, אך אנא אל תורידו את ההודעה כל עוד לא תוקן הדף. אם אתם סבורים כי אין בדף בעיה, ניתן לציין זאת בדף השיחה.

בהנדסת תוכנה, תבנית עיצובאנגלית: Design pattern) היא פתרון כללי לבעיה שכיחה בעיצוב תוכנה. תבנית עיצוב אינה עיצוב סופי שניתן להעבירו הישר לקוד, אלא תיאור או תבנית לדרך לפתרון בעיה, שעשויה להיות שימושית במצבים רבים. תבניות עיצוב מונחות עצמים מציגות לרוב יחסים וקשרי גומלין בין מחלקות או אובייקטים, בלי לפרט את המחלקות או אובייקטי היישום הסופיים המעורבים. אלגוריתמים אינם נחשבים כתבנית עיצוב, כיוון שהם פותרים בעיות חישוביות ולא בעיות עיצוב.[1]

תוכן עניינים

עקרונות מאחורי תבניות עיצוב [עריכה]

ברוב תבניות העיצוב נעשה שימוש במספר רעיונות: OCP - Open Closed Principle (עיקרון הפתיחות להרחבה והסגירות לשינויים), ו- ISP - Interface Segregation Principle (עיקרון הפרדת הממשקים).

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

בהיבט רחב יותר ניתן למצוא שילובים של תבניות עיצוב היכולים להיחשב כתבניות ארכיטקטורה משום שהם משפיעים על ההיבט הארכיטקטוני של התוכנה הנכתבת מעבר לסוגיית עיצוב תוכנה מקומית. [2] דוגמה לשילוב נודע מסוג זה היא תבנית ה-Model-View-Controller.

היסטוריה [עריכה]

  • בשנת 1987 קנט בק ווורד קנינגהם עיצבו יחד תבנית עיצוב לעיבוד קרניים גרפיות בשפת Smalltalk.
  • בשנת 1988 אריך גמא התחיל לכתוב עבודת מחקר לדוקטורט באונברסיטת ציריך בנושא "קווים כלליים לעיבוד תוכנה".
  • בשנת 1991 לאחר עבודת מחקר שארכה כשנתיים הוציא ג'יימס קופלין ספר בשם "Advanced C++ Idioms" - המכיל מגוון דוגמאות לפתרון בעיות שונות בתכנות ב C++.

GoF [עריכה]

Gang of Four או GoF (כנופיית הארבעה) הוא כינוי שניתן לאריך גמא, ריצ'רד הלם, רלף ג'ונסון וג'ון ויליסידס, מחברי הספר: Design Patterns - Elements of Reusable Object-Oriented Software. (שמם שאול מכנופיית הארבעה הסינית). ספרם שיצא ב-1994 היה הראשון שאסף ותיעד באופן מעמיק תבניות עיצוב.

עשרים ושתיים תבניות העיצוב שהופיעו בספר הפכו עם השנים לתבניות העיצוב המוכרות ביותר והיוו בסיס לכל ידע נוסף שנצבר בתחום תבניות העיצוב.

בין התבניות העיקריות שתועדו:

תיעוד [עריכה]

דוגמה של תרשים UML של מחלקה המממשת את תבנית Singleton

הגדרת תבנית עיצוב תכיל את הפרמטרים הבאים:

  • שם וסיווג
  • תאור הבעיה
  • הצגת הפתרון בצורה מורחבת
  • תרשים OMT‏ (Object Modeling Technique) או UML‏ (Unified Modeling Language).

דוגמה [עריכה]

  • שם = תבנית Singleton, תבנית יצירה
  • בעיה = יש צורך במופע יחיד של מחלקה.
  • פתרון = הגדרת בנית המחלקה רק בתוכה והחצנת פונקציה שרק בקריאה הראשונה אליה תיצור מופע של המחלקה (ראו פרוט בערך עצמו).

יתרונות [עריכה]

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

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

התנגדות [עריכה]

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

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

במהלך ההתפתחות של תבניות העיצוב הוגדרו גם תבניות אשר מציעות כביכול פתרון לבעיה מסוימת, אך הפתרון המוצע הוא רע, ואינו מציג דרך נכונה להתמודדות עם הבעיה. תבניות אלו נקראות Anti Pattern. יש הטוענים שגם בין תבניות העיצוב המקובלות כמומלצות קיימות תבניות שאינן מספקות פתרון טוב לבעיה ומהוות Anti Pattern. דוגמה לתבנית כזאת היא התבנית Singleton אשר מצד אחד מקובלת על מתכנתים רבים כאחת התבניות הטובות ביותר ולדעת אחרים היא Anti Pattern. דעות סותרות אלו מראות שהסתמכות בעיינים עצומות על תבניות מוגדרות מוטעית מיסודה ויכולה לגרום לטעויות שתעלנה ביוקר הן מבחינת זמן והן מבחינת משאבים ותקציב. [3]

תבניות עיצוב נפוצות [עריכה]

ניתן לחלק את התבניות בגדול לשלושה סוגים:[4]

  • תבניות יצירה
  • תבניות מבנה
  • תבניות התנהגות
שם התבנית תיאור UML
תבניות יצירה
תבנית Abstract Factory "בית חרושת ליצירת אובייקטים" - ממשק המשמש ליצירת אובייקטים תלויים, ללא ציון המחלקות הנוצרות. Abstract Factory
תבנית Factory Method יצירת עצמים ללא הכרה של המחלקות שלהם, ניתן יכולות למחלקות יורשות לדרוס את השיטה שהממשק חושף עם שיטה משלהם, וכך ליצור את הטיפוס שנדרש. Factory Method
תבנית Builder הפרדת יצירת האובייקט מיצוגו, באובייקטים מורכבים. כך ניתן להשתמש באותו תהליך יצירה ליצירת אובייקטים שונים. Builder
תבנית Lazy initialization "איתחול עצל" - טקטיקה המאפשרת שליטה על ביזבוז משאבים, חישוב הזמן המתאים ליצירת האובייקט בפועל רק לזמן שחייבים אותו, תוך התחשבות בתהליכים השונים והכרעה איזה תהליך "יקר" יותר.
תבנית Object pool שחרור משאבים על ידי מחזור אובייקטים שאינם בשימוש.
תבנית Prototype הגדרת אבטיפוס של אובייקטים ויצירת אובייקטים חדשים כהעתק שלו. Prototype
תבנית Singleton הגדרת נקודת כניסה יחידה לאובייקט לשם הקצאת מופע יחיד של האובייקט בזיכרון. Singleton
תבנית Multiton יצירת מצב בו במחלקה יש רק מופעים בעלי שם (לא מצביעים), וסיפוק נקודת גישה גלובלית אליהם.
תבנית Resource acquisition is initialization הבטחת תוחלת חיים נכונה של אובייקטים, לשם ניהול מושכל של המשאבים.
תבניות מבנה
תבנית Adapter יצירת שיתוף פעולה בין מחלקות על ידי המרה נכונה בין הממשק המתקבל לממשק המצופה. Adapter
תבנית Bridge "גשר" - יצירת חוסר תלות בין ממשק למימוש, על ידי הפרדה מוחלטת ביניהם. Bridge
תבנית Composite גיבוש אובייקטים למבנה היררכי של עץ, איפשור התייחסות לאובייקטים כאובייקטים עצמאיים או באופן אחיד לצרוף של אובייקטים. Composite
תבנית Decorator הוספת אחריויות נוספות לאובייקט באופן דינמי תוך שמירה על אותו הממשק. Decorator משמש כחלופה גמישה לתת מחלקה כדי להרחיב פונקציונליות. Decorator
Facade מאפשר ממשק אחיד לאוסף של ממשקים בתת-מערכת. Facade מגדיר ממשק ברמה גבוהה יותר המאפשר שימוש קל בתת-מערכת. Facade
Flyweight שימוש בשיתוף כדי לתמוך במספר אובייקטים כדי לחסוך בזיכרון. Flyweight
Proxy מאפשר לשלוט בגישה לאובייקט אחר. Proxy
תבניות התנהגות
Chain of responsibility מניעת קשר בין השולח של בקשה למקבל שלה על ידי כך שיותר מאובייקט אחד יוכל לטפל בבקשה. שרשור האובייקטים המקבלים והעברת הבקשה לאורך השרשרת עד שאובייקט מטפל בה.
Command כימוס של בקשה כאובייקט, ובצורה זו מאפשרת להעביר למקבלים בקשות שונות, להכניס בקשות לתור או לרשום אותן ללוג, ולתמוך בביטול פעולות. Command
Interpreter בהינתן שפה, מגדיר ייצוג של הדקדוק שלה יחד עם מפרש שמשתמש בייצוג כדי לפרש את המשפטים של השפה.
Iterator דרך לגשת ברצף לאלמנטים באובייקט המורכב מאוסף של אלמנטים בלי לחשוף את המבנה הפנימי שלו.
Mediator מגדיר אובייקט שמכמס את האופן שבו אוסף של אובייקטים מתקשרים. התבנית תומכת בצימוד רפוי, בכך שאובייקטים לא מצביעים אחד לשני באופן ישיר, אלא למתווך (Mediator), ובכך ניתן לשנות את האינטרקציה שלהם באופן עצמאי.
Memento ללא פגיעה בכימוס, תפיסה וייחצון של המצב הפנימי של אובייקט, כך שהאובייקט יוכל להיות משוחזר למצב זה מאוחר יותר.
Null Object משמש כברירת מחדל לאובייקט, ובכך מונע את הצורך לוודא שהאובייקט אינו null לפני שימוש בו.
Observer מגדיר תלות של אחד לרבים בין אובייקטים, כך ש שכאשר אובייקט אחד משנה את מצבו, כל התלויים בו מיודעים על השינוי ומתעדכנים אוטומטית.
Blackboard Observer כללי המאפשר מספר קוראים וכותבים. המידע משותף לרוחב המערכת.
State מאפשר לאובייקט לשנות את התנהגות כאשר מצבו הפנימי משתנה. האובייקט ישנה את המחלקה שבה הוא משתמש.
Strategy מגדיר משפחה של אלגוריתמים, מכמס כל אחד מהם, ומאפשר להחליף את השימוש בהם. ניתן לשנות את האלגוריתם באופן עצמאי בלי תלות במשתמשים במחלקה.
Specification צירוף לוגיקה עסקית בצורה בוליאנית (לא, או, וגם).
Template method מגדיר שלד של אלגוריתם בפעולה, ומפנה חלק מן הצעדים לתת מחלקות. כך תת-מחלקות יכולות להגדיר מחדש צעדים מסוימים של האלגוריתם, ללא שינוי של המבנה שלו.
Visitor מייצג פעולה לביצוע על האלמנטים של מבנה האובייקט. בכך מאפשרת התבנית להגדיר פעולה חדשה ללא צורך לשנות את המחלקות של האלמנטים שעליהם היא מבוצעת.

התבנית Inversion of control אשר מאפשרת הזרקה של אובייקטים מתאימים בשלב ההרצה משמשת כתבנית הבסיסית למערכת התשתית הנפוצה Spring.

קישורים חיצוניים [עריכה]

הערות שוליים [עריכה]

  1. ^ תבניות עיצוב למתחילים (Design patterns for dummies), ספר מאת ברברה פורצ'ייס, סטיבן הולצ'נר
  2. ^ ספר מאת ראלף ג'ונסון, אריק גאמה וריצ'רד הלם | Design Patterns: Elements of Reusable Object-Oriented Software
  3. ^ | Patterns versus antipatterns
  4. ^ [1], מדריך לתבניות עיצוב וסוגן