שאלה עיצובית

מ ג ש י ם

New member
שאלה עיצובית

פרויקט נוכחי שאני עובד עליו בנוי כרגע בצורה הזאת: שכבת לוגיקה, שכבת MMI, ועוד שכבה (מאין MMI Proxy) שמקשר בין שתי השכבות, על מנת שלא יהיה קשר ישיר בין הלוגיקה ל MMI, ובכך יהפוך אותו ל MMI "טיפש" השאלה שלי היא כזאת, כרגע השכבה האמצעית יוצרת אובייקט "ראשי" של MMI, שכל פעם שאני פותח איזהשהו חלון חדש בתוכנית, אובייקט החלון נוצר בתוך שכבת ה MMI. אם החלון הזה צריך איזשהו מידע מהלוגיקה, או לקרוא למטודה כלשהיא, הוא מפעיל אירוע שאובייקט ה MMI ה"ראשי" רשום אליו. אחר כך אותו אובייקט קורא שוב לאירוע דומה שרק הפעם השכבה המקשרת רשומה אליו, והיא כבר קוראת לפונקציה הנדרשת בשכבת הלוגיקה אז מה שקורה כאן זה שיש הרבה מקרים בהם אני כביכול משתמש ב"אותו" אירוע גם בחלון החדש, וגם באובייקט ה MMI ... פשוט שכפול קוד מיותר ומעצבן מהי הדרך הכי פשוטה לפתור את המטרד הזה? מקום אחד אולי שאני אוכל לרכז את כל האירועים? (רק לשים לב שלא כל חלון חייב בהכרח להכיר אירועים שלא קשורים אליו...) תודה
 

arnonrgo

New member
מה רצית

מה רצית להשיג בהצגת השכבה המתווכת? ארנון
 

מ ג ש י ם

New member
למעשה..

להפריד לחלוטין בין הלוגיקה ל MMI, אני לא רוצה שאף אחד מהם יכיר את השני, ובכך תהיה לי איזשהיא תלות בין MMI מסויים ללוגיקה למשל.. (כמו רעיון ה Model View Presenter) אז איך בעצם לממש את זה? עכשיו יש לי שכפול של די הרבה אירועים וdelegate'ים לא קשורים... פשוט מכוער
 

arnonrgo

New member
אם כך

אם כל מה שאתה רוצה זה למנוע תלות - פשוט השתמש בInterfaces הViews יכירו את ה Interfaces שהשכבה למטה חושפת MVP זה כבר משהו אחר לגמרי 1. זה pattern שחי כולו בתצוגה. הווה אומר הView הוא המסך (ללא לוגיקה תצוגתית) המודל הוא יצוג של ישויות מידע המתאימות לתצוגה והController (Presenter) הוא המתווך בינהם. 2. הPresenter מרכז את רוב הלוגיקה התצוגתית (הview רק מפרמט לתצוגה) וכך מגדיל את הבדיקתיות של הUI. למשל בדוגמא המצורפת הPresenter תלוי בInterfaces של כל הדברים מולם הוא עובד כך שפשוט לבנות לתלויות mockים ולבדוק אותו עצמאית
 

Zeliran

New member
לגבי הממשקים..

האם הרעיון הוא ליצור ממשק לכל טופס ב MMI ולדאוג שהשכבה האמצעית למשל תממש את כל הממשקים, בעוד בצד ה MMI כל טופס ירוש רק את הממשק שקשור אליו? אבל במצב הזה ה MMI עדיין יהיה מודע לממשק עצמו.. יש אפשרות להסיר אפילו את ה"תלות" הזאת?
 

arnonrgo

New member
MVP

הרעיון הוא שהלוגיקה התצוגתית (הpresenter) יהיה תלוי רק הממשק של הview ולא בview עצמו הpresenter צריך להיות מודע לevents בUI אבל ע"י תלות בממשק הוא לא תלוי במימוש הספציפי ארנון
 

gewitter

New member
אולי כדאי לשנות גישה

למה אתה עובד עם אירועים? יכול להיות שזה בסדר גמור, אבל כדאי לך להצליח לנמק. אחרת יתכן שיש דרך פשוטה יותר. אם אתה רוצה MMI טיפש, אז הוא לא אמור בכלל להצטרך איזהו מידע מהלוגיקה. אגב, זה מונח קצת מבלבל, מכיוון שלממשק הגראפי יכולה להיות לוגיקה די מסובכת, אז אני אקרא לליבה של התוכנה "דומיין". מישהו צריך להגיד לתוכנה לפתוח חלון, לאתחל טבלה וכו'. יש כאלה שקוראים לזה שכבת ה"אפליקציה". בכל אופן, כדאי שהחלונות שלך רק יקפיצו אירועים של ממשק גראפי, והאפליקציה, או הדומיין אפילו, יאזינו לאירועים (וזה אומר שהם מכירים את האובייקטים הטיפשים. זה גם בעייתי, כשאומרים לך מהגן שהלוגיקה לא מכירה את ה-GUI). במצב הכי רגיל שיש, בתור הקוד הנוצר לטיפול בלחיצת כפתור וכו', תהיה קריאה למתודות של הלוגיקה (או ישירות לדומיין, או לשכבה מפרידה כלשהי. יש שיקראו לה שכבת האפליקציה, יש שיקראו לה שכבת ה-Service, ויש שלא ישתמשו בארכיטקטורת שכבות). אם אתה רוצה ממשק טיפש, אז אתה רק מעביר את החוכמה למקום אחר, למשל ל-Controller, שמאזין לאירועי ה-GUI, במקום שיהיה delegate בתוך ה-GUI עצמו (מה שקורה כשלוחצים קליק-כפול ב-VS על פקד). לגבי Interface-ים, גם אם תשמש בהם, תהיה תלות בין הממשק לאובייקטים שמשתמשים בו, או שהוא משתמש בהם. אמנם לא תהיה תלוי מימוש (כלומר כל מחלקה המממשקת את ה-interface תספיק), אבל משני צדי הגבול יכירו את פרטי המידע שעובר (למשל כל תכונות הישות שצריך להציג בתור TextBox-ים). התלות מתבטאת בכך שאם תוסיף או תוריד או תשנה תכונה, או תוסיף למשל חוק ואלידציה, או תשנה חוק קיים, שני הצדדים מושפעים. אפשר לתכנת את זה נוח יותר, יפה יותר ומופרד ונהדר, אבל איך שלא תסובב את זה תהיה תלות. אתה גם חייב לפרט יותר כדי לקבל פיתרון שמתאים למצב שלך, במקום לקבל הרצאות באוויר.
 

Zeliran

New member
......

איך בעצם אני מעביר את ה"חוכמה" הזאת לשכבה המפרידה? ה MMI אמור להכיר את השכבה המפרידה הזאת, ופשוט לקרוא לפונקציה המתאימה? שתקשר ללוגיקה עצמה? אמרת גם שאם ה MMI באמת טיפש, הוא לא זקוק לשום דבר מהלוגיקה, אבל אם הוא כן? כלומר, אם הוא רוצה לקרוא מאיזשהו קובץ או משהו כזה, איך הוא יכול להשיג את זה?
 
למעלה