E4D Learning

( 14 / 1 / 2012 )   Dynamic Interface in C# ,Wish List

הקדמה

לאחר אין ספור כיתות לימוד שהסברתי להם את הכוח וה"יופי" של שפות 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 אבל... אין שום סיבה שאת הצד שלנו בדוט-נט לא "נקשיח" ונגדיר לעצמנו חוזה על פיו אנחנו רוצים לעבוד.


בתקופה האחרונה אני מלווה מספר פרוייקטים גדולים שעובדים שם מספר קבלני תוכנה. הלקוח של התוצרים בודק את התוצרים רק ע"י "Acceptance Tests" כלומר עובד / לא עובד ובכמה זמן. הבעיה בשיטה זו שלא בטוח בכלל שהבדיקות הנ"ל יעבדו לאחר פרק זמן T. כלומר ככול שפרק הזמן T יהיה ארוך יותר אפשר להגיד שקיבלנו מוצר טוב יותר. השאלה מה קורה לאורך הזמן ש"מקלקל" לנו את התוכנה. המושג הבא הוא ניסיון שלי להגדיר מדוע, בשלב כלשהו, לאורך ציר הזמן ,התוכנה תפסיק לעבוד.

"עייפות הקוד / התוכנה" – היא תופעה של קוד שלאחר תקופה מסויימת לא מצליח למלא את המצופה ממנו (Spec) כתוצאה ממספר סיבות:

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

2. כמות משתמשים שגדלה

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

4. שינויים שנעשו בקוד מאז הגירסה המקורית.

5. הצרכים של הצרכן של התוכנה השתנו במידה כזאת שהקוד המקורי כבר לא מתאים, ולא ניתן לשינוי או להתאמה לצרכים החדשים.

6. הטכנולוגיה השתנתה כך שהקוד מיושן ולא עונה יותר לצרכים של הלקוח בצורה הטובה ביותר שאפשר
לקבל ע"י טכנולוגיה חדשה יותר.

שאלות שאנחנו צריכים לשאול את עצמנו:

נניח שקוד א' ו-ב' עושים את אותו דבר אבל קוד ב' ממשיך לעבוד בדרישות לאורך זמן ארוך יותר.

1. האם אנחנו יכולים להגיד שקוד ב' כתוב יותר טוב מקוד א, איכותי יותר?

2. האם אנחנו יכולים לחזות מראש איזה קוד ישרוד לתקופה ארוכה יותר?

התשובות שלי לשאלות אלו הם בפוסט הבא סמיילי.

אשמח לקבל תגובות…


כאשר WCF יצא הוא תוכנן לעבוד ב-SOAP. ורוב הדוגמאות היו לממש Interface שהוסיפו לו Attributes.

לדוגמא הקוד שנוצר שמתחילים פרוייקט ב-WCF:

image

 

ואז לרשת את ה- Interface ונוצרה לנו מחלקה שיכולה לממש כ-WCF Service. כאשר השוונו את זה ל- WS  רגיל (asmx) הטענה היתה,שזה הרבה יותר טוב כי אנחנו מגדירים את ה- Interface שמשמש גם לעולם הדוט-נט וגם לאיך יעבדו עם השירות (WSDL). כיום ב- WCF יש מספר רב של סוגים:

1.     WCF REST (JSON or POX)

2.     WCF Data Services (OData)

3.     WCF RIA Services

4.     WCF Web API

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

image

1.     כל Getaway מתוכנן לעבוד מול פרוטוקול שונה וחושף את ה-API  הנוח לעבודה עם אותו פרוטוקול, למשל העבודה ב-SOAP  תיהיה שונה לגמרי מה-API  של העבודה עם OData.

 

2.     Getaway יכול לרשת מ- Base Class אבל אין עוד טעם לעבוד עם Interfaces ו- Attribute של WCF, כי ה- Getaway עצמו מגדיר את הממשק לעולם החיצוני ולא צורת מימוש לעולם הפנימי של דוט-נט.

 

3.     ה- Getawayיכירו רק את הממשק Ixxx , המימוש שלו יוזרק להם (Dependency injection( כלומר התפקיד שלהם זה לתווך בין העולם החיצוני לעולם הפנימי.

 

4.     כתוצאה מתכנון זה אנחנו יכולים להוריד את ה- Attributes WCF מהממשק Ixxx . היתרון: פחות צמידות לטכנולוגיה WCF.

 

סיכום:

כאשר יצא WCF  הוא תוכנן לעבודה עם SOAP  אבל כיום בעקבות ריבוי הצרכנים השונים של ה-Services כמו למשל Smart Phone למיניהם ו-JS  יש ביקוש לפרוטוקולים שונים לצריכת השרותים ועם API  נוחים יותר. שינוים אלו מחייבים אותנו לעשות חושבים ולבדוק אם מה שלימדו אותנו עד עכשיו בעבודה עם WCF  "מחזיק מים". אשמח לשמוע את דעתכם J.


I am pleased to inform that the Israel Ministry of Justice case study is now live on Microsoft.com.


( 18 / 11 / 2011 )   ASP.NET MVC 3. & AJAX

ה-MVC עושה את החיים קלים מאוד בעבודה עם AJAX. להלן המצגת שהעברתי באחד האירועים:

פוסטים נוספים בנושא:

http://eyalvardi.wordpress.com/2011/04/21/updatepanel-vs-ajax-helper-in-mvc/

http://blogs.microsoft.co.il/blogs/vardi/archive/2011/05/25/asp-net-mvc-3-0-validation.aspx


( 14 / 10 / 2011 )   Entity Framework 4.1 Course Sildes

העליתי את המצגות של הקורס של Entity Framewok 4.1 לאוויר ע"פ בקשת הקהל.











( 10 / 10 / 2011 )   ASP.NET MVC Internals

תודה לכל מי שבא אתמול לשמוע אותי. עכשיו ניתן להוריד את המצגת והקוד מ-SkyDrive.

לחומרים נוספים העלתי ל-SlideShare.

לפרסומים שוטפים של מאמרים אתם יכולים להתחבר אלי לפייסבוק או לגוגל RSS.

שנה טובה.





לפרטים נוספים, התקשר עכשיו למיכל: 054-5612259 או למשרד 03-6325707