תבנית MVC שימוש ב C# - דיון - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

תבנית MVC שימוש ב C# - דיון


sharpsharp

Recommended Posts

תבנית MVC ידועה כתבנית לכתיבת תוכנות. אני רוצה לתת דוגמא ולהתייעץ , מה כדאי לעשות. מבחינת העיצוב.

ואיך ליישם זאת ב C# עבור דוגמא שאתן, אמשמח עם אנשים יחלקו את תובנתם בנושא. (יש כמה דברים שאני לא סגור אליהם)

תבנית MVC.(נשאיר את זה כקיצור, לנוחות)

M - אלו כל המחלקות שמייצגות את המידע (נתונים)

V - התצוגה הגרפיץ

C - אחראי על חיבור בין M ל V.

כאשר C מכיר את M ו V.(מכיר הכוונה שמחזיק מופע של המחלקה אצלו)

V מכיר את M.

כעת אני רוצה להשתמש ב C# עם דוגמא קטנה לשם הדיון.

דוגמא: יש לנו עגלת קניות שכל מה שניתן לעשות זה הוספה של מוצר, הסרה של מוצר ועידכון המוצר.

כאשר המוצר מכיל את שם המוצר (לשם העניין לא חוזר פעמיים אותו שם מוצר) וכמות.

עכשיו למחלקות שיש ליצור:

ב M:

1. מוצר - מכיל שתי שדות שם המוצר(שם ייחודי) וכמות (שהקונה רוצה לקנות)

2. עגלת קניות - מחזיקה שדה של רשימה של מוצרים.

ב V:

1. MainForm שמכיל ListControl עם שלושה כפתורים : הוספה, הסרה , עדכון.

2. ItemForm - מייצג Form שמוצג כ Dialog. שמכיל שתי TextBox שם המוצר וכמות

ושתי כפתורים אישור וביטול.

3. ניצור איזה GuiFacade שמכיר את כל שאר ה Forms וה C מכיר רק אותו.(כל הפניות נעשים דרכו בלבד)

מקרים ותגובות:

1. כאשר לוחצים על הוספה, נפתח ItemForm מכניס שם מוצר וכמות, לוחצים אישור ונוסף מוצר חדש.

אם שם המוצר כבר קיים יש ליזרוק MessageBox שהמוצר כבר קיים בעגלה ולא ניתן להוסיף אותו מוצר (אלא לשנות את הכמות בלבד)

2. בוחרים ב ListControl מוצר ולוחצים על הסרה, המוצר מוסר מעגלת הקניות

3. בוחרים ב ListControl מוצר ולוחצים על עדכון נפתח נפתח ItemForm וניתן לשנות רק את הכמות, ללחות אישור והערך יעודכן.

הערות :

לא ניתן להכניס מספר שלילי בכמות (יש לבדוק זאת ולתת הודעת שגיאה בהתאם ב MessageBox)

שאלה 1:

מבחינה עיצובית איפה הייתם בודקים את הקלט, ולמה?

האם הייתם בודקים זאת ב ItemForm כאשר המשתמש מכניס את הערך(עושים לו parse כיוון שהוא מגיע כ string וצריך אותו כמספר)

ואז זורקים הודעת שגיאה בהתאם במקום ב MessageBox. אל תשכחו שהמשתמש יכול להכניס לכם גם אותיות ואז ה Parse נכשל - Exception.

או שדווקא את הבדיקה הייתם עושים באובייקט מוצר. (ואז הייתם בודקים שם שהערך חיובי בלבד והייתה צריכה כל מקה להתבצע בדיקה ו parsing ב ItemForm.

שאלה 2:

בא ניקח את מקרה 1 - כמו שתואר הוספת מוצר לעגלה.

אני אתאר את התהליך שחשבתי עליו.

המשתמש לוחץ ב GUI על כפתור ההוספה. מוקפץ event של הלחיצה ואני מקפיץ event נוסף שמודיע

ל GUIFacade שנלחת הכפתור הוא מעלה event ל C. כעת C יכול לפנות ל M (ליצור מוצר והלוסיפו לעגלת הקניות שממוצמשת כרשימה)

איך הייתם מעצבים את הקוד כאן. האם הייתם מעלים את ה event עד ה C ושם כותבים את כל הקוד.

כלומר פניה מ C (פונקציה) לGUIfacede על מנת שיפתח את ItemForm. המשתמש ישים ערכים ו כאשר ילחץ על אישור יוחזר אובייקט מוצר (שנוצר ב GuiFacade) המכיל את הכמות והשם

ה C יבדוק אם הערך לא null יוסיף אותו לאובייקט עגלה (אם קיים לא יוסיף וה C יפנה לGUIFacade שיציג MessageBox עם הודעה שהאובייקט קיים) ויעדכן את ה GUI נניח ע"י Observer.

או ב C# על bindingSource (לחסות את תבנית Observer או שאולי לא כדאי לוותר על התבנית)

או שכשאר נלחץ כפתור הוספה יקפוץ event שה MainForm יתפוס יקפיץ את הדיאלוג ItemForm יבדוק אם המשתמש הכניס ערכים נכונים פירסור כולל בדיקה שלא הוכנס ערך שלילי.

אם הכל בסדר ונלחץ אישור (ע"י שימוש ב DialogResult) יווצר ה מוצר החדש ואז נקפיץ event עד לc עם המוצר החדשץ וכעת C יבדוק אם הוא קיים אם לא יוסיפו אם קיים יצטרך לפנות ל GUIFacade

שיקפיץ MessageBox שהמוצר כבר קיים.

אני דיי לא סגור כיצד כדאי לעשות זאת (איפה לכתוב את הקוד האם הכל ב C או חלק ב GUI וחלק ב C ואיך כדאי לעשות זאת)

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

כעת אני אסתפק עד כאן, עם למישהו יהיה רעיונות אני אשמח להמשיך ןלדון איתו על הנושא.

תודה

קישור לתוכן
שתף באתרים אחרים

אני אתן את דעתי (הלא מלומדת) אבל אני חושב שנוח לעבוד ככה ;)

לגבי שאלה מס' 1

מכיוון שיש לך מוצר ועגלת מוצרים לפי דעתי עגלת המוצרים צריכה לעשות את הבדיקה בפונקציית ה-ADD שלה, וד"א לא חייב לקפוץ EXCEPTION ב PARSE

אם תשתמש בפונקציה tryParse.

לגבי 2

הייתי מעלה איוונט שיפתח את הטופס כמו שהצעת בחלק הראשון של התהיה שלך

קישור לתוכן
שתף באתרים אחרים

קודם כל, עגלת הקניות תמיד צריכה לבדוק את הקלט ולזרוק חריגות בהתאם לצורך, משום שהיא צריכה להיות יחידה עצמאית שלא מסתמכת על הנחות חיצוניות (היא לא יכולה להניח שדווקא ה-GUI שאתה כתבת יהיה זה שמשתמש בה).

בגדול, עדיף להימנע משימוש בחריגות בשביל בקרת זרימה. כלומר, כמו שצוין מעליי, עדיף להשתמש ב-TryParse מאשר ב-Parse. אם אתה מצפה שייתכן שהמשתמש יכניס קלט שגוי, מומלץ להוסיף לעגלת הקניות פונקציית validation שמוודאת שהקלט אכן תקני, עוד לפני שמוסיפים את המוצר עצמו (אם זה אפשרי, כמובן).

קישור לתוכן
שתף באתרים אחרים

קודם כל תודה על התגובות, אחרי 160 צפיות ללא תגובה אחת הייתי כבר סקפתי אם מישהו יענה.

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

המשתמש לחץ על כפתור הוספת מוצר. אני מעלה event מה mainForm ל GuiFacade שהוא מעלה event ל C.

ה C מקבל שליטה ומתחיל לבצע את ההוספה הוא פונה ל GUiFacade (פונה לפונקציה f) שיקפיץ את ה ItemForm המשתמש מכניס את הערכים שהוא רוצה בין אם הוא מכניס ערכים נכונים בין אם לא. ואז לוחץ אישור. כעת באותה פונקציה f שכתובה ב GuiFacade מייצרת אובייקט של מוצר. כעת האובייקט מוצר מחזיר "מוצר" רק במידה והערכים שהוכנסו נכונים במידה ולא, יוחזר null. פונקציה f מחזירה "מוצר" (או null). הפונקציה ב C ממשיכה ובודקת אם הוחזר אובייקט מוצר (כלומר לא null) אז המוצר תקין ולכן ה C יפנה לעגלת הקניות ויבקש להכניס את המוצר.

אם המוצר קיים בעגלה הקניות, העגלה תחזיר שקיים הערך ולכן ה C יפנה ל GuiFacade ויבקש ממנו להקפיץ MessageBox עם הודעה "קיים מוצר בעגלת קניות".

כמה בעיות:

1. במידה והוכנסו ערכים לא נכונים מי שיודע זאת זה ה C כיוון שחזר ערך null, כיצד הוא ידע אם הוחזר מ f null בגלל שנלחץ אישור והערכים לא היו נכונים או שהמשתמש לחץ על ביטול ואז הוחזר null.

2. במידה ואני רוצה להשתמש ב errorProvider ולהציג הודעה לכל TextBox שלא הוכנס ערך מתאים (גם לשם וגם לכמות), איפה הייתם כותבים זאת ומתי הייתם קוראים לזה.

אשמח לתשובות, ומה אתם הייתם עושים

קישור לתוכן
שתף באתרים אחרים

בפוקציה שב C שרצה בעקבות ה event. מקבלת sender אבל בכל מקרה שהו זה אותו ה sender מי שב mainForm העלה את ה event.

אז לא הבנתי איך בדיוק אתה מזהה אם מהפונקציה f חזר Null בגלל שהערכים לא היו נכונים והאובייקט "מוצר לא א נוצר או שלחצו על ביול וחזר nullץ

אני מדגיש שוב שאמח לשמוע חוות דעת בכלל לגבי התהליך שציינתי ולגבי כל דבר שמיקמתי מ MainForm עד ה C.

מה שכן אפשר לעשות זה כאשר רצה הפונקציה f שנמצאת ב GUiFacade והיא פותחת את ה ItemForm היא יודעת כשהוא נסגר לפי ה DialogResult שנלחץ ביטול (כמו כן אם היא לא הצליחה ליצור את האובייקט מוצר) ואז היא תשלח ב eventArgs משתנה נניח שנקרא לו Cancel שיעלה ל true אם נלחץ ביטול.

ואז ה C יבדוק את ה eventArgs אם Cancel==true נלחץ ביטול ולחן המוצר שחזר מ f הוא null אחרת המוצר היה שגוי.

תודה

קישור לתוכן
שתף באתרים אחרים

עבר קצת זמן מאז שהתעסקתי עם winforms ואני לא אנסה להכנס לדקויות של איך לבצע נכון את מה שביקשת אבל האמת היא שהארכיטקטורה של winforms פשוט לא כל כך מתאימה ל-MVC. יש ברשת די הרבה tutorials ואפילו לדוגמה שמנסות להראות איך לעשות חלוקה נכונה של הקוד ב-winforms אבל הן משתמשות ב-pattern שנקרא (MVP (Model-View-Presenter פשוט בגלל ש-MVC יוצא מסובך מדי. אני מציע שתעשה חיפוש על mvp ו-winforms ותלמד מהדוגמות, לא חסרות כאלה.

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...