Menu
Coddy logo textTech

פתוח-סגור

שיעור 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. אפשר לקרוא עוד כאן

challenge icon

אתגר

בינוני

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

  1. צור מחלקה מופשטת TxtConvertor
  2. צור מחלקות 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 אונליין