חברים ציבוריים לעומת פרטיים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Dart של Coddy. שיעור 30 מתוך 110.
כימוס הוא אחד מעקרונות הליבה של תכנות מונחה עצמים. מדובר בשליטה בגישה לנתונים הפנימיים של מחלקה, ובהחלטה מה יהיה גלוי לעולם החיצון ומה יישאר מוסתר.
ב-Dart, איברי מחלקה (שדות ומתודות) הם ציבוריים כברירת מחדל. פירוש הדבר הוא שכל קוד יכול לגשת אליהם ישירות:
class BankAccount {
String owner;
double balance;
BankAccount(this.owner, this.balance);
}
var account = BankAccount('Alice', 1000);
account.balance = -500; // כל אחד יכול לשנות את זה ישירות!זה בעייתי. אין שום דבר שמונע הגדרה של יתרה לא תקינה.
כדי להגן על נתונים פנימיים, Dart משתמשת בחברים פרטיים. חבר הופך לפרטי כאשר שמו מתחיל בקו תחתון _:
class BankAccount {
String owner;
double _balance; // פרטי - מתחיל בקו תחתון
BankAccount(this.owner, this._balance);
double get balance => _balance; // גישה מבוקרת
}כעת אי אפשר לגשת אל _balance ישירות מחוץ לספרייה שבה המחלקה מוגדרת. קוד חיצוני חייב להשתמש במקום זאת ב-getter הציבורי. כך ניתן לשלוט באופן שבו הנתונים נקראים ומשתנים, ולהבטיח שהאובייקטים שלך תמיד יישארו במצב תקין.
אתגר
קלנבנה מנהל סיסמאות פשוט שמדגים את ההבדל בין חברים ציבוריים ופרטיים. תראו כיצד הקידומת של קו תחתון מגינה על נתונים רגישים מפני גישה ישירה אליהם מחוץ לספרייה של המחלקה.
תיצרו שני קבצים כדי לארגן את הקוד שלכם:
credential.dart: הגדירו מחלקה בשםCredentialששומרת פרטי התחברות לאתר. למחלקה צריכים להיות:String websiteציבורי - אין בעיה שכולם יראו לאיזה אתר הוא מיועדString usernameציבורי - אפשר להציג את שם המשתמשString _passwordפרטי - יש להגן על הסיסמה בפועל- בנאי שמקבל את שלושת הערכים
- getter ציבורי בשם
passwordשמחזיר את_passwordהפרטי (גישה מבוקרת) - מתודה בשם
getMaskedPassword()שמחזירה את הסיסמה כאשר כל התווים בה מוחלפים בכוכביות*(באותו אורך כמו הסיסמה בפועל) - מתודה בשם
displayCredential()שמדפיסה את פרטי ההתחברות בבטחה (מציגה את הסיסמה המוסתרת, ולא את הסיסמה האמיתית)
main.dart: ייבאו את מחלקת פרטי ההתחברות שלכם והדגימו כיצד כימוס מגן על הסיסמה:- צרו פרטי התחברות לאתר
'github.com', עם שם המשתמש'dev_user'והסיסמה'secret123' - צרו פרטי התחברות נוספים לאתר
'email.com', עם שם המשתמש'john_doe'והסיסמה'myP@ss' - עבור כל אחד מפרטי ההתחברות, קראו למתודה
displayCredential(), ואז הדפיסוActual password length: [length]באמצעות ה-getter הציבורי כדי לגשת לאורך הסיסמה
- צרו פרטי התחברות לאתר
המתודה displayCredential() צריכה להדפיס בפורמט הזה:
--- Credential ---
Website: [website]
Username: [username]
Password: [maskedPassword]פלט צפוי:
--- Credential ---
Website: github.com
Username: dev_user
Password: *********
Actual password length: 9
--- Credential ---
Website: email.com
Username: john_doe
Password: ******
Actual password length: 6נסו בעצמכם
import 'credential.dart';
void main() {
// TODO: צרו פרטי התחברות עבור github.com
// website: 'github.com', username: 'dev_user', password: 'secret123'
// TODO: קראו ל־displayCredential() על פרטי ההתחברות הראשונים
// TODO: הדפיסו את האורך האמיתי של הסיסמה באמצעות ה־getter הציבורי
// פורמט: "Actual password length: [length]"
// TODO: צרו פרטי התחברות עבור email.com
// website: 'email.com', username: 'john_doe', password: 'myP@ss'
// TODO: קראו ל־displayCredential() על פרטי ההתחברות השניים
// TODO: הדפיסו את האורך האמיתי של הסיסמה באמצעות ה־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 אונליין