פתוח-סגור
שיעור 23 מתוך 28 בקורס קוד נקי – כתיבת קוד טוב יותר באמצעות Python של Coddy.
"ישויות תוכנה צריכות להיות פתוחות להרחבה, אך סגורות לשינוי."
העיקרון קובע שכל פונקציה, מודול או מחלקה צריכים לאפשר הרחבה של ההתנהגות שלהם בלי לשנות את הקוד עצמו.
נניח שיש לנו מחלקה TxtConvertor שממירה קובץ txt ל-json או ל-xml,
class TxtConvertor:
def convert_to_json(self, file):
print("converts file to json")
def convert_to_xml(self, file):
print("converts file to xml")המבנה הזה מפר את עקרון הפתוח-סגור.
למה?
לדוגמה, אם נרצה להוסיף תמיכה בהמרת קובץ txt ל-html, נצטרך לשנות את המחלקה הקיימת (ובכך להפר את עקרון הסגור).
אז מה כדאי לעשות?
בדוגמה הזאת, פתרון אחד יכול להיות יצירת מחלקה מופשטת שתחזיק את הפונקציה הראשית,
from abc import ABC, abstractmethod
class TxtConvertor(ABC):
@abstractmethod
def convert(self, file):
pass
class TxtConvertorToJson(TxtConvertor):
...
.
.
.הספרייה
abcתומכת במחלקות בסיס מופשטות ב-Python. אפשר לקרוא עוד כאן
אתגר
בינוניהמשימה שלך היא לשנות את הדוגמה הנתונה כך שתחיל את עקרון הפתוח-סגור , ולהוסיף ממיר שיתמוך בהמרה מ-txt ל-html.
- צור מחלקה מופשטת
TxtConvertor - צור מחלקות
TxtConvertorToJson,TxtConvertorToXML,TxtConvertorToHTMLשיירשו מ-TxtConvertorויממשו את הממירים (כמו בדוגמה שלמעלה)
נסו בעצמכם
class TxtConvertor:
def convert_to_json(self, file):
print("converts file to json")
def convert_to_xml(self, file):
print("converts file to xml")כל השיעורים ביחידה קוד נקי – כתיבת קוד טוב יותר באמצעות Python
תרגלו בעצמכם: קומפיילר Python אונליין