2014年5月20日 星期二

ASP.NET Web Form 對應優先設計 (Mapping-First Design) 第三彈 - 被遺忘者

PM 常說 先求有 再求好

PG 就說 no problem!

於是三兩下搞定了 CRUD 交給 USER

然後立馬被玩壞

因為 USER 總是能夠超越極限 在 TextBox 裡面塞入無限的可能性

顯而易見 我們需要類似這種東東 防止 USER 的無限加速器全開

或許反射性的就想到工具箱裡面的好碰友...

but that was out of fashion





既然前面兩彈 大費周章的 弄了一個 values mapping system

又在每彈結尾留可有可無的伏筆

自然就是要在上面搞些花招

已達更加無腦的境界





首先從 Map 發想

我希望這樣子來使用欄位驗證

這裡由於驗證可能是複數 所以使用 ICollection

然後陣列可以當作 ICollection 的實體





再來就是 中二到不行的 抽象類 Judgement





之所以不想命名成 validation 之類的 只是因為不想跟 其他欄位驗證的類別混淆

並非因為這個傢伙

或這個傢伙





審判的細節 靠子類實作

至於實作的細節 平常怎麼幹 就怎麼幹囉

隨便貼一個





觸發審判的方式也沒什麼特別

就在 Buster 裡面挖個方法 觸發的時機 高興怎樣就怎樣囉

這邊是在 Buster 放個 IsAllInnocent 屬性 取得該屬性時 會觸發驗證

該死的 Click 事件 獲得了 欄位驗證 並且避免了 重度脂肪肝

Great Success





標題梗 again

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?????????????




標題梗: