330. Why encapsulation matters - part 1

אני רוצה לדבר על משהו ששמתי אליו שוב בפעם האחרונה.

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

לדוגמה, נניח ואנחנו רוצים לכתוב מחלקה שמתארת בית ספר:

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

פעולות שאפשר לעשות על בית ספר הם כאלה:

  • לגלות איזה שכבות יש בבית ספר
    • כיתות יש בשכבה מסוימת
      • איזה תלמידים יש בכיתה מסוימת
      • מי המחנכת של כיתה מסוימת
    • להוסיף כיתה לשכבה
      • להוסיף תלמיד לכיתה

אני מניח שרוב הפתרונות שאני אראה לבעיה זו יראו כך:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class School
{
public Dictionary<string, Dictionary<string, List<string>>> Students
{
get;
private set;
}
public Dictionary<string, Dictionary<string, string>> Teachers
{
get;
private set;
}
}

עכשיו, האם ענינו על כל הצרכים?

אולי, כי הרי אפשר לגלות מי התלמידים בכיתה מסוימת ע"י גישה לשכבה ואז לכיתה בDictionary של Students. באופן דומה, אפשר להוסיף או להסיר תלמיד מסוים לכיתה.

באופן שקול, אפשר גם לגלות גם מי המחנכת של כיתה מסוימת.

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

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

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

שבוע מוכמס לטובה.

שתף