Menu
Coddy logo textTech

חברים ציבוריים לעומת פרטיים

חלק מהיחידה תכנות מונחה עצמים במסלול ה-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 הציבורי. כך ניתן לשלוט באופן שבו הנתונים נקראים ומשתנים, ולהבטיח שהאובייקטים שלך תמיד יישארו במצב תקין.

challenge icon

אתגר

קל

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

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

  • 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 הציבורי
}
quiz iconבחנו את עצמכם

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

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

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