פרטיות ברמת הספרייה
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Dart של Coddy. שיעור 32 מתוך 110.
ב-Dart, הפרטיות נאכפת ברמת הספרייה, ולא ברמת המחלקה. זהו הבדל מרכזי לעומת שפות כמו Java או C++. ספרייה ב-Dart היא בדרך כלל קובץ יחיד, או כמה קבצים המקושרים באמצעות הנחיות part.
חברים פרטיים (אלה שמתחילים ב־_) נגישים בכל מקום באותה ספרייה, אפילו ממחלקות אחרות:
// שתי המחלקות באותו קובץ (באותה ספרייה)
class Engine {
int _horsepower = 200; // פרטי לספרייה זו
}
class Car {
void showPower(Engine engine) {
print(engine._horsepower); // נגיש! אותה ספרייה
}
}עם זאת, כשמייבאים מחלקה מקובץ אחר, החברים הפרטיים שלה מוסתרים באמת:
// קובץ: engine.dart
class Engine {
int _horsepower = 200;
int get power => _horsepower;
}
// קובץ: main.dart
import 'engine.dart';
void main() {
var engine = Engine();
// print(engine._horsepower); // שגיאה! אין גישה
print(engine.power); // עובד - באמצעות getter ציבורי
}פרטיות ברמת הספרייה הזו מאפשרת למחלקות באותו קובץ לשתף פעולה באופן הדוק, ובו בזמן להסתיר פרטי מימוש מקוד חיצוני. זוהי בחירת עיצוב מכוונת שמעודדת לארגן מחלקות קשורות יחד באותה ספרייה.
אתגר
קלבואו נבנה מערכת לשיתוף פעולה בצוות שתדגים איך פרטיות ברמת הספרייה פועלת ב-Dart. תראו איך מחלקות באותו קובץ יכולות לגשת לאיברים הפרטיים זו של זו, בעוד שקוד בקבצים נפרדים אינו יכול.
תארגנו את הקוד בשני קבצים:
team.dart: הקובץ הזה יכיל שתי מחלקות שפועלות בצמוד באותה ספרייה:- מחלקת
MemberעםString nameציבורי ו-int _performanceScoreפרטי שמאותחל ל-50. כללו בנאי שמקבל את השם, וגם getter ציבוריperformanceScoreשמחזיר את הציון הפרטי. - מחלקת
TeamLeadבאותו קובץ, שיכולה לגשת ישירות לשדה הפרטי שלMember(כי הן באותה ספרייה). למחלקה צריכה להיותString nameציבורי, בנאי שמקבל את השם, ומתודהevaluateMember(Member member)שניגשת ישירות אלmember._performanceScore, מוסיפה לו10, ומדפיסה[leadName] boosted [memberName]'s score to [newScore].
- מחלקת
main.dart: ייבאו את קובץ הצוות והדגימו את ההבדל בהרשאות הגישה:- צרו
Memberבשם'Alice' - צרו
TeamLeadבשם'Bob' - הדפיסו
Initial score: [score]באמצעות ה-getter הציבורי של Alice - תנו ל-Bob להעריך את Alice באמצעות
evaluateMember - הדפיסו
Updated score: [score]באמצעות ה-getter הציבורי - הדפיסו
Direct access from main: Not allowed(התזכורת לכך היא ש-main.dartאינו יכול לגשת ישירות אל_performanceScore, משום שהוא נמצא בספרייה אחרת)
- צרו
התובנה המרכזית כאן היא ש-TeamLead יכולה לקרוא ולשנות ישירות את _performanceScore הפרטי של Member, משום ששתי המחלקות נמצאות באותו קובץ (אותה ספרייה). עם זאת, קוד ב-main.dart חייב להשתמש ב-getter הציבורי, משום שהוא נמצא בספרייה אחרת.
הפלט הצפוי:
Initial score: 50
Bob boosted Alice's score to 60
Updated score: 60
Direct access from main: Not allowedנסו בעצמכם
import 'team.dart';
void main() {
// TODO: צור Member בשם 'Alice'
// TODO: צור TeamLead בשם 'Bob'
// TODO: הדפס "Initial score: [score]" באמצעות ה-getter הציבורי של Alice
// TODO: דאג ש-Bob יעריך את Alice באמצעות evaluateMember
// TODO: הדפס "Updated score: [score]" באמצעות ה-getter הציבורי
// TODO: הדפס "Direct access from main: Not allowed"
// הערה: אי אפשר לגשת כאן אל alice._performanceScore כי
// main.dart נמצא בספרייה אחרת מזו של team.dart
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
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 אונליין