2014年5月4日 星期日

ASP.NET Web Form 對應優先設計 (Mapping-First Design) 第二彈 - 百變星君

第一彈 之後 現在再來玩些變化

因為世上無可能有網頁 全部都只用 TextBox 的

在 CheckBox RadioButton DropDownList 參上之前 先來看看 先前第一彈 留下了什麼伏筆




1. 神手會失誤 庸手會失憶

每次都必須宣告 ValueMapBuster 變數 然後在 Page_Load 裡面 SetUpValueMaps Mapping 機制才會奏效

但是 神仙打鼓有時錯 每次都要 Key 這些固定 CODE 實在讓人 KEY 肚藍

所以我們需要 把這些給西 封裝起來 放到基底類裡面

再靠抽象方法 約束後人 必須實作 SetUpValueMaps





2. 噁心的 人形蜈蚣 代碼

什麼是 人形蜈蚣 代碼?

something like...

or like...

咦 好像沒什麼不對呀?

這樣寫的確 沒有任何錯誤 程式依舊能跑

但是這是一個造成 難以維護的 壞味道

如果哪天 條件增加 減少了 勢必要到處去修改這些蜈蚣

況且 這麼多的判斷式 如果只是為了 "其中一種狀況" 發生的時候該做什麼 "對應的事" 的話

其他的 判斷式 在這裡就顯得有點擋路

所以我們需要 善用多型

首先把原本的 ValueMap<T> 變成抽象類


GetValue 和 SetValue 則依靠 抽象方法實作 GetDefaultValue 和 SetDefaultValue 的細節 (就是原本蜈蚣的部分)


再來就是 "多型" 的部分 原先 Mapping 的時候 需要考慮各種控制項的可能

現在則是每種控制項 增加一個獨立的類別 並且繼承 ValueMap<T> 來實作細節

這裡 又會遇到一項設計上的考量 有時候 某個值不見得只靠一種控制項 就能表現

最顯而易見的就是 RadioButton

一群的 RadioButton 實際上只對應某個欄位的列舉值

所以分成 單體 跟 群組 兩種類型的 Map 來應付

單體

TextBoxMap:預設 Map Text 屬性


DropDownListMap:預設 Map SelectedValue 屬性


CheckBoxMap:預設 Map Checked 屬性


HiddenFieldMap:預設 Map Value 屬性


群組

GroupMap:由於是複數控制項表示一欄位值 所以必須要 自行設定 OnGetValue 跟 OnSetValue


CheckGroupMap:專門處裡 RadioButton 或 CheckBox 群組 預設 Map Checked 屬性





上面改了一堆 實際上究竟如何呢? 馬上來把之前的一堆 TextBox 改成 百變星君

首先改 UI 恕我不貼 HTML -.-...


再來當然是...超超超長 Map

呼...好累...然後呢?

什麼然後? * w * ??? 沒有然後了呀

沒錯 Mapping-First 在 Map 完了之後 大半就完成了

除了 SQL 多了些欄位之外 Click 事件內的 Code 無須更動



難道這是傳中的 Two-Way Data Binding!! (誤)




咦?如果我 TextBox 亂打 不合型別會怎樣?

呵呵呵 當然是會壞掉呀 因為現在還沒 實作欄位驗證

敬待 下回分曉 ˊ_>ˋ




Déjà vu?????????????




標題梗:

沒有留言:

張貼留言