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

اتفاقية البادئة _

جزء من قسم Object Oriented Programming في رحلة Dart على Coddy — الدرس 31 من 110.

تُعد بادئة الشرطة السفلية _ هي طريقة Dart لتمييز الأعضاء كأعضاء خاصة. وعلى عكس اللغات التي تستخدم كلمات مفتاحية مثل private، تعتمد Dart على اصطلاح التسمية هذا للتحكم في مستوى الظهور.

يمكنك تطبيق الشرطة السفلية على كل من الحقول والأساليب (methods):

class Counter {
  int _count = 0;        // حقل خاص
  
  void _increment() {    // أسلوب خاص
    _count++;
  }
  
  void increase() {      // أسلوب عام
    _increment();
    print('Count: $_count');
  }
}

تعمل الشرطة السفلية مع أي معرف - المتغيرات، والأساليب (methods)، والمستقبلات (getters)، والمعدلات (setters)، وحتى أسماء الفئات. الفئة المسماة _Helper ستكون خاصة بمكتبتها.

class Person {
  String _name;          // خاص
  int _age;              // خاص
  
  Person(this._name, this._age);
  
  String get name => _name;           // مستقبل عام (Public getter)
  void _validateAge(int age) { }      // أسلوب خاص (Private method)
}

داخل نفس الفئة، يمكنك الوصول إلى الأعضاء الخاصين بشكل طبيعي. ينطبق هذا القيد فقط على الكود الموجود خارج المكتبة. هذا العرف يجعل الأمر واضحاً تماماً عند قراءة الكود حول أي الأعضاء مخصص للاستخدام الداخلي فقط - أي شيء يبدأ بـ _ هو من تفاصيل التنفيذ.

challenge icon

التحدي

سهل

لنقم ببناء متتبع نقاط للعبة يوضح كيف تحافظ البادئة التي تستخدم الشرطة السفلية على إخفاء تفاصيل التنفيذ الداخلية مع توفير واجهة عامة نظيفة.

ستقوم بتنظيم الكود الخاص بك في ملفين:

  • score_tracker.dart: أنشئ فئة ScoreTracker تدير نقاط اللاعب مع التغليف (encapsulation) المناسب. يجب أن تحتوي الفئة على:
    • حقل عام String playerName - يمكن للجميع رؤية من يلعب
    • حقل خاص int _score مهيأ بـ 0 - يجب حماية النقاط الخام
    • حقل خاص int _bonusMultiplier مهيأ بـ 1 - هذه آلية داخلية للعبة
    • منشئ (constructor) يأخذ اسم اللاعب
    • مسترجع (getter) عام score يعيد قيمة _score الخاصة
    • دالة خاصة _applyBonus(int points) تعيد points * _bonusMultiplier
    • دالة عامة addPoints(int points) تستخدم _applyBonus داخلياً لحساب النقاط الفعلية المضافة، وتحدث _score، وتطبع Added [calculated] points!
    • دالة عامة activateDoubleBonus() تضبط _bonusMultiplier على 2 وتطبع Double bonus activated!
    • دالة عامة displayStats() تعرض الحالة الحالية للاعب
  • main.dart: استورد متتبع النقاط الخاص بك وقم بمحاكاة جلسة لعبة:
    • أنشئ ScoreTracker للاعب 'Alex'
    • استدعِ displayStats()
    • أضف 10 نقاط
    • أضف 25 نقطة
    • قم بتنشيط المكافأة المزدوجة (double bonus)
    • أضف 15 نقطة (يجب أن تضاعف هذه النقاط)
    • استدعِ displayStats()
    • اطبع Final score: [score] باستخدام المسترجع العام

يجب أن تطبع الدالة displayStats() بهذا التنسيق:

=== Player Stats ===
Player: [playerName]
Current Score: [_score]

لاحظ كيف تتعامل الدالة الخاصة _applyBonus والحقل الخاص _bonusMultiplier مع حساب المكافأة داخلياً. الكود الخارجي يرى فقط الدوال العامة وليس لديه أي فكرة عن نظام المضاعف - فهذا تفصيل من تفاصيل التنفيذ مخفي خلف اصطلاح الشرطة السفلية.

المخرجات المتوقعة:

=== Player Stats ===
Player: Alex
Current Score: 0
Added 10 points!
Added 25 points!
Double bonus activated!
Added 30 points!
=== Player Stats ===
Player: Alex
Current Score: 65
Final score: 65

ورقة مرجعية

تُحدد البادئة بشرطة سفلية _ الأعضاء كأعضاء خاصة (private) في لغة Dart. تتحكم اتفاقية التسمية هذه في الرؤية دون استخدام كلمات مفتاحية مثل private.

قم بتطبيق الشرطة السفلية على الحقول والأساليب (methods):

class Counter {
  int _count = 0;        // حقل خاص
  
  void _increment() {    // أسلوب خاص
    _count++;
  }
  
  void increase() {      // أسلوب عام
    _increment();
    print('Count: $_count');
  }
}

تعمل الشرطة السفلية مع أي معرف - المتغيرات، والأساليب (methods)، والـ getters، والـ setters، وأسماء الفئات (classes):

class Person {
  String _name;          // خاص
  int _age;              // خاص
  
  Person(this._name, this._age);
  
  String get name => _name;           // getter عام
  void _validateAge(int age) { }      // أسلوب خاص
}

يمكن الوصول إلى الأعضاء الخاصة داخل نفس الفئة ولكنها مقيدة عن الكود الموجود خارج المكتبة. أي شيء يبدأ بـ _ يعتبر من تفاصيل التنفيذ.

جرّب بنفسك

import 'score_tracker.dart';

void main() {
  // TODO: 'Alex' للاعب ScoreTracker إنشاء
  
  // TODO: displayStats() استدعاء
  
  // TODO: إضافة 10 نقاط
  
  // TODO: إضافة 25 نقطة
  
  // TODO: تفعيل المكافأة المزدوجة
  
  // TODO: إضافة 15 نقطة (يجب أن تضاعف هذه النقاط)
  
  // TODO: displayStats() استدعاء
  
  // TODO: باستخدام أداة الحصول العامة 'Final score: [score]' طباعة
}
quiz iconاختبر نفسك

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

جميع دروس Object Oriented Programming