Pages

2012-12-24

階層式項目(Hierarchy)網頁設計Pattern

網站後台管理UI設計裏,通常Table項目維護都使用「Grid」列表方式作列表維護,遇到階層式或Master-Details的顯示,傳統的子層跳頁或內嵌顯示方式,都會讓整個UI介面顯得不夠清爽。

對User而言,要表現出資料的階層式關係即可,介面上儘量力求簡單。對Programmer而言,頁面程式要好複製,利用DB Hierarchy架構可以共用相同的Table,而下方的UI設計Pattern可以求得平衡。
Hierarchy UI

例如要開發Master-Details架構,只要複製ASPX頁面,設定好頁面的隱藏Key值, 設計好右側頁面的UI控件呈現,基本的CRUD架構就形成。
Hidden Keys

左側樹狀選單使用AJAX方式,動態取子層的項目列表,而且可以透過滑鼠左鍵拖曳讓Item在階層裏移動、改變顯示順序。遇到複雜的項目維護,拉到磞出的Window視窗再作操作。

此Pattern因採用樹狀選單UI來表達階層式視覺分類(若子項多的話,宜用Grid+條件搜尋來操作),比起傳統的一層List顯示方式或Master-Details Grid,會更清楚,且支援更複雜的表單內容設計。
Hier List

考量開發成本及Reuse效益,我習慣在ASPX頁面作很多隱藏參數設定,程式員只要調整其值,即可符合多數的資料維護管理需求。至於DB設計,所有網站只需要一個Table即可,即使為了資料維護便利拆分成不同Table,其實Schema架構都差不多。

至於是否要使用程式產生器(Code Generator)產生這些程式碼,其實DB及UI都一致,使用人工方式複製、修改+客製化校正,跟產生器設定時間上都差不多。除非有大量重複性客源開發需求,否則也不太需要。

總言之,UI的呈現還是要看客戶需求而定,這個Pattern只是少量分類項目Table維護的一種UI呈現而己,特別適合「分類項目」的資料維護。對沒耐心的程序員來說,這種小Table的CRUD程式很簡單,但卻是一再重複的Dirty Work,特別會扼殺編程樂趣。對客戶來說,傳統的Grid列表較無法簡單呈現資料分類設計,更無法視覺上讓項目在分類間裏移動,而這UI Pattern正因此而生。

2012-12-19

Hinet空間下載器:Xuite Downloader

在台灣資源下載最快的主機空間,當然就屬中華電信Hinet (每秒1MB/s以上),只要有申辦其電信網路,就能在其Xuite網站帳號得到額外的配給空間(端視你的網路方案),裏頭可以設定目錄/檔案的分享。目前此空間也整合至「Hami+個人雲」空間,因此也能使用其同步Client工具把資料上傳至網站「同步資料櫃」,再移至「非同步資料櫃」,以利能長久分享。
Sync Upload
Xuite網站要下載分享的資源,必須點擊一個廣告及輸入驗證圖片(動作簡單大方,不像一些不肖的免費空間),不過多檔時就有些麻煩且無法批次自動化,因此我們得善用專屬下載工具「Xuite Downloader」。
Download

Xuite Downloader的官網請請下載「需安裝 NET4.0」的版本(我是使用B版,不知差異,但直覺既是B版必有特別之處),它能幫你自動點廣告及填入驗證數字,挺方便的。也許Xuite官方日後會改變下載邏輯,但這軟體也會隨之更新版本。這軟體亦能把你的分享網址作加密再分享給別人,有點類似SMG工具的網址加密。
Xuite Downloader

大檔資源透過網頁上傳通常會逾時,透過Hami個人雲同步工具就有大優勢,不過檔案的分享網址還是得一個一個複製,這是目前唯一免不了的Dirty Work。

2012-12-02

Properties.Settings讀值的效能低落

當應用程式想要讀取設計值,使用App.config內的設定值物件是最為簡便(string zip5 = Settings.Default.XmlZip5):
App.config 

當你要讀config裏的值時,強型別(Strong-Typed)的語法很簡單,但它背後卻藏著一個效能低調的陷阱。我們會直覺以為是個字串,實際上它不僅每次都得從所有Object Collection集合取值,而且所做的事比想像中沉重!(追查至.NET Framework官方源碼)
GetPropertyValue

它造成的影響為:若該設定值只讀一次效率損耗不大,但你若把它放在大迴圈裏去讀取,程式效能就慢如牛了,所以得事先把它讀取至一個新字串變數(字串是複製)。

我剛開始學習物件程式設計時,就隱然覺得Public Property(屬性)是把兩面刃,它雖能保護私有變數不被修改(很多書只提這優點),但很多人把Property GET作了太多背後工作,使用Class的人卻誤以為它只是一個簡單讀值而己。所以我有養成一個習慣,就是複雜計算的取值,一定是用Method()去讀取,而不用Property屬性來取得,就是避免讓人誤解繼而埋下效能地雷。