Menu
Coddy logo textTech

מוסכמת הקידומת _

חלק מהיחידה תכנות מונחה עצמים במסלול ה-Dart של Coddy. שיעור 31 מתוך 110.

הקידומת קו תחתון _ היא הדרך של Dart לסמן איברים כפרטיים. בניגוד לשפות שמשתמשות במילות מפתח כמו private, Dart מסתמכת על מוסכמת שמות זו כדי לשלוט בנראות.

אפשר להוסיף קו תחתון גם לשדות וגם לשיטות:

class Counter {
  int _count = 0;        // שדה פרטי
  
  void _increment() {    // מתודה פרטית
    _count++;
  }
  
  void increase() {      // מתודה ציבורית
    _increment();
    print('Count: $_count');
  }
}

קו תחתון פועל עם כל מזהה — משתנים, מתודות, מאחזרות, מציבים ואפילו שמות מחלקות. מחלקה בשם _Helper תהיה פרטית לספרייה שלה.

class Person {
  String _name;          // פרטי
  int _age;              // פרטי
  
  Person(this._name, this._age);
  
  String get name => _name;           // גטר ציבורי
  void _validateAge(int age) { }      // מתודה פרטית
}

בתוך אותה מחלקה, ניגשים לחברים פרטיים כרגיל. ההגבלה חלה רק על קוד שמחוץ לספרייה. מוסכמה זו מבהירה מיד בעת קריאת הקוד אילו חברים מיועדים לשימוש פנימי בלבד — כל דבר שמתחיל ב־_ הוא פרט מימוש.

challenge icon

אתגר

קל

בואו נבנה מעקב אחר ניקוד במשחק, שמדגים כיצד הקידומת של קו תחתון מסתירה פרטי מימוש פנימיים ובו בזמן חושפת ממשק ציבורי נקי.

תארגנו את הקוד בשני קבצים:

  • score_tracker.dart: צרו מחלקה ScoreTracker שמנהלת את הניקוד של שחקן באמצעות כימוס מתאים. המחלקה צריכה לכלול:
    • String playerName ציבורי — כולם יכולים לראות מי משחק
    • int _score פרטי שמאותחל ל־0 — יש להגן על הניקוד הגולמי
    • int _bonusMultiplier פרטי שמאותחל ל־1 — זהו מנגנון פנימי של המשחק
    • בנאי שמקבל את שם השחקן
    • 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 נקודות
    • הפעילו את הבונוס הכפול
    • הוסיפו 15 נקודות (הנקודות האלה אמורות להיות מוכפלות)
    • קראו ל־displayStats()
    • הדפיסו Final score: [score] באמצעות ה־getter הציבורי

המתודה 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

נסו בעצמכם

import 'score_tracker.dart';

void main() {
  // TODO: ליצור ScoreTracker עבור השחקן 'Alex'
  
  // TODO: לקרוא ל-displayStats()
  
  // TODO: להוסיף 10 נקודות
  
  // TODO: להוסיף 25 נקודות
  
  // TODO: להפעיל את בונוס ההכפלה
  
  // TODO: להוסיף 15 נקודות (הן אמורות להיות מוכפלות)
  
  // TODO: לקרוא ל-displayStats()
  
  // TODO: להדפיס 'Final score: [score]' באמצעות ה-getter הציבורי
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר Dart אונליין