الوسائط المسماة
جزء من قسم Object Oriented Programming في رحلة C# على Coddy — الدرس 49 من 70.
تتيح لك الوسائط المسماة (Named arguments) تحديد المعامل الذي يتلقى القيمة باستخدام اسمه، بدلاً من الاعتماد على الموضع. وهذا يجعل استدعاءات الدوال أكثر وضوحاً ويسمح لك بتمرير الوسائط بأي ترتيب.
استخدم اسم المعلمة متبوعاً بنقطتين قبل القيمة:
public static void CreateUser(string name, int age, bool isActive)
{
Console.WriteLine($"{name}, Age: {age}, Active: {isActive}");
}
// استخدام الوسائط المسماة
CreateUser(name: "Alice", age: 25, isActive: true);
CreateUser(age: 30, isActive: false, name: "Bob"); // أي ترتيب يعملتبرز أهمية الوسائط المسماة (Named arguments) عند دمجها مع المعلمات الاختيارية. فبدلاً من توفير جميع القيم الاختيارية السابقة، يمكنك الانتقال مباشرة إلى القيمة التي تحتاجها:
public static void Configure(string host, int port = 8080, bool useSSL = false, int timeout = 30)
{
Console.WriteLine($"{host}:{port}, SSL: {useSSL}, Timeout: {timeout}");
}
// تخطي port و useSSL، وتحديد timeout فقط
Configure("localhost", timeout: 60);
Configure("server.com", useSSL: true);يمكنك المزج بين الوسائط الموضعية (positional arguments) والوسائط المسماة (named arguments)، ولكن يجب أن تأتي الوسائط الموضعية أولاً. تعمل الوسائط المسماة على تحسين قابلية القراءة، خاصة بالنسبة للدوال (methods) التي تحتوي على معلمات متعددة من نفس النوع أو الأعلام المنطقية (boolean flags) حيث لا يكون المعنى واضحاً من القيمة وحدها.
التحدي
سهللنقم ببناء مولد تقارير يستفيد من الوسائط المسماة (named arguments) لجعل استدعاءات الدوال واضحة تماماً. عندما تحتوي الدوال على معلمات متعددة - خاصة تلك التي من نفس النوع أو الأعلام المنطقية (boolean flags) - تجعل الوسائط المسماة كودك يوثق نفسه بنفسه.
ستقوم بتنظيم الكود الخاص بك عبر ملفين:
ReportGenerator.cs: أنشئ فئةReportGeneratorفي مساحة الأسماءReportsمع دالة تحتوي على عدة معلمات اختيارية:GenerateReport(string title, string author = "Anonymous", bool includeHeader = true, bool includeSummary = false, int maxPages = 10)- يجب أن تعيد هذه الدالة سلسلة نصية منسقة تصف تكوين التقرير
- التنسيق:
Report: {title} by {author} | Header: {Yes/No}, Summary: {Yes/No}, Max Pages: {maxPages}
Program.cs: في ملفك الرئيسي، أظهر قوة الوسائط المسماة من خلال استدعاءGenerateReportبطرق مختلفة - مع تخطي المعلمات الاختيارية التي لا تحتاج إليها وتحديد المعلمات المهمة فقط لكل تقرير.
ستتلقى ثلاثة مدخلات:
- عنوان التقرير الأول
- عنوان التقرير الثاني
- عنوان التقرير الثالث
قم بإنشاء ثلاثة تقارير بتكوينات مختلفة:
- التقرير الأول: استخدم العنوان فقط (تطبق جميع القيم الافتراضية)
- التقرير الثاني: استخدم العنوان مع
includeSummary: trueوmaxPages: 25(تخطى author و includeHeader، مع الاحتفاظ بقيمهما الافتراضية) - التقرير الثالث: استخدم العنوان مع
author: "Admin"، وincludeHeader: false، وincludeSummary: true(احتفظ بالقيمة الافتراضية لـ maxPages)
اطبع نتيجة كل تقرير في سطر مستقل.
على سبيل المثال، إذا كانت المدخلات هي Sales Q1، و Annual Review، و Inventory Check، يجب أن يكون المخرج:
Report: Sales Q1 by Anonymous | Header: Yes, Summary: No, Max Pages: 10
Report: Annual Review by Anonymous | Header: Yes, Summary: Yes, Max Pages: 25
Report: Inventory Check by Admin | Header: No, Summary: Yes, Max Pages: 10لاحظ كيف تسمح لك الوسائط المسماة بالانتقال مباشرة إلى المعلمات التي تهتم بها - ليس عليك تحديد author أو includeHeader لمجرد تغيير includeSummary. هذا يجعل استدعاءات الدوال الخاصة بك أكثر قابلية للقراءة ويكشف عن الغرض منها بوضوح!
ورقة مرجعية
تسمح لك الوسائط المسماة (Named arguments) بتحديد المعلمة التي تتلقى القيمة باستخدام اسمها، بدلاً من الاعتماد على الموضع. وهذا يجعل استدعاءات الدوال أكثر وضوحاً ويسمح لك بتمرير الوسائط بأي ترتيب.
استخدم اسم المعلمة متبوعاً بنقطتين رأسيتين قبل القيمة:
public static void CreateUser(string name, int age, bool isActive)
{
Console.WriteLine($"{name}, Age: {age}, Active: {isActive}");
}
// استخدام الوسائط المسماة
CreateUser(name: "Alice", age: 25, isActive: true);
CreateUser(age: 30, isActive: false, name: "Bob"); // أي ترتيب يعملتعمل الوسائط المسماة بشكل جيد مع المعلمات الاختيارية. يمكنك الانتقال مباشرة إلى المعلمة التي تحتاجها دون تقديم جميع القيم الاختيارية السابقة:
public static void Configure(string host, int port = 8080, bool useSSL = false, int timeout = 30)
{
Console.WriteLine($"{host}:{port}, SSL: {useSSL}, Timeout: {timeout}");
}
// تخطي port و useSSL، وتحديد timeout فقط
Configure("localhost", timeout: 60);
Configure("server.com", useSSL: true);يمكنك المزج بين الوسائط الموضعية والمسماة، ولكن يجب أن تأتي الوسائط الموضعية أولاً. تعمل الوسائط المسماة على تحسين قابلية القراءة، خاصة بالنسبة للدوال التي تحتوي على معلمات متعددة من نفس النوع أو علامات منطقية (boolean flags).
جرّب بنفسك
using System;
using Reports;
class Program
{
public static void Main(string[] args)
{
// قراءة عناوين التقارير الثلاثة
string title1 = Console.ReadLine();
string title2 = Console.ReadLine();
string title3 = Console.ReadLine();
// إنشاء مثيل من ReportGenerator
ReportGenerator generator = new ReportGenerator();
// TODO: إنشاء التقرير الأول - استخدم العنوان فقط (تُطبق جميع القيم الافتراضية)
// TODO: إنشاء التقرير الثاني - استخدم العنوان مع includeSummary: true و maxPages: 25
// (تخطى author و includeHeader، مع الاحتفاظ بقيمهما الافتراضية)
// TODO: إنشاء التقرير الثالث - استخدم العنوان مع author: "Admin" و includeHeader: false و includeSummary: true
// (احتفظ بالقيمة الافتراضية لـ maxPages)
// طباعة نتيجة كل تقرير
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Object Oriented Programming
1أساسيات OOP
الملفات الخارجيةNamespaces والتوجيهاتمقدمة في Classes و Objectsالكلمة المفتاحية 'this'Methods والمعاملاتFields مقابل PropertiesConstructorsObject Initializersمراجعة - آلة حاسبة بسيطة4الوراثة
صيغة الوراثة الأساسية (:)الكلمة المفتاحية 'base'الكلمات المفتاحية Virtual و Overrideالأصناف المختومة (Sealed Classes)الفئة الأساسية 'object'مراجعة - هيكلية الموظفين7ميزات متقدمة
تحميل العوامل (Operator Overloading)المفهرسات (Indexers (this[]))إعادة تعريف ()ToStringدوال التوسعة (Extension Methods)ملخص - Custom List2الخصائص والأعضاء الساكنة (Static Members)
الخصائص المطبقة تلقائيًا (Auto-Implemented Properties)خصائص القراءة فقط والكتابة فقطالحقول والدوال الساكنة (Static)الفئات الساكنة (Static Classes)الأعضاء ذات البنية التعبيرية (Expression-Bodied Members)5تعدد الأشكال والواجهات (Polymorphism & Interfaces)
تعدد الأشكال: وقت التجميع مقابل وقت التشغيلالواجهة مقابل الفئة المجردة (Abstract Class)الواجهات المتعددةالواجهات الصريحةUpcasting و Downcastingملخص - حاسبة الأشكال8مفاهيم البرمجة كائنية التوجه (OOP) المتقدمة
التركيب بدلاً من الوراثةالـ Generics (الأصناف والدوال)الـ Delegates والأحداثالـ Attributes والـ Reflectionواجهة IDisposable وجملة usingأساسيات Dependency Injection