Menu
Coddy logo textTech

פרטיות ברמת הספרייה

חלק מהיחידה תכנות מונחה עצמים במסלול ה-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 ציבורי
}

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

challenge icon

אתגר

קל

בואו נבנה מערכת לשיתוף פעולה בצוות שתדגים איך פרטיות ברמת הספרייה פועלת ב-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
}
quiz iconבחנו את עצמכם

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

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

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