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

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

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

يحدّد نمط Template Method الهيكل الأساسي لخوارزمية في الفئة الأساسية، مما يتيح للفئات الفرعية تجاوز خطوات محددة دون تغيير البنية العامة. تتحكّم الفئة الأساسية في سير العمل، بينما تخصّص الفئات الفرعية الخطوات الفردية.

يستخدم هذا النمط الوراثة: يعرّف الصنف abstract طريقة قالب تستدعي سلسلة من الخطوات، بعضها abstract (ويجب أن تنفذها الأصناف الفرعية) وبعضها الآخر له تطبيقات افتراضية:

abstract class DataProcessor {
  // طريقة القالب - تحدد هيكل الخوارزمية
  void process() {
    readData();
    processData();
    saveData();
  }

  void readData();      // مجردة - يجب على الفئات الفرعية تنفيذها
  void processData();   // مجردة - يجب على الفئات الفرعية تنفيذها

  void saveData() {     // التنفيذ الافتراضي
    print('Data saved to database');
  }
}

class CsvProcessor extends DataProcessor {
  @override
  void readData() => print('Reading CSV file');

  @override
  void processData() => print('Parsing CSV rows');
}

class JsonProcessor extends DataProcessor {
  @override
  void readData() => print('Reading JSON file');

  @override
  void processData() => print('Parsing JSON objects');

  @override
  void saveData() => print('Saved to cloud storage');
}

void main() {
  var csv = CsvProcessor();
  csv.process();
  // قراءة ملف CSV
  // تحليل صفوف CSV
  // تم حفظ البيانات في قاعدة البيانات

  var json = JsonProcessor();
  json.process();
  // قراءة ملف JSON
  // تحليل كائنات JSON
  // تم الحفظ في التخزين السحابي
}

طريقة process() هي القالب - فهي defines ترتيب العمليات. تنفّذ الفئات الفرعية readData() وprocessData() بطريقة مختلفة، ويمكنها اختياريًا تجاوز saveData(). وتتمثل الفائدة الأساسية في أن بنية algorithm تظل متسقة عبر جميع عمليات implement، مع السماح بالمرونة في الخطوات الفردية.

challenge icon

التحدي

سهل

لنبنِ نظامًا لتوليد التقارير باستخدام نمط Template Method! ستنشئ إطارًا تتبع فيه أنواع مختلفة من التقارير البنية العامة نفسها، لكن يخصص كل نوع من التقارير خطوات محددة مثل جمع البيانات وتنسيق الناتج.

ستنظم التعليمات البرمجية في ملفين:

  • report_generator.dart: يحتوي هذا الملف على الفئة الأساسية abstract وتنفيذات التقارير Concrete. أنشئ فئة abstract باسم ReportGenerator مع method قالب تُسمى generate() وتحدد سير عمل توليد التقرير بهذا الترتيب: fetchData()، وanalyzeData()، وformatReport()، وdeliver(). يجب أن تكون methodا fetchData() وformatReport() abstract (يتعامل كل نوع من التقارير معهما بشكل differently)، بينما يجب أن تطبع analyzeData() القيمة Analyzing data...، وأن تطبع deliver() القيمة Report delivered via email. بوصفهما تنفيذين Default. ثم أنشئ فئتي تقارير Concrete:
    • SalesReport - تطبع fetchData() الخاصة بها Fetching sales data from database...، وتطبع formatReport() الخاصة بها Formatting as bar charts and tables.
    • InventoryReport - تطبع fetchData() الخاصة بها Fetching inventory levels from warehouse...، وتطبع formatReport() الخاصة بها Formatting as inventory list.، كما تتجاوز deliver() لتطبع Report sent to warehouse manager.
  • main.dart: استورد file الخاص بمولّد التقارير ووضّح كيف يحافظ نمط Template Method على اتساق بنية algorithm مع السماح بالتخصيص. أنشئ كائنًا من SalesReport واستدعِ method generate() الخاصة به. ثم اطبع سطرًا empty للفصل. أنشئ كائنًا من InventoryReport واستدعِ method generate() الخاصة به أيضًا.

لاحظ كيف يتبع كلا التقريرين العملية نفسها المكوّنة من أربع خطوات، لكن كلًّا منهما يخصص الخطوات المهمة لغرضه المحدد. بل إن InventoryReport يتجاوز method التسليم Default لإرسال التقارير إلى مستلم مختلف!

الناتج المتوقع:

Fetching sales data from database...
Analyzing data...
Formatting as bar charts and tables.
Report delivered via email.

Fetching inventory levels from warehouse...
Analyzing data...
Formatting as inventory list.
Report sent to warehouse manager.

جرّب بنفسك

import 'report_generator.dart';

void main() {
  // TODO: أنشئ SalesReport واستدعِ method generate() الخاصة به

  // TODO: اطبع سطرًا فارغًا للفصل

  // TODO: أنشئ InventoryReport واستدعِ method generate() الخاصة به
}
quiz iconاختبر نفسك

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

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

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