sequence diagram

  • פותח הנושא yc3
  • פורסם בתאריך

yc3

New member
sequence diagram

שלום, אני צריכה לעשות sequence diagram לתוכנית שכתבתי. בתוכנית שלי יש מחלקה אבסטרקטית ושתי מחלקות שנגזרות ממנה. השאלה שלי: האם ב-sequence צריך לשרטט את הפונקציות שמוגדרות במחלקת הבסיס כאילו הן מתבצעות שם או לשרטט אותם במחלקות הנגזרות, יחד עם הפונקציות הוירטואליות שמוגדרות בהן. תודה מראש.
 

עידו פ

New member
הגיוני לשרטט את המחלקות הנגזרות

מהסיבה הפשוטה ש-Sequence מכיל אובייקטים ולא מחלקות (הדיאגרמה מתארת את זרימת המידע בין האובייקטים במערכת) ומאחר והמחלקה האבסטרקטית אינה מחלקה שניתן לייצר ממנה מופע (instance), נובע שהאובייקטים היחידים שיכולים להופיע ב-sequence הם האובייקטים של המחלקות היורשות.
 

yc3

New member
דווקא יש לי מופע למחלקת הבסיס

אני עושה לו new לפי המחלקה הנגזרת המתאימה. אז מחלקת הבסיס בכלל לא צריכה להופיע ב sequence? כי הרי בה הגדרתי את הפונקציות שאינן וירטואליות. האם זה שיש מחלקות נגזרות אומר שרק הן פועלות ומחלקת הבסיס לא פועלת? וכמובן, תודה על התשובה :)
 
משהו לא לגמרי מדויק בתיאור...

אם מחלקת הבסיס היא אבסטרקטית - אי-אפשר "לעשות לה new" (= ליצור ממנה מופעים). או שאת עושה new למחלקות הבסיס ושומרת את הרפרנסים במשתנים מטיפוס הבסיס, או שמחלקת הבסיס היא לא אבסטרקטית... לשאלתך - תלוי. המתודות שנדרסו ע"י מחלקת הבן - פועלות מהבנים, ואלה שלא - פועלות ממחלקת הבסיס (או אחת ממחלקות האב בהיררכיה).
 

עידו פ

New member
כנראה לא הבנת מה מטרת הדיאגרמה

המטרה היא להמחיש את הסדר הכרונולוגי של הפעלת המתודות בין האובייקטים השונים - אם מתודה נכתבה במחלקה האבסטרקטית, היא עדין מורצת בתכ'לס מהמחלקה היורשת. לדוגמה: אם המחלקה האבסטקרטית נקראית myabstract והמחלקה היורשת נקראת myderived אז בסופו של דבר המתודה, בין אם מוגדרת באבס' או ביורש היא מורצת באמצעות קריאה למופע של myderived בסופו של דבר, זה שהמתודה מורצת מתוך מחלקת האב, לא משנה לדיגארמת ה-sequence. אם מצד שני, את יוצרת מופע של המחלקה היורשת ומתייחסת אליה בתור מחלקת האב (פולימורפיזם), אפשר ואף מומלץ לציין זאת בדיאגרמה על-מנת שיהיה ברור איזו מתודה מאיזו מחלקה באמת רצה. מקווה שלא הצלחתי לבלבל אותך
 

yc3

New member
קטע מהקוד שכתבתי

מצטערת, אני עדיין לא ממש הבנתי איך אמורה להיראות ה sequence diagram שלי. אני מצרפת כמה קטעי קוד כדי להסביר קצת יותר את מה שעשיתי. מחלקת הבסיס שכתבתי - Game מוגדרת:
class Game { public: Game(int); void start(); void computerChoose(); virtual char* getCurrentPlayer()=0; vector<int> playerGuess(); int* checkGuess(vector<int>&);//return an array,whice it's first place is num of bools' and second place is num of pgiot void updatePlayerScores(); virtual void updateRecords()=0; void GameOver(int); int lookForBoolPgiaa(int,int);//get a num and it's index in the vector,return:1-if it's a bool, 2-if it's pgiaa, 0-if the num doesnwt appear in the vector virtual void showRecords()=0; protected: int level; vector<int> computerNum; Player currentPlayer; };​
ל-Game יש מחלקה נגזרת OnePlayer :
class OnePlayer:public Game { public: OnePlayer(int l, char* n); OnePlayer(); char* getCurrentPlayer(); void updateRecords(); void showRecords(); }; את הפונקציות הוירטואליות אני מממשת ב OnePlayer, שאר הפונקציות ממומשות ב Game. יש לי מחלקה נוספת-GameManager:
void GameManager::start() { Gui gui; Game *game=NULL; ... case 1://one player name1=(char*)strdup(gui.insertName()); game=new OnePlayer(level,name1); game->start(); ... }​
את הפונקציות הוירטואליות זה די ברור שצריך לשרטט בsequence כפונקציות שמופעלות ע"י OnePlayer, השאלה שלי היא מה קורה עם הפונקציות האחרות , כמו למשל עם הפונקציה void computerChoose , האם לשרטט אותה בטור של Game, או בטור של OnePlayer? ועוד שאלה- איך מראים ב sequence את האיתחול למחלקה OnePlayer? תודה רבה!!!
 

עידו פ

New member
-->

אחד משניים (להזכירך ל-sequence אין חוקים ומותר לעשות מה שנראה טוב): 1. לציין רק את מופע ה-Oneplayer - ככה ברור למי שרואה את ה-sequence שהמתודה מופעלת ממופע של oneplayer. לתוכניתן שיכתוב את המחלקה הזו יהיה ברור שהמתודה למעשה היא חלק ממחלקת game (בשביל זה יש class diagram) 2. לציין את האובייקט כשני מופעים - פעם אחת של game ופעם נוספת של oneplayer (בשניהם המופע יהיה באותו השם, רק בכל פעם הוא יהיה ממחלקה אחרת), כך אפשר לציין איזה מתודה נקראית מאיזו מחלקה "אמיתית". השיטה האחרונה היא יותר מסובכת להבנה לדעתי ועדיף לדבוק בראשונה. לגבי האתחול - אפשר פשוט לשרטט חץ למופע של one עם הפעלת מתודה new ולשרטט את ה-lifeline של המופע החל משם.
 
למעלה