אולי לא ממש "הנדסת תוכנה" אבל...

ייוניי

New member
אולי לא ממש "הנדסת תוכנה" אבל...

בדיוק סיימתי לכתוב תשתית קטנה שלדעתי ממחישה יפה את היתרונות של OOP אז החלטתי לפרסם לכם אותה (זה רק 200 שורות קוד לא להיבהל...). המטרה שלי היתה לאפשר להציג ערך מחרוזתי על גבי פקדים ותצוגות שונות ומכיוון שאני כותב אפליקציה ויזואלית הערך צריך לרענן את כל התצוגות שלו כל פעם שהוא מתעדכן (מלבד התצוגה שבה המשתמש מעדכן אותו כרגע), לאפשר לתצוגות מסויימות לערוך אותו וכתוספת לאפשר מצב שבו אוכל "לנתק" אותו ממספר תצוגות כך שיפסיק לרענן אותן (אל תשאלו למה אבל זה מה שאני צריך). אז אם אין לכם כוח לקרוא את הקוד של SimpleTextValue עצמו (באמת לא ממש מעניין) אתם מוזמנים לקפוץ הישר לבדיקה שלמטה ולראות איך משתמשים בו - זה הקטע המעניין. למעשה כל מה שתצוגה מסויימת צריכה לעשות על מנת לעבוד עם SimpleTextValue זה לחשוף ממשק קטן של SimpleTextView (בחלק מהמקרים מספיק שתממש רק מתודה אחת מתוך השלוש). מחר בבוקר אני יוצר מחלקות מתאמות ל TextBox, Label, TreeNode וכל שאר העולם בלי מאמץ. תהנו... נ.ב. ואם מישהו כותב לי תגובה בסגנון: "אבל יש Data Binding של ה Framework..." שיזהר!
 

liortm

New member
אני אשמח אם תוכל להעלות לכאן

את המימוש של TextBox. נ.ב אני גם כן לא אוהב databinding
 

ייוניי

New member
בבקשה

sealed class TextBoxSimpleTextView : SimpleTextView { System.Windows.Forms.TextBox _textBox; BindableText _bindableText; public TextBoxSimpleTextView(System.Windows.Forms.TextBox textBox) { _textBox = textBox; } public void setText(string text) { _textBox.Text = text; } public void bindTo(BindableText bindable) { _bindableText = bindable; _textBox.TextChanged += new System.EventHandler(_textBox_TextChanged); _textBox.Enter += new System.EventHandler(_textBox_Enter); _textBox.Leave += new System.EventHandler(_textBox_Leave); } public Disposable getDisposable() { return new IComponentDisposableAdaptor(_textBox); } private void _textBox_TextChanged(object sender, System.EventArgs e) { _bindableText.valueChanged(_textBox.Text); } private void _textBox_Enter(object sender, System.EventArgs e) { _bindableText.valueChangingSoDontRefresh(); } private void _textBox_Leave(object sender, System.EventArgs e) { _bindableText.valueChageCompleted(); } }​
יכול להיות ששיניתי קצת משהו מאז שהעלתי את הקוד הקודם אבל הרוח של הדברים זה העיקר... המטרה העיקרית שניסיתי להשיג במנגנון היא ערך מחרוזתי שמרענן את עצמו בין תצוגות ובמקומות שונים על המסך, בדרך גם עשיתי יצרתי אבסטרקציה של View שאיננה תלויה בתצוגה ספציפית אלא מתאימה לכל אובייקט שיודע להציג ערך טקסטואלי.
 

liortm

New member
תודה-האם זה משמש אותך גם לעבודה

מול בסיס נתונים?אותו ערך מחרוזתי מאין הוא מגיע?לפי מה אתה קובע שהוא יתרענן?
 

ייוניי

New member
ספציפית אני לא עובד מול DB

כי המערכת שאני בונה היא Document Based אז אני פשוט מסרייל אובייקטים לקבצים וחזרה (לכן הערך המחרוזתי הוא Serializable). הדרישה שבעקבותיה כתבתי את המנגנון היא ששינוי של ערך במקום כלשהו באפליקציה יגרור שינוי מיידי בכל התצוגות של הערך בשאר החלונות. כרגע הוא מתרענן בכל תצוגה שאני מציג אותו עליה עם פקודת ה displayForever והוא מתרענן ברגע שתצוגה שיכולה לערוך אותו קוראת ל valueChanged על אובייקט ה BindableText שנשלח אליה. ההמשך הוא לתמוך Undo/Redo וכו'...
 
למעלה