מוסכמת הקידומת _
חלק מהיחידה תכנות מונחה עצמים במסלול ה-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) { } // מתודה פרטית
}בתוך אותה מחלקה, ניגשים לחברים פרטיים כרגיל. ההגבלה חלה רק על קוד שמחוץ לספרייה. מוסכמה זו מבהירה מיד בעת קריאת הקוד אילו חברים מיועדים לשימוש פנימי בלבד — כל דבר שמתחיל ב־_ הוא פרט מימוש.
אתגר
קלבואו נבנה מעקב אחר ניקוד במשחק, שמדגים כיצד הקידומת של קו תחתון מסתירה פרטי מימוש פנימיים ובו בזמן חושפת ממשק ציבורי נקי.
תארגנו את הקוד בשני קבצים:
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 הציבורי
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים
קבצים חיצונייםספריות וייבואמבוא לתכנות מונחה עצמיםמחלקות לעומת אובייקטיםמילת המפתח thisמתודותמשתני מופעיסודות הבנאיחזרה: מחשבון פשוט4בטיחות מפני ערכי null
מבוא לבטיחות מפני ערכי nullניתן להקצאה ל-null לעומת לא ניתן להקצאה ל-nullהאופרטורים ? ו-!מילת המפתח Late ובטיחות מפני ערכי nullאופרטורים מודעי nullבטיחות מפני ערכי null במחלקותסיכום – מערכת פרופילי משתמשים7מחלקות מופשטות וממשקים
מחלקות מופשטותמתודות מופשטותממשקים ב-Dartממשקים משתמעיםמימוש לעומת הורשהממשקים מרוביםחזרה – מחשבון צורות10אוספים וגנריות
סקירה כללית של List, Set ו-Mapאוספים בטוחים מבחינת טיפוסיםמחלקות גנריותמתודות גנריותאילוצים גנרייםIterable ו-Iteratorסיכום – אחסון גנרי13מושגי OOP מתקדמים
הרכבה לעומת הורשהמתודות הרחבהמחלקות קריאותמחלקות אטומות (Dart 3)רשומות (Dart 3)תבניות והתאמה (3.0)טיפוסים מונים עם מתודות16פרויקט: ניהול ספרייה
סקירת הפרויקטמחלקות ספר ומשתמש2בנאים ב-Dart
בנאי ברירת מחדלבנאים בעלי שםרשימות אתחולבנאים קבועיםבנאי Factoryבנאים מפניםסיכום - בונה צורות5כימוס
חברים ציבוריים לעומת פרטייםמוסכמת הקידומת _פרטיות ברמת הספרייההעמקה ב-getters וב-settersהסתרת מידעסיכום – רשומות תלמידים8מיקסינים
מבוא למיקסיניםיצירת מיקסיניםשימוש במספר מיקסיניםמילת המפתח on במיקסיניםמיקסינים לעומת ירושהמיקסינים לעומת ממשקסיכום – מערכת בעלי החיים3מאפייני מחלקה
איברי מופע לעומת איברים סטטייםשדות final ו-constמשתני lateמתודות ושדות סטטייםGetters ו-Settersסיכום – מנהל חשבונות בנק6ירושה
ירושה בסיסיתמילת המפתח superדריסת מתודותהאנוטציה @overrideמילת המפתח final למחלקהבנאים וירושהסיכום – היררכיית עובדים9פולימורפיזם
יסודות הפולימורפיזםפולימורפיזם באמצעות ממשקיםבדיקת טיפוסים בזמן ריצההאופרטורים is ו-asמילת המפתח קווריאנטיסיכום — מעבד תשלומים12תכנות מונחה עצמים אסינכרוני
Future-ים ו-async/awaitיסודות ה-Streamsבקרי Streamsבנאים אסינכרונייםאסינכרוניות במתודות של מחלקהסיכום - אחזור נתוניםתרגלו בעצמכם: קומפיילר Dart אונליין