עקרון פתיחות/סגירות

בתכנות מונחה-עצמים, עקרון פתיחות/סגירות (באנגלית: Open/Closed Principle ובקיצור OCP) הוא עיקרון בעיצוב תוכנה, הקובע כי על רכיב תוכנה להיות "פתוח" ו"סגור" בכל רגע נתון. כלומר, הרכיב צריך לאפשר את הרחבתו (פתיחות) ובה-בעת לא לאפשר שינויים בו, מלבד דרך ההרחבות (סגירות). אם נרצה להרחיב את הרכיב בפונקציונליות נוספת, נוכל לעשות זאת ללא שום שינוי ברכיב עצמו. שמירה על עיקרון זה מבטיחה פיתוח יעיל הלוקח בחשבון תוספות עתידיות.

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

 עקרון הפתיחות/סגירות של מאייר 
המונח "עקרון פתיחות/סגירות" הופיע לראשונה בספרו של ברטרנד מאייר "Object-Oriented Software Construction", משנת 1988.

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

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

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

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

מאמרו של רוברט סי מרטין מ-1996 "The Open-Closed Principle" היה אחד הכתבים המכריעים שנקטו גישה זו. בשנת 2001 קרייג לרמן קשר את עקרון ה"פתיחות/סגירות" לעיקרון של אליסטר קוקבורן שנקרא Protected Variations, ולדיון של דייוויד פרנס על הסתרת מידע.

ראו גם
 SOLID (עיצוב מונחה עצמים)

 הערות שוליים 

קטגוריה:תכנות
קטגוריה:תכנות מונחה-עצמים
קטגוריה:הנדסת תוכנה
קטגוריה:עקרונות בתכנות