הסתרת מידע
חלק מהיחידה תכנות מונחה עצמים במסלול ה-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;
}
}כעת טמפרטורות לא תקינות נדחות באופן אוטומטי. הייצוג הפנימי מוסתר — בהמשך תוכל לשנות את אופן האחסון הפנימי של הטמפרטורה (אולי לקלווין) בלי להשפיע על קוד שמשתמש במחלקה.
לגישה הזו יש שלושה יתרונות מרכזיים: אימות מבטיח את תקינות הנתונים, גמישות מאפשרת לבצע שינויים פנימיים בלי לשבור קוד חיצוני, ושליטה מאפשרת לך להחליט בדיוק אילו פעולות מותרות בנתונים שלך.
אתגר
קלבואו נבנה מחלקה לניהול 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")
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים
קבצים חיצונייםמבוא לתכנות מונחה עצמיםמחלקות לעומת אובייקטיםמילת המפתח thisמתודותשדות (מאפיינים)מתודת הבנאיהעמסת בנאיםחזרה – מחשבון פשוט4ירושה
ירושה בסיסית (extends)מילת המפתח superדריסת מתודות (@Override)שרשור בנאיםהמחלקה Objectירושה יחידה ורב־רמתיתלמה אין ירושה מרובה של מחלקותסיכום – היררכיית עובדים7מתודות מיוחדות ומחלקת Object
מתודת toString()equals() ו-hashCode()מתודת clone()compareTo() ו-Comparableהממשק Comparatorסיכום – מיון מותאם אישית2מצייני גישה ואנקפסולציה
סקירה של רמות הגישהמתודות Getter ו-Setterהסתרת מידעמילת המפתח finalסיכום – מנהל חשבון בנק5פולימורפיזם
יסודות העמסת מתודותדריסת מתודות (בזמן ריצה)המרה כלפי מעלה וכלפי מטההאופרטור instanceofמחלקות ומתודות מופשטותסיכום – מחשבון צורות8מושגי OOP מתקדמים
הרכבה מול ירושהאגרגציה מול הרכבהמחלקות פנימיות, מקוננות ואנונימיותEnums ומתודות של EnumRecords (Java 16+)מחלקות חתומות (Java 17+)3מאפייני מחלקה וחברים סטטיים
משתני מופע לעומת משתנים סטטייםמתודות סטטיותבלוקים סטטייםקבועים (static final)סיכום — מונה ומחלקת עזר6ממשקים ומחלקות מופשטות
מבוא לממשקיםמימוש ממשקיםמימוש של כמה ממשקיםמתודות ברירת מחדל וסטטיות בממשקמחלקות מופשטות לעומת ממשקיםממשקים פונקציונלייםסיכום – מערכת תשלומיםתרגלו בעצמכם: קומפיילר Java אונליין