אייר (9)

מחלקה אבסטרקטית או ממשק?

 

לפני כמה שנים רכשנו מנוע חיפוש, והוטל עלי להתאים אותו לכליקיט, כלומר לתכנת את הכליקיט כך שיתקשר עם DLL של מנוע החיפוש. בשלב הראשון החלטנו להפעיל את החיפוש בפורומים. כמו-כן החלטנו שההתממשקות עם מנוע החיפוש תהיה דרך אובייקט XML, ושתהליך החיפוש יתרחש כך: לאחר שמשתמש יקליד את מחרוזת החיפוש בתוך תיבת הטקסט, תהיה מחלקה שתייצור אובייקט XML המכיל פרמטרים כמו: מחרוזת החיפוש, האינדקסים בהם יש לחפש, אילו שדות יש להחזיר בתוצאות החיפוש וכד’. לאחר מכן תהיינה כמה מחלקות שתפקידן יהיה לתרגם את ה-XML הזה למחרוזת חיפוש בפורמט שיובן ע”י מנוע החיפוש, להריץ את החיפוש, וליצור מתוצאות החיפוש אובייקט XML [הערת ביניים: הסיבה שבגללה החלטנו ליצור XML לשם התממשקות עם מנוע החיפוש, ולא כתבנו ישירות לתוך אובייקט החיפוש, היתה למקרה שמנוע חיפוש זה יוחלף בעתיד]. אובייקט ה-XML זה יועבר שוב למחלקה שמטפלת ב-XML של מנוע החיפוש, והיא תבצע בו כמה התאמות לרכיב הפורומים (ההתאמה החשובה ביותר היתה יצירת קישור: מנוע החיפוש רק מחזיר את כותרת ההודעה ותוכנה של ההודעה שתהאימה למחרוזת החיפוש, אך אין למנוע החיפוש דרך לדעת מהי הכתובת (URL) בה שוכנת אותה הודעה).
מנוע החיפוש של הפורומים עלה לאויר, וראינו כי טוב.
בעקבות ההדים החיוביים, הוחלט להרחיב את פעילות החיפוש גם לרכיב הטקסטים. כאשר ניתחתי את הקוד שאצטרך לשם כך, הגעתי למסקנה הבאה: המחלקות המקבלות את ה-XML, וכן אלה שיוצרות XML מתוך תוצאות החיפוש, תוכלנה לפעול as-is גם על רכיב הטקסטים, מפני שה-XML שמתקבל צריך להיות בעל מבנה זהה. ההבדלים בין חיפוש בפורומים לחיפוש ברכיב הטקסטים יתבטא רק במחלקה שיוצרת את ה-XML מתוך מחרוזת החיפוש של המשתמש, גם במתודות שלה שמתאימות את מחרוזת החיפוש לרכיב שבו מחפשים. על כן החלטתי ליצור מחלקה אבסטרקטית, שיוגדרו בה המשתנים המשותפים הן לפורומים והן לטקסטים, וגם תוגדרנה לה מתודות. המתודות מתחלקות לשתיים: מתודות וירטואליות, כלומר המכילות מימוש כלשהו של המתודה אך מאפשרות override של המחלקה היורשת, ומתודות אסטרקטיות, שהן למעשה רק החתימה של המתודה – על מתודות אלה חייבים לעשות override במחלקה היורשת. מתודות אבסטרקטיות היו כאלה שהמימוש שלהן בטקסטים שונה לגמרי מהמימוש שלהן בפורומים.
למה אני נזכרת כעת בפיסת היסטוריה זאת? כי נתקלתיבמאמר על ההבדל בין מחלקה אבסטרקטית לממשק (Interface). מצד אחד, אין בו חידושים גדולים. מצד שני, יש שתי סיבות שאהבתי אותו מאד ולכן החלטתי לדבר עליו כאן. הסיבה הראשונה היא שהוא מסדר בצורה מאד בהירה את ההבדלים בין מחלקה אבסטרקטית. המחבר יצר טבלה פשוטה ומוסברת היטב המשווה מימוש אספקטים שונים (כמו: יצירת משתנים, הוספת פונקציונליות, הומוגניות) במחלקה אבסטרקטית ובממשק, ועיון קצר בטבלה כזו מסייע מאד לקבל החלטה, אם נמצאים בצומת כזה בכתיבת הקוד. הדבר השני שאהבתי זה את העובדה שהוא נותן שם דוגמה. הדוגמה היא של מחלקת Employee, והוא מראה איך ניתן לממש אותה בתור מחלקה אבסטרקטית ואיך ניתן לממש אותה בתור ממשק. זה נכון שקצת קצה נפשנו במחלקות Person ו-employee שמייקרוסופט תמיד מאכילה אותנו בהן בעוד שהרלוונטיות שלהן לקוד שאנחנו צריכים להתמודד איתו ביומיום מוטלת בספק. אבל במקרה הזה דווקא הפשטות של המחלקה מקלה מאד לראות את ההבדלים – למשל, איך לא ניתן ליצור Members בממשק, ולא ניתן לממש שם מתודות. מאמר קצת ארוך בגלל הקוד הרבה שיש בו, אבל לדעתי הוא מרענן את הזכרון בצורה מצויינת.
 

כתבו תגובה

כתובת הדוא"ל שלכם לא תוצג.