Menu
Coddy logo textTech

הסתרת מידע

חלק מהיחידה תכנות מונחה עצמים במסלול ה-Java של Coddy. שיעור 12 מתוך 87.

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

חשבו מה קורה ללא הסתרת מידע:

public class Temperature {
    public double celsius;  // חשוף ישירות
}

// כל אחד יכול להגדיר ערכים לא תקינים
Temperature t = new Temperature();
t.celsius = -500;  // מתחת לאפס המוחלט - בלתי אפשרי!

באמצעות הסתרת מידע, אתה שולט באופן הגישה לנתונים והשינוי שלהם:

public class Temperature {
    private double celsius;
    
    public void setCelsius(double celsius) {
        if (celsius >= -273.15) {
            this.celsius = celsius;
        }
    }
    
    public double getCelsius() {
        return celsius;
    }
}

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

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

challenge icon

אתגר

קל

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

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

  • Password.java: צרו מחלקה בשם Password שמסתירה את הנתונים הפנימיים שלה ושולטת באופן שבו ניתן להגדיר סיסמאות ולגשת אליהן:
    • שדה פרטי password (String) שמאחסן את הסיסמה עצמה
    • שדה פרטי minLength (int) שמגדיר את אורך הסיסמה המינימלי המותר
    • בנאי שמקבל את דרישת האורך המינימלי
    • setter בשם setPassword(String password) שמקבל רק סיסמאות שעומדות בדרישת האורך המינימלי. אם הסיסמה תקינה, שמרו אותה והחזירו true; אם היא קצרה מדי, אל תשנו את הסיסמה והחזירו false
    • getter בשם getMaskedPassword() שמחזיר את הסיסמה כשכל התווים מוחלפים בכוכביות (*) — לעולם אל תחשפו את הסיסמה עצמה!
    • מתודה בשם checkPassword(String attempt) שמחזירה true אם הניסיון תואם לסיסמה השמורה, ואחרת false
    • getter בשם getLength() שמחזיר את אורך הסיסמה הנוכחית (או 0 אם לא הוגדרה סיסמה)
  • Main.java: צרו אובייקט Password עם אורך מינימלי של 6, ולאחר מכן קראו שתי קלטים: סיסמה להגדרה וניסיון לבדיקה. הדפיסו שלוש שורות:
    • Set: true או Set: false (תוצאת הגדרת הסיסמה)
    • Masked: ****** (הגרסה המוסתרת של הסיסמה)
    • Match: true או Match: false (תוצאת בדיקת הניסיון)

תקבלו שני קלטים: הסיסמה להגדרה וניסיון הסיסמה לבדיקה.

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

נסו בעצמכם

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // קראו את הסיסמה שיש להגדיר
        String passwordToSet = scanner.nextLine();
        // קראו את ניסיון הזנת הסיסמה שיש לבדוק
        String passwordAttempt = scanner.nextLine();
        
        // TODO: צרו אובייקט Password באורך מינימלי של 6
        
        // TODO: הגדירו את הסיסמה והדפיסו את התוצאה ("Set: true" או "Set: false")
        
        // TODO: הדפיסו את הסיסמה המוסתרת ("Masked: ******")
        
        // TODO: בדקו את ניסיון הזנת הסיסמה והדפיסו את התוצאה ("Match: true" או "Match: false")
        
    }
}
quiz iconבחנו את עצמכם

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

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

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