תבנית עיצוב

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

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

## עקרונות מאחורי תבניות עיצוב
ברוב תבניות העיצוב נעשה שימוש נרחב בעקרונות תכנות מונחה עצמים ו- SOLID כמו פולימורפיזם ועקרון פתיחות/סגירות.

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

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

## היסטוריה
מקורן של תבניות העיצוב הוא מתחום הארכיטקטורה. כריסטופר אלכסנדר, ארכיטקט במקצועו, הוציא בשנת 1977 ספר ובו הגדיר באופן פורמלי 253 בעיות מוכרות מעולם הארכיטקטורה ולהן פתרונות מופשטים.
עשר שנים מאוחר יותר ב-1987 השתעשעו קנט בק ווורד קנינגהם ברעיון של השמה של תבניות עיצוב לעולם התכנות, הם הציגו את תוצאותיהם בוועידת OOPSLA. בנוסף הם פיתחו יחד תבנית עיצוב לעיבוד קרניים גרפיות בשפת Smalltalk.

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

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

בין התבניות העיקריות שתועדו בספר:
* תבנית Singleton
* תבנית Factory Method
* תבנית ProtoType
* תבנית Command
* תבנית Strategy

## תיעוד
שמאל|ממוזער|250px|דוגמה של תרשים UML של מחלקה המממשת את תבנית Singleton
הגדרת תבנית עיצוב תכיל את הפרמטרים הבאים:
***שם** תבנית העיצוב וסיווגה
*תיאור מופשט של **הבעיה** אותה תבנית העיצוב נועדה לפתור
*הצגת **הפתרון** בצורה מורחבת הכוללת תרשים OMT (Object Modeling Technique) או UML (Unified Modeling Language).
***תוצאות** והשלכות של יישום הפתרון המוצע

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

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

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

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

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

## תבניות עיצוב נפוצות
באופן כללי, ניתן לחלק את התבניות לשלושה סוגים:

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

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

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

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

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

* Design Pattern  – מדיה ומימושים בנושא תבניות עיצוב 
* Design Pattern Blog -  בלוג עם הסברים מעמיקים ומעשיים לעבודה נכונה עם תבניות עיצוב (עברית)
* Inversion of Control
* דב זילברמן, Design Patterns, הסדרה "תבניות" וסרטונים נוספים
* תכנות מונחה עצמים

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

קטגוריה:הנדסת תוכנה
קטגוריה:פיתוח תוכנה
*