CodeGym /בלוג Java /Random-HE /אנקפסולציה בג'אווה
John Squirrels
רָמָה
San Francisco

אנקפסולציה בג'אווה

פורסם בקבוצה
היי! נקדיש את השיעור של היום ל-Encapsulation בג'אווה ונתחיל בדוגמאות ישירות מהשער:) הנה לכם מכונת חלוקת סודה רגילה . יש לי שאלה אחת אליך: איך זה עובד? נסו לתת תשובה מפורטת: מאיפה הסודה? כיצד נשמרת הטמפרטורה הפנימית? היכן מאוחסן הקרח? איך המכונה יודעת איזה סירופ להוסיף? כנראה שאין לך תשובות לשאלות האלה. אוקיי, אולי לא כולם משתמשים במכונות האלה. הם לא כל כך פופולריים כרגע. בואו ננסה דוגמה אחרת. משהו שאתה בהחלט משתמש בו פעמים רבות כל יום. אה, יש לי רעיון! עקרונות אנקפסולציה - 2ספר לי איך עובד מנוע החיפוש של גוגל . איך בדיוק הוא מחפש מידע על המילים שאתה מזין? מדוע התוצאות הללו נמצאות בראש ולא אחרות? למרות שאתה משתמש בגוגל כל יום, אתה כנראה לא יודע. אבל זה לא משנה. אחרי הכל, זה לא משהו שאתה צריך לדעת. אתה יכול להשתמש במנוע חיפוש מבלי לחשוב איך בדיוק הוא עובד. אתה יכול לקנות סודה ממכונה מבלי לדעת איך היא בנויה. אתה יכול לנהוג במכונית מבלי להתעמק כיצד פועל מנוע הבעירה הפנימית ובלי לדעת אפילו פיזיקה בתיכון. כל זה אפשרי הודות לאחד העקרונות המרכזיים של תכנות מונחה עצמים: אנקפסולציה. בקריאת מאמרים שונים בנושא, בוודאי נתקלת בשני מושגי תכנות נפוצים: אנקפסולציה והסתרת מידע. כפי שזה קורה, אנשים שונים מבינים את המילה 'אנקפסולציה' במשמעות של דברים שונים. אנו נפענח את שני המונחים כדי שתהיה לך הבנה מלאה. בתכנות, המשמעות המקורית של אנקפסולציה הייתה שילוב נתונים ושיטות לעבודה עם הנתונים הללו בחבילה אחת ("קפסולה"). ב-Java, חבילת אנקפסולציה היא המחלקה . המחלקה מכילה גם נתונים (שדות) וגם שיטות לעבודה עם הנתונים האלה. עקרונות אנקפסולציה - 3זה אולי נראה לך מובן מאליו, אבל הכל מסודר אחרת בפרדיגמות תכנות אחרות. לדוגמה, בתכנות פונקציונלי, נתונים מופרדים בקפדנות מפעולות נתונים. בתכנות מונחה עצמים (OOP), תוכניות מורכבות מקפסולות (מחלקות) המורכבות הן מנתונים והן מפונקציות לעבודה עם נתונים.

עכשיו בואו נדבר על הסתרת מידע

איך אנחנו משתמשים בכל מיני מנגנונים מורכבים בלי להבין איך הם בנויים או איך הם עובדים? זה פשוט: היוצרים שלהם סיפקו ממשקים פשוטים ונוחים. במכונת סודה, הממשק הוא הכפתורים בפאנל הקדמי. כפתור אחד מאפשר לך לבחור את גודל הכוס. אתה בוחר את הסירופ עם כפתור שני. שליש אחראי על הוספת קרח. וזה כל מה שאתה צריך לעשות. זה לא משנה איך המכונה נראית מבפנים. הדבר החשוב הוא שהוא מעוצב כך שהמשתמש מקבל סודה על ידי לחיצה על שלושה כפתורים. אותו דבר חל על רכב. זה לא משנה מה קורה בפנים. הדבר החשוב הוא שכאשר אתה לוחץ על הדוושה הימנית המכונית נעה קדימה, וכאשר אתה לוחץ על הדוושה השמאלית המכונית מאטה. זוהי המהות של הסתרת מידע. כל ה"קרביים" של תוכנית מוסתרים מהמשתמש. מידע כזה מיותר או מיותר עבור המשתמש. המשתמש צריך תוצאה סופית, לא תהליך פנימי. לדוגמא, בואו נסתכל על מחלקת הרכב :
public class Vehicle {

   public void gas() {

       /* Some complicated things happen inside a car.
       As a result, it moves forward */
   }

   public void brake() {

       /* Some complicated things happen inside a car.
       As a result, it slows down */
   }

   public static void main(String[] args) {

       Vehicle vehicle = new Vehicle();

       // How everything looks to the user

       // Press one pedal, the car moves
       vehicle.gas();

       // Press the other pedal, the car brakes
       vehicle.brake();
   }
}
כך היישום מוסתר בתוכנת Java. ממש כמו בחיים האמיתיים: למשתמש מסופק ממשק (שיטות). בתוכנית, אם אתה צריך מכונית כדי לבצע פעולה, אתה פשוט קורא לשיטה הרצויה. מה שקורה בתוך השיטות האלה מיותר. מה שחשוב זה שהכל עובד כמו שצריך. כאן דיברנו על הסתרת יישום. לג'אווה יש גם הסתרת נתונים. כתבנו על זה בשיעור על גטרים וקובעים, אבל תזכורת לא תזיק. לדוגמה, יש לנו כיתת חתולים :
public class Cat {

   public String name;
   public int age;
   public int weight;

   public Cat(String name, int age, int weight) {
       this.name = name;
       this.age = age;
       this.weight = weight;
   }

   public Cat() {
   }

   public void sayMeow() {
       System.out.println("Meow!");
   }


}
אולי אתה זוכר משיעור שעבר מה הבעיה בשיעור הזה? אם לא, בואו ניזכר. הבעיה היא שהנתונים (השדות) שלו פתוחים לכולם. מתכנת אחר יכול ליצור בקלות חתול חסר שם עם משקל של 0 וגיל של -1000 שנים:
public static void main(String[] args) {

   Cat cat = new Cat();
   cat.name = "";
   cat.age = -1000;
   cat.weight = 0;

}
במצב זה, אתה יכול לעקוב בקפידה אם אחד מהקולגות שלך יוצר אובייקטים עם מצב לא חוקי, אבל זה יהיה הרבה יותר טוב לבטל אפילו את האפשרות ליצור אובייקטים לא חוקיים אלה. עקרונות אנקפסולציה - 4אנו משיגים הסתרת נתונים בעזרת:
  1. משנה גישה ( פרטי, מוגן, ברירת מחדל של חבילה );
  2. מגדירים וקובעים.
אנחנו משתמשים בהם כדי לבדוק אם מישהו מנסה לתת לחתול גיל שלילי. כפי שאמרנו קודם לכן, מחברי מאמרים שונים על אנקפסולציה מתייחסים למעשה ל-encapsulation (שילוב של נתונים ושיטות) או הסתרת מידע, או שניהם. לג'אווה יש את שני המנגנונים (זה לא בהכרח המקרה בשפות OOP אחרות), כך שהאפשרות האחרונה היא הנכונה ביותר.

אנקפסולציה מעניקה לנו מספר יתרונות חשובים:

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

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

  3. שינויים בקוד אינם משפיעים על המשתמשים. אנחנו עושים את כל השינויים בתוך השיטות. זה לא משפיע על המשתמשים: הם כתבו vehicle.gas() כדי להפעיל את הגז, וזה מה שהם ימשיכו לעשות. העובדה ששינינו משהו בתוך שיטת gas() נשארת בלתי נראית: כמו קודם, הם פשוט מקבלים את התוצאה הנדרשת.
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION