Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

نمط طريقة القالب

جزء من قسم البرمجة كائنية التوجه في رحلة Python على Coddy. الدرس 52 من 64.

يُحدِّد نمط طريقة القالب الهيكلَ الأساسي لخوارزمية في فئة أساسية، مما يتيح للفئات الفرعية تجاوز خطوات محددة دون تغيير بنية الخوارزمية.

إليك فئة أساسية تحتوي على طريقة قالب:

class DataProcessor:
    def process(self):
        """طريقة القالب التي تحدد بنية الخوارزمية"""
        self.read_data()
        self.process_data()
        self.save_data()
    
    def read_data(self):
        print("Reading data...")
    
    def process_data(self):
        raise NotImplementedError("Subclasses must implement this")
    
    def save_data(self):
        print("Saving data...")

تُعرِّف طريقة القالب process() خطوات الخوارزمية، بينما تُترك process_data() للفئات الفرعية لتنفيذها.

أنشئ فئات ملموسة تطبّق الطريقة المجرّدة:

class CSVProcessor(DataProcessor):
    def process_data(self):
        print("Processing CSV data")

class JSONProcessor(DataProcessor):
    def process_data(self):
        print("Processing JSON data")

يوفّر كل صنف ملموس تنفيذه الخاص للخطوة المطلوبة.

استخدم طريقة القالب:

csv_processor = CSVProcessor()
csv_processor.process()

print()  # سطر فارغ

json_processor = JSONProcessor()
json_processor.process()

أنشئ مثالًا آخر باستخدام قالب لعبة:

class Game:
    def play(self):
        """طريقة القالب للعب لعبة"""
        self.start_game()
        self.play_game()
        self.end_game()
    
    def start_game(self):
        print("Game started!")
    
    def play_game(self):
        raise NotImplementedError("Define the game rules")
    
    def end_game(self):
        print("Game ended!")

class Chess(Game):
    def play_game(self):
        print("Playing chess - thinking strategically...")

class Soccer(Game):
    def play_game(self):
        print("Playing soccer - running and kicking...")

chess = Chess()
chess.play()

الناتج:

Reading data...
Processing CSV data
Saving data...

Reading data...
Processing JSON data
Saving data...
Game started!
Playing chess - thinking strategically...
Game ended!

النقطة الأساسية: يحدّد نمط طريقة القالب بنية خوارزمية مشتركة في الفئة الأصلية، مع السماح للفئات الفرعية بتخصيص خطوات محددة. تتحكّم الفئة الأصلية في التدفق العام، بينما توفّر الفئات الفرعية التطبيقات المحددة. ويضمن ذلك بنية متسقة مع إتاحة المرونة في الخطوات الفردية.

challenge icon

التحدي

متوسط

نفّذ نمط طريقة القالب في template.py. يمتلك الصنف المجرّد Report طريقة القالب generate()، التي تشغّل دائمًا الخطوات الثلاث نفسها بالترتيب نفسه: header()، body()، footer().

  • تُستخدم header() من قِبل كل تقرير، وتطبع === Report ===.
  • body() مجرّدة: يطبع كل صنف فرعي المحتوى الخاص به.
  • footer() نقطة تمديد ذات قيمة افتراضية هي === End ===، ويمكن للصنف الفرعي تجاوزها.

ثم اكتب التقريرين الفعليين:

  • يخزّن SalesReport(total) الإجمالي في self._total ويطبع Total sales: {total} في جسمه.
  • يخزّن InventoryReport(items) القائمة في self._items، ويطبع Item: {item} لكل عنصر في جسمه، ويتجاوز التذييل ليطبع === {count} items ===.

الملف driver.py مقفول: فهو ينشئ التقارير ويستدعي generate() عليها. تختلف الخطوات فقط بين الأصناف الفرعية؛ أما ترتيب الخطوات فيوجد مرة واحدة في الصنف الأساسي.

جرّب بنفسك

from template import SalesReport, InventoryReport

# معالج حالة الاختبار (لا تُغيّر)
test_case = input()

if test_case == "sales_test":
    SalesReport(1500).generate()
elif test_case == "inventory_test":
    InventoryReport(["Laptop", "Mouse"]).generate()
elif test_case == "both_test":
    for report in [SalesReport(200), InventoryReport(["Pen"])]:
        report.generate()
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Python عبر الإنترنت