430 likes | 745 Views
SCE - 14 דרישות ומודולריות של מרכיבים דר’ יעקב אקסמן תשס"ו. הנדסת מרכיבי תוכנה. דרישות תוכנה. דגם הייררכי. דגם פיזיקלי. מרכיבים. קוד להרצה = exe. מדידות. שלבי פיתוח "מפל המים" דרישות תוכנה. Software Requirements. Application Requirements. Test. Test. Specifications. Test.
E N D
SCE-14 דרישות ומודולריות של מרכיבים דר’ יעקב אקסמן תשס"ו
הנדסת מרכיבי תוכנה דרישות תוכנה דגם הייררכי דגם פיזיקלי מרכיבים קוד להרצה = exe מדידות
שלבי פיתוח "מפל המים" דרישות תוכנה Software Requirements Application Requirements Test Test Specifications Test Detailed Design Test Implementation Test Experimentation Debugging Test Maintenance Test
דרישות מטריצת T מטריצת עקיבות Traceability Matrix
דרישות מטריצת T Traceability Matrix מרכיבים דרישות
דרישות T-Matrix • מטריצת עקיבות Traceability Matrix • מטרהCheck List • כל דרישה סופקה לפחות ע"י מרכיב אחד • כל מרכיב מספק לפחות דרישה אחת
דרישות T-Matrix T- Matrix DERA – March 2000
דרישות מודולריות עקרון המודולריות בתיכון מודולרי לכל דרישת תוכנה יש רק מרכיב אחד שמספק את הדרישה.
דרישות מודולריות מודולריות הסבר לעיקרון אם חל שינוי בדרישה, יש לשנות רק מרכיב שמספק אותה דרישה
דרישות מטריצת T T-Matrix על פי עיקרון המודולריות מטריצה אלכסונית = מטריצת זהות מרכיבים דרישות
דרישות ספרות [Parnas-1972] Parnas, David L. “On the Criteria to be Used in Decomposing Systems into Modules”, Comm. ACM, 15, 1053-1058 (1972)
דרישות Parnas Parnas’ KWIC Index מערכת יוצרת מפתח "הזזות מעגליות" (Circular Shifts) לפי סדר א-ב KWIC = “KeyWord In Context”
דרישות KWICדוגמה • Parnas’ KWIC Index • Keyword in Context index • in Context index Keyword • Context index Keyword in • index Keyword in Context
דרישות Parnas – Mod 1 דרישות תוכנה R1: Input = ordered set of lines R2: Line = ordered set of words R3: Perform circular shift on each line R4: Sort circular shifted lines in alphabetical order R5: Output = lists all circular shifts of all lines
דרישות Parnas – Mod 1 • מודולריזציה 1 • מרכיבים • C1: Input • C2: Circular Shifter • C3: Alphabetizer • C4: Output • C5: Master Control
דרישות Parnas – Mod 1 מודולריזציה 1 T-Matrix • Inp Cshift Alphab Outp MContr Input lines Line of words Perform circular shift Sort Output
דרישות Parnas – Mod 1 • מודולריזציה 2 • מרכיבים • C1: Input • C2: Line Storage • C3: Circular Shifter • C4: Alphabetizer • C5: Output • C6: Master Control
דרישות Parnas – Mod 2 מודולריזציה 2 T-Matrix • Inp Lstor Cshift Alphab Outp MContr Input lines Line of words Perform circular shift Sort Output
דרישות Parnas • Parnas • מרכיבים – מופיעים במפורש במאמר • דרישות – ניתן להסיק
דרישות Parnas Parnas מסקנות תיכון-2מודולרי יותר מתיכון-1 תיכון-2: בוצע סילוק צימוד בין מרכיבים (decoupling)
דרישות Parnas השוואה T-Matrix תיכון 2 תיכון 1
עקרונות מודולריות עקרונות מודולריות Modularity Principles
עקרונות אחראיות בלעדית עקרון אחראיות בלעדית Single Responsibility Principle למרכיב צריך להיות סיבה אחת ויחידה לשינויים.
עקרונות אחראיות בלעדית • אחראיות בלעדית • דוגמה • אם מחלקה משתנה עקב שנויים ב ממשק GUI • אז שינויים ב • מסד נתונים • לוגיקת החישוב • לא צריכים להשפיע עליה.
עקרונות אחראיות בלעדית עקרון סגירות-פתיחות Open-Closed Principle מרכיבים צריכים להיות פתוחים להרחבה (extension) סגורים לשינוי(modification) .
עקרונות סגירות-פתיחות סגירות-פתיחות דוגמה יש לעשות הרחבות ע"י הורשה (למשל ע"י תת-מחלקות) ולא שינויים בתוך המחלקה.
עקרונות ספרות [Liskov-1988] Liskov, Barbara “Data Abstraction and Hierarchy”, , SIGPLAN Notices, 23,5 (May, 1988).
עקרונות LSP obj2 T S obj1 • עקרון הצבה של Liskov • Liskov Substitution Principle • If for each object obj1 of type S • there is an object obj2 of type T • such that • for all programs P defined in terms of T, • the behavior of P is unchanged • when obj2 is replaced by obj1 • then S is a subtype of T.
עקרונות LSPLiskov - הסבר obj2 T S obj1 הסבר LSP תת-מחלקה מכירה את מחלקת ההורה (כיווןהחץ) לכן ההתנהגות לא משתנה. LSPלא סימטרי: אי-אפשר להחליף Obj1 ב- Obj2 החץ אינו דו-כיווני
עקרונות LSPLiskov - דוגמה נגדית צורות void DrawShape(const Shape& s(} if (typeid(s) == typeid(Square)) DrawSquare(static_cast<Square&>(s)); else if ( typeid(s) == typeid(Circle)) DrawCircle(static_cast<Circle&>(s)); } מה הבעיה?
עקרונות LSPLiskov - דוגמה נגדית • צורות • DrawShape • בעייה • הפונקציה צריכה להכיר כל צורה וצורה • תשתנה כל פעם שנוסיף צורה חדשה
עקרונות LSPLiskov - דוגמה נוספת מלבן ריבוע מלבן וריבוע המקרה הפרטי יורש מן המקרה הכללי.
עקרונות LSPLiskov - דוגמה נוספת מלבן וריבוע class Rectangle { public: void SetWidth(double w) {itsWidth=w;} void SetHeight(double h) {itsHeight=w;} double GetHeight( ) const {return itsHeight;} double GetWidth( ) const {return itsWidth;} private: double itsWidth; double itsHeight; };
עקרונות LSPLiskov - דוגמה נוספת מלבן וריבוע void Square::SetWidth(double w){ Rectangle::SetWidth(w); Rectangle::SetHeight(w); } void Square::SetHeight(double h){ Rectangle::SetHeight(h); Rectangle::SetWidth(h); }
עקרונות LSPLiskov - דוגמה נוספת מלבן וריבוע Square s; s.SetWidth(1); גם השמה של Height=1 s.SetHeight(2); גם השמה של Width=2
עקרונות LSPLiskov - דוגמה נוספת מלבן וריבוע פונקציה func מבוססת על פונקציות של מלבן void func (Rectangle& r) { r.SetWidth(32); // Rectangle::SetWidth קוראת ל- } מה הבעייה?
עקרונות LSPLiskov - דוגמה נוספת מלבן וריבוע הבעייה:פונקציה f אם נקראת ע"י ריבוע משבשת משתנים של ריבוע
עקרונות LSPLiskov - סוגיות יסוד Liskov SP מהי הורשה?
עקרונות LSPLiskov - דוגמה נוספת מלבןוריבוע תיקון class Rectangle { public: virtual void SetWidth(double w) {itsWidth=w;} virtual void SetHeight(double h) {itsHeight=h;} double GetHeight( ) const {return itsHeight;} double GetWidth( ) const {return itsWidth;} private: double itsHeight; double itsWidth; };
עקרונות LSPLiskov - דוגמה נוספת מלבן וריבועתיקון class Square : public Rectangle{ public: virtual void SetWidth(double w); virtual void SetHeight(double h); }; void Square::SetWidth(double w) { Rectangle::SetWidth(w); Rectangle::SetHeight(w);} void Square::SetHeight(double h){ Rectangle::SetHeight(h); Rectangle::SetWidth(h);}
עקרונות LSPLiskov - דוגמה נוספת מלבן וריבוע בעייה נוספת void g(Rectangle& r){ r.SetWidth(5); r.SetHeight(4); assert(r.GetWidth() * r.GetHeight()) == 20); } פונקציה עובדת עבור מלבן מחזירה שגיאה עבור ריבוע
עקרונות LSPLiskov - סיכום Liskov SP במקצוע המופשט אין קושי להבחין בין המקרה הפרטי ריבוע המקרה הכללי מלבן בתוכנה ירושה לא בהכרח מקיימת את ההבחנה.