Menu
Coddy logo textTech

הסתרת מידע

חלק מהיחידה תכנות מונחה עצמים במסלול ה-PHP של Coddy. שיעור 41 מתוך 91.

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

המטרה היא ליצור גבול ברור בין מה שמחלקה עושה (הממשק הציבורי שלה) לבין האופן שבו היא עושה זאת (המימוש הפנימי שלה). ההפרדה הזאת מאפשרת לך לשנות את אופן הפעולה הפנימי בלי להשפיע על קוד שמשתמש במחלקה:

<?php
class Temperature {
    private float $celsius;
    
    public function setCelsius(float $value): void {
        $this->celsius = $value;
    }
    
    public function getCelsius(): float {
        return $this->celsius;
    }
    
    public function getFahrenheit(): float {
        return ($this->celsius * 9/5) + 32;
    }
}

$temp = new Temperature();
$temp->setCelsius(25);
echo $temp->getCelsius() . "C = " . $temp->getFahrenheit() . "F";

פלט:

25C = 77F

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

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

challenge icon

אתגר

קל

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

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

  • Money.php: צור מחלקה בשם Money ששומרת את כל הסכומים באופן פנימי באגורות (כמספר שלם) כדי למנוע בעיות דיוק של מספרים בנקודה צפה. פרט המימוש הזה צריך להיות מוסתר לחלוטין ממשתמשי המחלקה. המחלקה צריכה לספק:
    • מאפיין פרטי לשמירת הסכום באגורות
    • setDollars(float $amount): מקבלת סכום בדולרים ושומרת אותו באופן פנימי באגורות
    • getDollars(): מחזירה את הסכום בדולרים (מספר בנקודה צפה, עם 2 ספרות אחרי הנקודה העשרונית)
    • setEuros(float $amount): מקבלת סכום באירו וממירה אותו לאגורות לפי השער: 1 EUR = 1.10 USD
    • getEuros(): מחזירה את הסכום כשהוא מומר לאירו (מספר בנקודה צפה, עם 2 ספרות אחרי הנקודה העשרונית)
    • getInternalValue(): מחזירה את ערך האגורות הגולמי (מספר שלם) למטרות ניפוי שגיאות
  • main.php: כלול את קובץ Money. יתקבלו שני קלטים: סכום בדולרים וסכום באירו. צור מופע של Money. תחילה, הגדר את הסכום בדולרים (לאחר המרה למספר בנקודה צפה) והדפס שלוש שורות: הסכום בדולרים, הסכום המקביל באירו וערך האגורות הפנימי. לאחר מכן הגדר את הסכום באירו (לאחר המרה למספר בנקודה צפה) והדפס שוב את אותם שלושת הערכים.

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

עצב את כל הפלטים בדולרים ובאירו כך שיוצגו בדיוק עם 2 ספרות אחרי הנקודה העשרונית. יש להדפיס כל ערך בשורה נפרדת, כך שייווצרו בסך הכול שש שורות פלט.

נסו בעצמכם

<?php

require_once 'Money.php';

// קראו את ערכי הקלט
$dollarAmount = floatval(trim(fgets(STDIN)));
$euroAmount = floatval(trim(fgets(STDIN)));

// TODO: צרו מופע של Money

// TODO: הגדירו את הסכום בדולרים והדפיסו:
// - הערך בדולרים (2 ספרות אחרי הנקודה העשרונית)
// - הערך המקביל באירו (2 ספרות אחרי הנקודה העשרונית)
// - הערך הפנימי בסנטים (מספר שלם)

// TODO: הגדירו את הסכום באירו והדפיסו:
// - הערך בדולרים (2 ספרות אחרי הנקודה העשרונית)
// - הערך המקביל באירו (2 ספרות אחרי הנקודה העשרונית)
// - הערך הפנימי בסנטים (מספר שלם)

?>
quiz iconבחנו את עצמכם

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

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

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