object oriened and swtich

צונאמי

New member
object oriened and swtich

שלום לכולם, הבנתי שלא מקובל כל כך להשתמש ב-switch כדי לגלות מה הטיפוס הקונקרטי של האובייקט. (לצרכי DOWNCAST) (לצורך העניין אני כותב ב-++C) למה לא מקובל ? איזה בעיות יכולות להתעורר ? ומה כן מקובל ? תודה מראש,
 

vinney

Well-known member
לא שלא מקובל, אין כזה צורך

אם אתה רוצה לבצע פעולה זהה על טיפוסים שונים - יש לך 2 אפשרויות: א. לכתוב את אותה הפונקציה עם פרמטרים מטיפוסים שונים כל פעם (OVERRIDE) ב. לכתוב פונקציה שמבצעת את הנדרש במחלקת הבסיס שממנה אתה יורש את המחלקות שלך, כשבמחלקת הבסיס הפונקציה היא VIRTUAL. במחקות יורשות אתה מממש את הפונקציה מחדש (אם יש צורך) עבור המחלקה הספציפית. במקרה הזה מנגנון ++C יזהה את המחלקה המדויקת., ויקרא לפונקציה מהמחלקה הנכונה. שימוש ב SWITCH יכול לגרום לבעיות כשאתה רוצה לעשות REUSE לקוד שלך עם טיפוסים חדשים. עם שימוש בא' וב' שרשמתי, לא תצטרך לשנות קוד קיים, רק להוסיף. עם שימוש בSWITCH - תצטרך לשנות קוד קיים.
 

צונאמי

New member
קודם כל תודה + המשך

מה היית עושה לדוגמא במצב הבא: יש לך מחלקה שרת שמאפשרת את הפעולה LOGIN כאשר יש סוגי משתמשים שונים. LOGIN תחזיר מן הסתם סוג אובייקט יחיד. + אני רוצה להציג לכל סוג משתמש ממשק שונה. (פעולות שונות) (לעניין שלנו כל העסק נמצא במחשב אחד) אז הבעיה עם SWITCH זה שיש צורך לשנות קוד קיים.. ושאם יש צורך להוסיף/להחליף/להוריד אובייקטים אז לך תתחיל לחפש את כל ה-switch-ים .. הבנתי נכון ? אתה רואה עוד בעיות עם זה ?
 

צונאמי

New member
בגדול מה לעשות שיש צורך להתיחס

לטיפוס הקונקרטי ? (בגלל מתודות שקיימות בו ולא במחלקות האב)
 

Zack DA

New member
הערות:

1. אני לא מכיר את הצרכים שלך, אבל נסה לבדוק למה אתה לא יכול לפתור את הנושא בגישה ה- oo-ית. יכול להיות שכל- user צריך להחזיק מצביע לתת טיפוס של ה- Gui שמתאים לו (כמובן קיימים פתרונות הרבה יותר יפים, זה פשוט תלוי במה שאתה עושה ומה הדיזיין שלך). 2. במקרה הכי גרוע, אני ממליץ במקום switch להשתמש ב- registry שיכיל בתוכו את כל הקשרים (מקשר ב- hash בין type של user לבין ה- subtype של ה- GUI שהוא יקבל, אבל בכל מקרה switch זה דבר מגעיל.
 

צונאמי

New member
welcome!

1. הצרכים שלי הם ללימוד בלבד כרגע. שכל USER ידע מאיזה טיפוס הוא ? הממממ....לא נראה לי! איך אתה היית מתכנן את החלק הזה של המערכת ? בנתיים חקרתי שתי אפשרויות שונות: 1. ה-SWITCH האהוב. 2. התקנה של פונקציות HANDLER עבור כל משתמש שיקראו אוטומטית עם ביצעו ה-LOGIN (הLOGIN יקרא ע"י פולימורפיזם ויקרא ל-HANDLER המותקן) 2. מה יותר מגעיל: SWITCH או GOTO ?
אני די בטוח שתאהבו את 2 יותר ... אבל חסר ניסיון שכמוני 1 נראת לי יותר מושכת ... (בגלל זה אם תוכלו מהניסיון שלכם להגיד לי איזה צרות יכול לגרות שימוש ב- SWITCH ?) - בנתיים פרט לזה שצריך לשנות אותו וזה לא ממש קריטי אם הוא מבודד אז אני לא רואה בעייה.
 

Zack DA

New member
אם כל user מקושר ל- gui מסוים,

אתה צריך להחזיק את הקישור הזה. והוא יכול להיות בכל user או ב- registry נפרד. מה כאן לא ברור ?
 

צונאמי

New member
LOGIN

זה לא כמו לבקש מכל משתמש שיחזיק גם מאיזה טיפוס הוא ? ואז למשל שאתה עושה LOGIN למערכת הפעלה במקום להכניס רק שם מתשמש וסיסמא תצטרך גם להכניס מאיזה טיפוס אתה...? המטרה שהסוג יהיה מוסתר מהמשתמש ... שהוא יכניס שם משתמש + סיסמא והתוכנית כבר תדאג לתת לו את מה שהוא צריך לקבל. (יהיה אשר יהיה)
 

gmorph

New member
FACTORY

זה design pattern ונראה שזה מה שאתה מחפש.בכל מקרה, יש לי הרגשה שאין לך דרך להמנע מSWITCH אחד. כלומר המשתמש מכניס שם וסיסמא ולפי השם אתה מחפש באיזושהי טבלה איזה טיפוס הוא ובעזרת SWITCH יוצר את האובייקט. אבל זו הפעם היחידה שאתה צריך להשתמש בסוויץ´.
 

selalerer

New member
הצעה:

USER בסיסי:
class userBase { private: string name; string pswd; protected: bool check(string name,string pswd); public: userBase(string name,string pswd):name(name),pswd(pswd){} virtual void login()=0; }​
וממנו תירש ותיישם את login:
class user1:public userBase { public: void login(){//......} user1(string name,string pswd):userBase(name,pswd){} }​
 

צונאמי

New member
זו לא השאלה....

השאלה היא מה לעשות אם קיבלת את userBase ואתה רוצה להתיחס למתודה ספציפית ב-user1. (ונניח שuser1 הוא לא היחיד שיורש אותו כמובן)
 

vinney

Well-known member
VIRTUAL

מתודה ספציפית צריכה להיות כללית, ולכל בן של USERBASE יהיה את המימוש (או אימימוש בדמות return) משלה.
 

gmorph

New member
לא ממש מסכים

אני חושב שמה שהצעת די מכוער. לשים פונקציה באבא מתוך ידיעה שיהיו בנים שפשוט יעשו RETURN זה מנוגד לoo.אני לא רואה שבו אתה צריך לקרוא למתודה ספציפית כשיש לך רק מצביע לבסיס. אנא האר את עיני.
 

vinney

Well-known member
מסכים איתך

אבל זאת הבעיה שהוא הציג. המקור שלה היא בDESIGN עקום. אתה לא יכול לקרוא לפונקציה ספציפית כשיש לך רק מצביע לבסיס.
 

צונאמי

New member
DESIGN עקום !!! ../images/Emo46.gif

איזה DESIGN אתה מציע ? (הבעיה היא בעיה כללית - LOGIN)
 

vinney

Well-known member
הפתרון של צחי לא רע

לקשור את הGUI לאובייקט עצמו, ואז הLOGIN שלך יקרא רק למתודות וירטואליות בבסיס, שבין היתר גם יחזירו לו את האובייקט שצריך לצייר
 

צונאמי

New member
לא נראה לי

יכול להיות שלא הבנתי פשוט.. לא עדיף להפריד את ממשק המשתמש מהמערכת עצמה ? (לפי מה שהבנתי מההצעה הזו ... המערכת תלוייה בממשק.)
 
למעלה