RSS

Dynamic Interface in C# (Wish List)

14 ינו

הקדמה

לאחר אין ספור כיתות לימוד שהסברתי להם את הכוח וה"יופי" של שפות Strongly Type , כשראיתי בפעם הראשונה את Anders Hejlsberg מציג את dynamic, הרגשתי תסכול רב ,איך הוא בא ומציג את dynamic ,שסותר תפיסה זו. הזמן עבר, וביקשו ממני להרצות על C# 4.0 ונוכחתי שוב,שהעולם לא "שחור ולבן"…

מתי להשתמש ב- dynamic?

כאשר אני רוצה לצרוך שרות שאין לי הסכם איתו (Interface משותף) או שאני לא מכיר את ה-,Type אבל אני יודע שיש לו מתודה שאני רוצה לעבוד מולה, dynamic יעשה את החיים קלים יותר.

דוגמאת קוד בלי dynamic:

clip_image002

דוגמאת קוד עם dynamic:

clip_image004

למידע נוסף על dynamic ניתן למצוא באינטרנט. ( בפוסט זה אני לא מנסה להסביר את dynamic לכל פרטיו )


הרעיון שלי לשיפור ה Dynamic

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

clip_image006

קוד זה נראה רגיל אך לא… ה- ICalculator הוא Interface דינמי. כלומר GetCalculator לא חייב להחזיר מחלקה שמממשת את ICalculator .אלא, שיש לה חלק מהדרישות של ה- ICalculator. כלומר בואו נניח ש- GetCalculatorמחזיר מחלקה עם מתודה אחת בלבד ADD במקום 4 מתודות שמגדיר ה-Interface. במקרה כזה הקוד הנ"ל יעבוד, אבל אם גם הייתי משתמש בעוד מתודה כמו חיסור אז בזמן ריצה הקוד היה מקבל טעות (Exception).

איך מגדירים Interface דינמי?

clip_image008

למה זה טוב?

Dynamic Interface מתנהג בדיוק כמו dynamic רגיל. ההבדל הוא , שהצד שכותב בדוט – נט (צורך השירות) מרגיש שיש לו עבודה עם strong type interface ,על יתרונותיו, למשל , Intellisense. בנוסף, יהיה יותר קל לכתוב לזה TDD. אם חושבים על זה זה בדיוק כמו WCF, שני הצדדים, השרת והלקוח לא צריכים לממש אותו ממשק והם יכולים לעבוד אחד עם השני.

סיכום

כאשר אנחנו רוצים לצרוך שרות מ"עולמות אחרים" (Com,JavaScript וכו' ) אנחנו לא יכולים לכפות עליהם את תפיסת עולמנו, כמו למשל Interface ו-Base Class ולכן אנחנו עובדים עם dynamic אבל… אין שום סיבה שאת הצד שלנו בדוט-נט לא "נקשיח" ונגדיר לעצמנו חוזה על פיו אנחנו רוצים לעבוד.

מודעות פרסומת
 
4 תגובות

פורסם ע"י ב- ינואר 14, 2012 ב- Uncategorized

 

4 תגובות ל-“Dynamic Interface in C# (Wish List)

  1. Ariel Ben Horesh (@ArielBH)

    ינואר 14, 2012 at 5:19 am

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

    אבל אז נזכרתי ב-extensions methods שעובדים באותה צורה, אז אני כבר לא כל כך נגד. 🙂

     
  2. רון קליין

    ינואר 14, 2012 at 2:28 pm

    הי אייל, פוסט נחמד. אתה מציע Duck Typing כחלק מהפריימוורק עצמו (syntax sugar על רפלקשן). אם אנחנו כבר שם, מציע להסתכל על הפתרון של LinFu בנושא:
    http://www.codeproject.com/KB/cs/LinFuPart2.aspx

     
  3. אלון גורלניק

    ינואר 19, 2012 at 4:09 am

    התכונה הזאת, Duck Typing, כבר קיימת כחלק מ-C# 4. כל מה שאתה צריך לעשות זה לעשות cast ל-dynamic לאוביקט כלשהו ולבצע השמה של התוצאה לתוך משתנה מקומי מסוג ה-interface. זאת אומרת שבתמונה השלישית שלך (clip_image006) כל מה שדרוש הוא לבצע cast ל-dynamic לערך ההחזר של מתודת GetCalculator.

     
    • eyal.vardi

      ינואר 19, 2012 at 6:01 am

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

       

להשאיר תגובה

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

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s

 
%d בלוגרים אהבו את זה: