Dart / الأساسيات: القيم والغياب والمجموعات والكائنات الصالحة / الدرس 2
كتابة القرارات والدوال بعقود ظاهرة
استخدم شروطا منطقية صريحة وحلقات محدودة ومعاملات مسماة ودوال كقيم، للتعبير عن سياسة دفعات صغيرة.
في هذه الصفحة
أهداف الدرس
- اختر حدود الفروع والحلقات من السياسة، لا من أمثلة مريحة فقط.
- ميّز المعاملات المسماة المطلوبة والقيم الافتراضية الاختيارية والقيم المعادة من الدالة.
تحتاج شروط Dart نتيجة bool
يجب أن يُقيَّم شرط if أو الحلقة إلى bool. لا تعامل Dart النص الفارغ أو الصفر أو القائمة الفارغة تلقائيا كـfalse بدلا من شرط صريح. يساعد ذلك على كشف السؤال المقصود؛ فـcount > 0 تختلف عن count != 0. استخدم الفروع لوصف حالات السياسة المتميزة، وفكّر عمدا في السالب والصفر والموجب. تعيد الدالة السهمية تعبيرا واحدا، بينما يجب أن تعيد الدالة ذات الجسم بين الأقواس القيمة المطلوبة صراحة عندما يشترط عقدها ذلك. طباعة القيمة أثر جانبي منفصل عن إرجاعها.
أعد تصنيفا واضحا لكل مدخل
يصنف المثال عدد عينات افتراضيا: السالب غير صالح، والصفر فارغ، والموجب جاهز. تجعل العودة المبكرة أول قاعدة مطابقة واضحة دون متغير ناتج قابل للتعديل. السياسة محلية عمدا ولا تفحص جهاز مختبر أو خدمة خارجية. يؤثر ترتيب الشروط المتداخلة في النتيجة؛ فاختبر الحدود بدلا من افتراض كفاية عدة أعداد موجبة عادية. وإذا احتاج فرع عملا كبيرا، فقد تعبّر دالة مساعدة مسماة عن تلك المسؤولية أوضح من تعبير شديد التعشيق.
String batchState(int count) {
if (count < 0) return 'invalid';
if (count == 0) return 'empty';
return 'ready';
}
void main() {
for (final count in <int>[-1, 0, 1]) {
print(batchState(count));
}
}
invalid
empty
ready
المخرجات المتوقعة invalid ثم empty ثم ready. يتبع كل عدد معطى مسار عودة واحدا. البرنامج كامل، لكنه لم يُترجم أو يُنفّذ.
عبّر عن حد المجموعة مباشرة
تكون for-in واضحة عادة عندما تحتاج الخوارزمية كل عنصر لا فهرسه. يجب أن يطابق شرط الحلقة المفهرسة الفهرسة من الصفر؛ فآخر فهرس صالح هو length - 1. لا تستخدم length كموضع صالح. توقف break أقرب حلقة، وتتجاوز continue بقية التكرار الحالي. قد يخرق تغيير المجموعة أثناء المرور عقد مكررها؛ فابن نتيجة منفصلة أو اختر استراتيجية تعديل موثقة، بدلا من حذف عناصر عرضيا داخل مرور عادي.
استخدم الأسماء لتمييز معاملات متشابهة النوع
تستخدم المعاملات المسماة أقواسا معقوفة في التصريح وأسماء عند الاستدعاء. تجعل required المعامل المسمى إلزاميا، رغم أن الأصل في المسماة أنها اختيارية. تحتاج المعاملات الاختيارية قيمة افتراضية مسموحة أو نوعا يقبل null وفق أمان الخلو، ويجب أن تحقق القيم الافتراضية المعلنة قواعد الثبات وقت الترجمة. تفصل دالة التسمية معرف الدفعة المطلوب عن عدد اختياري. الافتراضي جزء من عقد الدالة، لا إعداد عام خفي. قد يؤثر تغيير الأسماء أو الإلزام في المستدعين حتى لو بقي الجسم نفسه.
String batchLabel({required String id, int count = 1}) => '$id:$count';
int countMatching(List<int> values, bool Function(int) predicate) =>
values.where(predicate).length;
void main() {
print(batchLabel(id: 'B-7'));
print(batchLabel(id: 'B-8', count: 3));
print(countMatching(<int>[0, 2, 4], (value) => value > 0));
}
B-7:1
B-8:3
2
المخرجات المتوقعة B-7:1 ثم B-8:3 ثم 2. نوع الشرط هو bool Function(int). لا يُدعى تنفيذ، والعد قاعدة تعليمية محلية.
تحتاج القيمة الدالية عقدا لآثارها أيضا
الدوال كائنات يمكن تخزينها وتمريرها وإعادتها. تستطيع دالة مجهولة التقاط متغيرات محيطة، ولذلك قد يرى نداء لاحق حالة معدلة تغيرت. يشير tear-off إلى دالة قائمة دون استدعائها فورا. لا تضمن هذه الصيغ الصفاء أو الإلغاء أو عمرا معينا. أبق الشرط الصغير دون إدخال وإخراج مفاجئ عندما يتوقع المستدعي قرارا بسيطا. وللعملية العامة القابلة للاستخدام، وثّق المجالات المقبولة وسلوك الفشل وهل تعدّل المدخل. لا تعبّر أنواع المعاملات الساكنة وحدها عن كل قيد في المجال.
الأخطاء الشائعة وإصلاحها
يُستخدم عدد صحيح مباشرة كشرط if.
- لماذا يحدث؟
- افتُرضت قواعد تحويل ضمني إلى الحقيقة من لغة أخرى.
- كيف تصلحه؟
- اكتب شرطا منطقيا صريحا يعبر عن السياسة المقصودة.
- كيف تتجنب تكراره؟
- راجع هل للصفر والسالب والموجب معان مختلفة.
تصل حلقة مفهرسة إلى list[length].
- لماذا يحدث؟
- اختلط عدد العناصر بالفهرس الصالح الأخير.
- كيف تصلحه؟
- استخدم index < length أو مرّ على العناصر مباشرة.
- كيف تتجنب تكراره؟
- افحص المجموعة الفارغة وذات العنصر الواحد كحدود.
يُغفل معامل مسمى مطلوب عند الاستدعاء.
- لماذا يحدث؟
- اختلطت الصياغة المسماة بعقد اختياري دائما.
- كيف تصلحه؟
- مرّر المعامل أو أعد تصميم التصريح عمدا.
- كيف تتجنب تكراره؟
- عامل الأسماء والإلزام كجزء من الواجهة أمام المستدعي.
اختبر فهمك
1. لماذا لا يكافئ count != 0 الشرط count > 0 لعدد عناصر دفعة؟
اعرض الحل المشروح
يقبل الأول السالب والموجب، بينما يقبل الثاني الموجب فقط. حدّد هل السالب غير صالح أو علامة خاصة أو مستحيل وفق قيد مثبت. اختبر -1 و0 و1 قبل تبسيط الشرط؛ فقد يغير شرط أقصر ظاهريا معنى المجال.
2. يلتقط نداء مؤجل عتبة قابلة للتعديل، ثم يُستدعى بعد تغيرها. أي قيمة تتوقع أن يفحصها؟
اعرض الحل المشروح
قد يكشف المتغير المعدل الملتقط قيمته اللاحقة عند الاستدعاء، فلا تفترض لقطة وقت الإنشاء. التقط قيمة محلية final صريحة إذا كانت العتبة الأصلية هي العقد المقصود. وحدّد عمر النداء وملكيته أيضا؛ فلا يحسم اختيار lambda بدلا من دالة مسماة هذه المسؤوليات.
أهم ما تعلمته
- تجعل الشروط والحدود وعقود المعاملات الصريحة السياسة ظاهرة.
- القيم المعادة والآثار الجانبية جزءان منفصلان من سلوك الدالة.