עקרון פתוח / סגור בג'אווה

1. סקירה כללית

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

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

2. עקרון פתוח / סגור

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

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

2.1. לא תואם

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

קודם כל נגדיר ממשק ברמה העליונה - מחשבון פעולה:

ממשק ציבורי CalculatorOperation {}

בואו נגדיר חיבור מחלקה, שתוסיף שני מספרים ותיישם את Cאלקולטור פעולה:

מחלקה ציבורית מיישמת תוספת CalculatorOperation {כפול פרטי משמאל; זכות כפולה פרטית; תוצאה כפולה פרטית = 0.0; תוספת ציבורית (כפול שמאל, כפול ימינה) {this.left = שמאל; this.right = ימין; } // גטרים וקובעים}

נכון לעכשיו, יש לנו רק כיתה אחת חיבור, אז עלינו להגדיר מחלקה אחרת בשם חִסוּר:

יישומי חיסור בכיתה ציבורית מיישמים CalculatorOperation {פרטי כפול שמאל; זכות כפולה פרטית; תוצאה כפולה פרטית = 0.0; חיסור ציבורי (כפול שמאל, כפול ימינה) {this.left = שמאל; this.right = ימין; } // גטרים וקובעים}

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

מחלקת מחלקה ציבורית {חישוב חלל ציבורי (פעולת CalculatorOperation) {if (operation == null) {זרוק InvalidParameterException חדש ("לא יכול לבצע פעולה"); } אם (פעולת מופע תוספת) פעולת {תוספת תוספת = (תוספת); addition.setResult (addition.getLeft () + addition.getRight ()); } אחר אם (פעולת מופע של חיסור) {חיסור חיסור = (חיסור) פעולה; subtraction.setResult (subtraction.getLeft () - subtraction.getRight ()); }}}

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

לפיכך, אנו יכולים לומר שקוד זה אינו תואם OCP.

2.2. תואם OCP

כפי שראינו יישום המחשבון שלנו עדיין לא תואם ל- OCP. הקוד ב- לחשב השיטה תשתנה עם כל בקשת תמיכה חדשה להפעלה. אז עלינו לחלץ את הקוד הזה ולשים אותו בשכבת הפשטה.

אחד הפתרונות הוא להאציל כל פעולה למחלקה שלהם:

ממשק ציבורי CalculatorOperation {void perform (); }

כתוצאה מכך, חיבור class יכול ליישם את ההיגיון של הוספת שני מספרים:

מחלקה ציבורית מיישמת תוספת CalculatorOperation {כפול פרטי משמאל; זכות כפולה פרטית; תוצאה כפולה פרטית; // בונה, גטרים וקובעים @ ביטול ציבורי בטל () {תוצאה = שמאל + ימין; }}

כמו כן, עודכן חִסוּר לכיתה תהיה הגיון דומה. ובדומה חיבור ו חִסוּר, כבקשת שינוי חדשה, נוכל ליישם את חֲלוּקָה הִגָיוֹן:

המחלקה הציבורית מחלקה מיישמת CalculatorOperation {פרטי כפול שמאל; זכות כפולה פרטית; תוצאה כפולה פרטית; // בונה, גטרים וקובעים @ ביטול ציבורי בטל ביצוע () {if (right! = 0) {result = left / right; }}}

ולבסוף, שלנו מַחשְׁבוֹן class לא צריך ליישם היגיון חדש כאשר אנו מציגים מפעילים חדשים:

מחלקת מחלקה ציבורית {public void calculator (CalculatorOperation operation) {if (operation == null) {throw new InvalidParameterException ("אין אפשרות לבצע פעולה"); } operation.perform (); }} 

ככה הכיתה היא סָגוּר לשינוי אבל לִפְתוֹחַ להארכה.

3. מסקנה

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

כמו תמיד, הקוד זמין ב- GitHub.