ברוכים הבאים לשיעור הממוקד ביחידת "עיצוב מערכות מונחה עצמים (OOD)" בקורס "עקרונות פיתוח מערכות מידע" (20436). יחידה זו מתמקדת בתכנון ארכיטקטורת המערכת ורכיביה בגישה מונחית עצמים, ומהווה גשר קריטי בין שלב ניתוח המערכת (OOA) לבין שלב המימוש. הבנה מעמיקה של עקרונות OOD חיונית ליצירת מערכות גמישות, ניתנות להרחבה ולתחזוקה, והיא נבחנת רבות ביכולתכם ליישם עקרונות אלו בתרחישים מעשיים.
מהו עיצוב מערכות מונחה עצמים (OOD)?
עיצוב מערכות מונחה עצמים (Object-Oriented Design - OOD) הוא השלב בתהליך פיתוח תוכנה שבו אנו מתרגמים את הדרישות והמודלים שנוצרו בשלב הניתוח (OOA) למבנה קונקרטי של המערכת. בשלב זה, אנו מתכננים את הארכיטקטורה הכוללת של המערכת, את המודולים, המחלקות, הממשקים והיחסים ביניהם, תוך התחשבות בעקרונות תכנון מונחי עצמים. המטרה היא ליצור עיצוב יעיל, קריא, ניתן להרחבה ולתחזוקה.
עקרונות יסוד בעיצוב מונחה עצמים (SOLID)
עקרונות SOLID הם חמישה עקרונות תכנון מרכזיים המנחים את תהליך ה-OOD. יישום עקרונות אלו מוביל למערכות גמישות, מודולריות, קלות יותר לתחזוקה ולהרחבה. הבנה ויישום של עקרונות אלו הם אבן יסוד בהצלחה במבחן.
S - Single Responsibility Principle (SRP)
עיקרון האחריות היחידה: מחלקה צריכה להיות בעלת אחריות אחת ויחידה, וצריכה להיות רק סיבה אחת לשינוי בה.
O - Open/Closed Principle (OCP)
עיקרון פתוח/סגור: יש לתכנן ישויות תוכנה (מחלקות, מודולים) כך שיהיו פתוחות להרחבה (Open for extension) אך סגורות לשינוי (Closed for modification).
L - Liskov Substitution Principle (LSP)
עיקרון ההחלפה של ליסקוב: אובייקטים של מחלקת אב צריכים להיות ניתנים להחלפה באובייקטים של מחלקות בת מבלי לשבור את תקינות התוכנית.
I - Interface Segregation Principle (ISP)
עיקרון הפרדת הממשקים: לקוחות לא צריכים להיות תלויים בממשקים שאינם משתמשים בהם. עדיף מספר ממשקים קטנים וספציפיים על פני ממשק גדול וכללי.
D - Dependency Inversion Principle (DIP)
עיקרון היפוך התלויות: מודולים ברמה גבוהה לא צריכים להיות תלויים במודולים ברמה נמוכה. שניהם צריכים להיות תלויים בהפשטות (Abstraction). הפשטות לא צריכות להיות תלויות בפרטים, אלא הפרטים בהפשטות.
כלים וטכניקות מרכזיות ב-OOD
דיאגרמות UML
שפת המידול המאוחדת (UML) היא סטנדרט למידול ויזואלי של מערכות תוכנה. ב-OOD, אנו משתמשים בדיאגרמות UML כדי לתאר את מבנה המערכת והתנהגותה באופן ברור וחד-משמעי. דיאגרמות מפתח כוללות:
- דיאגרמת מחלקות (Class Diagram): מתארת את המחלקות במערכת, התכונות שלהן, הפעולות שלהן והיחסים ביניהן (אסוציאציה, ירושה, הרכבה).
- דיאגרמת רצף (Sequence Diagram): מתארת את האינטראקציה בין אובייקטים בסדר כרונולוגי, ומציגה את זרימת המסרים ביניהם עבור תרחיש ספציפי.
- דיאגרמת מקרי שימוש (Use Case Diagram): מתארת את הפונקציונליות של המערכת מנקודת מבטו של המשתמש (Actor). משמשת בעיקר בשלב הניתוח אך רלוונטית גם בעיצוב.
תבניות עיצוב (Design Patterns)
תבניות עיצוב הן פתרונות מוכחים לבעיות עיצוב נפוצות בהנדסת תוכנה. הן מספקות שפה משותפת למעצבים ומאפשרות יישום פתרונות אלגנטיים ויעילים תוך שמירה על עקרונות OOD. דוגמאות כוללות Singleton, Factory, Observer ועוד. הבנה של תבניות עיצוב מסייעת ביישום עקרונות SOLID ובבניית מערכות גמישות.
מעבר מאנליזה לעיצוב ואתגרי OOD
המעבר מניתוח (OOA) לעיצוב (OOD) כרוך בהוספת פרטי מימוש. בעוד שבניתוח אנו מתמקדים ב"מה" המערכת צריכה לעשות, בעיצוב אנו מתמקדים ב"איך" היא תעשה זאת. אתגרים נפוצים כוללים:
- הידוק צימוד (Tight Coupling): מצב שבו רכיבים תלויים זה בזה באופן חזק מדי, מה שמקשה על שינוי או החלפה של רכיב אחד מבלי להשפיע על אחרים.
- לכידות נמוכה (Low Cohesion): מצב שבו רכיב (למשל, מחלקה) מבצע מספר רב של משימות שאינן קשורות זו לזו, מה שמקשה על הבנתו, שינויו ותחזוקתו.
OOD שואף להשיג צימוד רופף (Loose Coupling) ולכידות גבוהה (High Cohesion) באמצעות יישום עקרונות SOLID ותבניות עיצוב.
שאלות לדיון
- נתונה מערכת לניהול ספרייה. תארו כיצד הייתם מיישמים את עקרון האחריות היחידה (SRP) עבור מחלקה המטפלת בספרים, וכיצד הייתם מונעים הפרה של עיקרון זה.
- הסבירו את הקשר בין עקרון הפתוח/סגור (OCP) לבין שימוש בתבניות עיצוב. תנו דוגמה לתבנית עיצוב התומכת ב-OCP.
- כיצד דיאגרמת מחלקות ודיאגרמת רצף משלימות זו את זו בשלב ה-OOD? מתי תבחרו להשתמש בכל אחת מהן?
- נתונה מחלקה בשם
PaymentProcessorהמכילה מתודות לטיפול בתשלום בכרטיס אשראי, תשלום ב-PayPal וגם לניהול היסטוריית תשלומים. אילו עקרונות SOLID מופרים כאן, ומדוע? הציעו עיצוב חלופי.
נקודות לתשובת מודל
- לגבי SRP בספרייה:
- הגדרת אחריות יחידה למחלקת
Book(למשל, אחסון פרטי הספר). - הפרדת אחריות לטיפול בפעולות כמו שמירת ספר במסד נתונים (למחלקה
BookRepository) או הצגת פרטי ספר (למחלקהBookPresenter). - הסבר כיצד הפרדה זו מונעת שינויים במחלקת
Bookכאשר משתנה לוגיקת שמירה או תצוגה.
- הגדרת אחריות יחידה למחלקת
- לגבי OCP ותבניות עיצוב:
- הסבר ש-OCP דורש שהמערכת תהיה ניתנת להרחבה ללא שינוי קוד קיים.
- תבניות עיצוב רבות, כמו Strategy או Decorator, מאפשרות להוסיף פונקציונליות חדשה (הרחבה) על ידי הוספת מחלקות חדשות, מבלי לשנות את הקוד הקיים (סגור לשינוי).
- דוגמה: תבנית Strategy עבור שיטות תשלום שונות, כאשר כל שיטת תשלום היא מחלקה נפרדת המממשת ממשק משותף.
- לגבי דיאגרמות UML:
- דיאגרמת מחלקות: מתארת את המבנה הסטטי של המערכת (מיפוי ישויות, תכונות, יחסים). משמשת לתכנון ארכיטקטורה כללית.
- דיאגרמת רצף: מתארת את ההתנהגות הדינמית של המערכת עבור תרחיש ספציפי (זרימת הודעות בין אובייקטים). משמשת לבדיקת תרחישים קריטיים ואימות אינטראקציות.
- הן משלימות זו את זו: דיאגרמת מחלקות מספקת את ה"שחקנים" (המחלקות), ודיאגרמת רצף מראה כיצד הם "משחקים" יחד בתרחיש מסוים.
- לגבי
PaymentProcessor:- הפרת SRP: המחלקה אחראית על מספר דברים שונים (עיבוד תשלום בשיטות שונות וניהול היסטוריה). שינוי בשיטת תשלום אחת או באופן ניהול ההיסטוריה יחייב שינוי במחלקה זו.
- הפרת OCP: הוספת שיטת תשלום חדשה תחייב שינוי במחלקת
PaymentProcessorהקיימת. - עיצוב חלופי:
- הפרדת האחריות: מחלקה
PaymentProcessorכללית שתקבל ממשקIPaymentStrategy. - מחלקות ספציפיות כמו
CreditCardPaymentStrategy,PayPalPaymentStrategyשיממשו את הממשק. - מחלקה נפרדת
PaymentHistoryManagerלטיפול בהיסטוריה. - הסבר כיצד עיצוב זה עומד בעקרונות SRP ו-OCP.
- הפרדת האחריות: מחלקה