דעה: ASP.NET WebForms

שייך לקטגוריות .NET, ASP.NET

נכתב במקור כתגובה לשאלתה של רותם בפורום .net בתפוז. ואם השקעתי כל כך הרבה, אז יאללה, שיהיה גם חומר לבלוג :)

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

מיקרוסופט ניסו לחשוב בצורה עסקית – איך אנחנו נותנים למתכנתי ה-VB שלנו גישה מהירה לעולם ה-Web המתפתח עד מאוד? כמובן – ניצור לו את הכלים שאותם הוא מכיר, באותה צורה ובאותה סביבה! Drag & Drop של אובייקטים, מחלקה שמייצגת את הטופס הנוכחי, לחיצה כפולה מובילה לאירוע לכתיבת קוד עבור אירוע ברירת המחדל. אחד לאחד. זה באמת מעורר הערצה.

מכיוון שלא באפשרות מיקרוסופט להטמיע דפדפן חדש שבעצם ירנדר אפליקציה ב-100% מהמחשבים בעולם, הם היו חייבים להישאר באותו רעיון של הדפדפן הרגיל ותקשורת HTTP – רינדור של HTML, טפסים, שרת staeless.

אז אחד אחד, הפתרונות שלהם:

  • את כל העמוד שלנו נעטוף ב-form אחד בלבד, נוסיף לו מספר שדות שישמרו את המצב הנוכחי של הפקדים שלנו (להלן – ViewState). מטרת הטופס היא לגרום לאינטראקציה עם השרת בכל שינוי/לחיצת כפתור. בשרת אנחנו הרי יכולים לעשות מה-בא לנו (דברי מיקרוסופט) ולהחזיר חזרה לקליינט דברים אחרים מאלה שהיו על העמוד. בלי ליצור אותם בצד לקוח. רק לעבד בצד שרת ולהחזיר את כל המידע מחדש בצורה העדכנית, עם ViewState חדש שתואם את מצב הפקדים החדש שלנו.
  • לא ממש חייבים לדעת HTML מאחר ויש Drag & Drop לפקדים שנראה זהה לעבודה מול WinForms. ואם בכל זאת רוצים – שמות הפקדים זהים לשל WinForms.
  • כל קונטרול, הוא עטיפה בגודל הר למשהו פיצפון. כך הפך לו </"input type="text" name="a> ומקבילו ה-Serverי ["Request.Form["a למשהו מפלצתי, שבמבט ראשון נראה חמוד – </"asp:TextBox runat="server" ID="a> ומקבילו ה-Serverי a.Text (סוג של גרמלין) אך מאחוריו יושב מנוע רב מימדים. מי שלא חושב כך – שיפתח בבקשה את Reflector ויעבור על System.Web.UI (בהצלחה) :) . מעבר לזה – כל כפתור שנלחץ, כל DropDown ששונה וכו' גורמים לשרשרת תהליכים מטורפת. לחצת כפתור? שרפת קלוריה. לא שלך, של השרת. *כל* הנתונים שעל העמוד נשלחים לשרת. כל ערכי פקדי ה-TextBox שרונדרו ל-input ושאר חבריו, וכל ה-ViewState. עמוד ארוך? לא נורא, 50K upload של נתונים זה.. 7 שניות בממוצע? ה bandwidth גדל כל הזמן, למי אכפת ?:)
    עוד קצת בנוגע ל-ViewState: יש לך GridView בעמוד? כל הנתונים שבו מקומפרסים Base64 לתוך ה-ViewState ונשארים שם. מעתה, כל שינוי סדר, לחיצה על כפתור שבכלל יושב במקום אחר בעמוד וכו' ישלחו את כל הנתונים האלה חזרה לשרת, גם אם ה-GridView הזה לא צריך להיות שם אחרי הלחיצה (השרת לא יודע מזה). היוזר סה"כ רצה לבצע login, וכל נתוני העמוד נשלחו. 50K במקום 50 bytes (כולל headers).
  • עיצוב (CSS) מיושם ע"י הפרופרטיז המוכרים – BackColor, BorderStyle.
  • ב-JS בכלל לא צריך לגעת כי הכל כבר מיושם מאחורי הקלעים. ולידאציות, שליחת הטופס, יישום TreeView וכו'
  • קונטרולים של Data כמו SqlDataSource כדי שנעשה את חיי המתכנתים כ"כ קלים.

ואז הגיע הבאזוורד – AJAX :)

פה מיקרוסופט נכנסה ללחץ. "מה נעשה מה נעשה" שאלה. הרי כל הקטע ב-AJAX זה JS שעושה דברים מגניבים, וחוצמזה פונה לשרת בדרך מינימלית ויודע לשלוח ולקבל חזרה מהשרת רק מה שצריך.
אז בא הפקד UpdatePanel – סוג של Panel שמכיל בתוכו פקדים. רוצה שהוא יתרפרש לבד בלי שכל העמוד יתרפרש? אין בעיה, זה אכן קורה. ועובד. נהדר, לא?
חה. לא. הרעיון ה*גרוע* מאחורי UpdatePanel הוא כזה: קח את כל ערכי הפקדים, את ה-ViewState, שלח לשרת, לא דרך form כי זה ירפרש את העמוד אלא דרך xmlhttp. בשרת תעשה כאילו קיבלת את הנתונים מתוך טופס אמיתי, תפעיל מחדש את כל ה PostBack מכניזם, צור את העמוד מחדש, תפעיל את שרשרת האירועים שלו ובסופו של דבר, תרנדר אותו ותגזור רק את המקטע שבתוך ה-UpdatePanel שלנו, ושלח אותו חזרה לקליינט, כמובן עם ViewState חדש.
כך, עטיפה של כל האתר ב UpdatePanel שקולה בדיוק ל-PostBack.
רציתם דברים מגניבים ב-JS? יש פקדי אנימציה (איטית בהשוואה לכל ספריית אפקטים אחרת ברשת).
גם ה-Extenderים של הפקדים הרגילים מורכבים ממכניזם די רחב (מדי), ועל אף שאני אוהב את יוזמת ה-Toolkit, הסירבול בהרחבה של פקדים שנכתבו שם הוא פשוט אבסורד (באף אפליקציה שהמחלקה שלי או אני כתבנו לא יכולנו להשתמש בפקד out of the box).

אני חייב לציין – אין לי שום דבר נגד מתכנתי VB או WinForms ויוזמה ברוכה של מיקרוסופט לקרבם לעולם ה-Web, אך המחיר שמשלמים בכך שהמנגנון המקורי של asp.net הוא מנגנון כבד ובזבזני הוא גדול.
ואני לא מדבר רק על ביצועים. אלא על זמן. זמן תסכול, זמן מחקר ב-Reflector מה-לעזאזל-הם-התכוונו, זמן קליטה ש-UpdatePanel עושה בעצם Full PostBack וש Partial PostBack זה FRAUD (תוך כדי חקירה ב-fiddler).

אוקיי, אחרי החפירה הארוכה הזו, אז מה עושים?

  • מיקרוסופט מצידם עובדים סוף סוף על תחליף ל-WebForms שנקרא MVC – כרגע בבטא. זהו קונספט שבעיקרון קיים ב-PHP ו-Ruby On Rails, וגם קיים בפרוייקט castle עבור ASP.NET בשם monorail. מהבלוג של סקוט גו זה נראה טוב (יחי ה inline scripting)
  • אפשר להפסיק לכתוב עם form runat=server. לעבוד פשוט מול הנדלרים (ashx) או web services.
  • לא כל GridView או Repeater חייבים להיות כאלה. הם יכולים להיות inline code חמוד. זו לא עבירה. זה העתיד.
  • AJAX – אין יותר פשוט מזה בצורה הטבעית שלו. עבודה מול web services עם ScriptService כדי לחשוף גם לפניות AJAX שלא מבוססות UpdatePanel או סתם לתוך ashx. אפשר לשלוח פניייה עם כל פריימוורק JS בסיסי כמו MooTools, jQuery, Prototype (אין טעם לכתוב לבד).
  • בנוגע לשכפול לוגיקות — כותבים/מורידים פעם אחת בודק טפסים גנרי (יש כאלה שעובדים לפי class של input כמו input class=required) ויש לנו ולידאציות. בשרת נמשיך לעשות ולידאציות בשכבת הלוגיקה.

אחרי צעד כזה, פתאום מרגישים חופשיים ולא כבולים לכלום. וזמן הפיתוח מתקצר. באמת.
יש מאות אפליקציות web עשירות עם AJAX ו-JS מגניב מבוססות ROR או PHP. מישהו יכול למנות לי 10 בולטות מבוססות ASP.NET AJAX שגם מתקפדת טוב וגם נראית טוב?

הודעה זו נכתבה בשל תסכול יתר של שנים רבות מטכנולוגית ה-WebForms המיותרת להפליא. בזמן שמבזבזים על חקירת הקרביים של ה-WebForms, או מתחבטים בשאלות של "למה ה-ViewState לא נטען לי בפקדים דינמיים היררכיים" או יותר מזה – "למה הכל עובד נורא לאט?!" אפשר להשלים שעות שינה של שנתיים :)



קטגוריות

חיפוש

עיקבו אחרי (אקספרימנטלי!)

5 תגובות

כתיבת תגובה

05.04.08 בשעה 17:42
אריק

פוסט מעולה אני חייב לומר לך.
אני מתכוון להדפיס אותו ולהראות אותו למורה שלי למחשבים.
אני כבר שנתיים לומד C# ואני פשוט לא סובל את כל עניין ה webforms. אני רגיל ל php שם אני מקבל גמישות מקסימלית בזכות ה inline code והעובדה שאני לא חייב לתכנת ב oop.

אני מת כבר שהחברה הדבילית הזאת (אפל פנ-בוי) תשחרר את התחליף לווב פורמס.

1
06.04.08 בשעה 18:44
ינין
(אתר)

טוב. אז סוף סוף רשמת את זה. מה העיכוב? הפוסט הזה היה אמור להכתב לפני שנה בערך?

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

ה ASP.NET MVC הולך לכיוון טוב, ואנשים חכמים מפתחים אותו, פיל האק, ג'ו, רוב קונרי וכמותם, שבאו מהקהילה.
אני כבר השתמשתי בו בפרוייקטים קטנים וממליץ בחום.

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

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

כולם לתלות ולמסגר את הפוסט הזה. אחר"כ לקחת ללב. :-)

2
06.04.08 בשעה 23:11
שלומי אתר

מעניין.
בתור מתכנת רובי, שלא יותר מדי מתעסק עם ASP.net ותמיד תהה מה זה לעזאזל WEB FORMS ולמה זה טוב, קיבלתי הסבר סוף סוף של מה זה אמור לעשות, והסבר נוסף שמאשש את התחושה שלי שזה "שעטנז" די מגעיל ומיותר.

אני מאמין שהבעיה היום עם עולם הASP.net הוא שמיקרוסופט חדלה מלהוביל בעולם הזה, שאם לפני שנה אנשים ממיקרוסופט התלהבו מ AJAX (משהו שהבלידינג אדג' של פיתוח ווב התעסק איתו כבר יותר משלוש שנים באותו הזמן) והיום הם מתלהבים מREST (משהו שהוא כבר סטנדרט פיתוח בסביבות רובי כבר יותר משנה) ומ MVC (שנמצא ברובי, פייתון וPHP כבר שנים), אולי ASP.NET היא סביבה למתכנתים שלא מחפשים את הקצה הטרי וה"מדמם" של הטכנולוגיה.

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

במיקרוסופט יש צוות של אנשים שהעבודה שלהם היא "לשפר את ASP.NET", אבל הם לא *משתמשים* בASP.NET לעבודה היום יומית שלהם בפיתוח אפליקציות, אלא *חושבים* מה יהיה טוב להוסיף.

בגלל זה הם לנצח יפגרו מאחור, לנצח לא יגיבו מהר ולנצח ישאירו את המשתמשים המתקדמים שלהם בתחושה של "טוב, עוד מעט זה יגיע גם אלינו".

3
18.05.08 בשעה 4:40
עמרי

זה נכון, ואם זה התסכול שחטפת מwebForms, אני לא מדמיין איזה תסכול תחטוף מJSF שזו הדרך להגיד למתכנתי JAVA שלא ממש צריך אנשי UI מוכשרים שיודעים HTML וJS והכל נעשה עם תגיות (taglib) מוכנות שמייצרות טבלאות, טפסים ובעצם הכל, עם ים של זבל מסביב..
בכל אופן, פוסט יפה.

4
10.06.08 בשעה 12:00
חן אגוזי
(אתר)

אלעד:
מסכים במאה אחוז.
דבר אחד חסר בפרק הפתרונות:
Castle Monorail

וחוץ מזה העיצוב של הבלוג שלך מאוד מרשים. אהבתי.
חבל רק שאתה לא כותב יותר.

עמרי: אכן JSF זה מגעיל כמעט כמו WebForms

שלומי:
ציטוט – " ASP.NET היא סביבה למתכנתים שלא מחפשים את הקצה הטרי וה"מדמם" של הטכנולוגיה"
רק תחליף את ASP.NET ב WebForms ואז זה נכון.
ASP.NET עצמה היא מערכת WEB מצויינת, חזקה מאוד וגמישה מאוד ופשוטה מאוד. לכן היה לא מורכב מדי לבנות על גביה מערכות איכותיות כמו Monorail וכמו ASP.NET MVC.
אתה צודק בהחלט בכך שהפיתוח של הכלים לאורך הרבה מדי זמן מתבצע על ידי אנשים שאינם משתמשים שלהם, ולכן יש את היציאות המוזרות האלו כמו web-forms.

5

כתיבת תגובה

תגיות מותרות לשימוש בתוכן
XHTML: אפשר להשתמש בתגים הללו: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre>