我的爛Code重構之路(二)-泛型方法
前篇提到,以功能分解開發的缺點,但功能分解的開發方式也有其優點,那就是程式碼壞味道(Code Bad Smell)特別的重,就像是吃臭豆腐,味道難然不佳,但如果好好認真盡快的處理,變成一道美味的佳餚也並無可能。
壞味道-發現相似的邏輯
在撰寫函數式Class時,你應該有個直覺,那就是很容易發現相似的邏輯。
舉個簡單的例子,我想整合使用臺北市政府資料開發平台上的資料:
前篇提到,以功能分解開發的缺點,但功能分解的開發方式也有其優點,那就是程式碼壞味道(Code Bad Smell)特別的重,就像是吃臭豆腐,味道難然不佳,但如果好好認真盡快的處理,變成一道美味的佳餚也並無可能。
在撰寫函數式Class時,你應該有個直覺,那就是很容易發現相似的邏輯。
舉個簡單的例子,我想整合使用臺北市政府資料開發平台上的資料:
我們需要傳遞一個加密過的參數,此加密方法產生有一定機會產出含"+"符號的亂數。"+"符號在網路傳遞過程中會有一些問題,常見的解決辦法是傳遞前後使用Encode與Decode
方法來針對特殊符號進行加解密。但在Web API 2比較難處理。
在預設的Web API 2範本及預設的路由"api/{controller}/{id}"設置下,簡單進行兩個測試:
以QueryString方式"/api/values?id=1%2b1"進行請求。這裡的%2b是"+"符號Encode的代表號。這個測試可以順利到達Get(string id)方法之內。
在《軟體構築美學 pdf p.16 》提到軟體開發中鐵三角的概念。
而作者則提出另一個水平的觀點:
天平左邊放的是(預估的)時程和資源,代表我們希望盡量減少的部分。
天平右邊放的是品質和功能,我們希望這部分愈多愈好。
重點在於天平必須隨時保持平衡,如果要增加一項功能,就必須增加適量的時間和資源來維持平衡。
如果經費不足,你就得做出選擇:要犧牲品質還是功能。
使用版本控管(Version Control)(不論使用git、TFS、Visual Studio Online等管理系統)之後,異動的比較(Code Compare)是一個非常實用的功能,重點在於能即時與伺服器端版本控管進行程式碼比較,這絕對不是本機式比較軟體(如:http://winmerge.org/)所能比的上的。
今天無意中發現一個發行Azure Web Apps(之前稱Azure Websites)時好用的比較小技巧。可以在進行Azure的發行動作中進行比較的動作,等於是可以進行最後的確認動作。
我的需求是這樣,我的web.config針對Debug與Release有不同的組態設置,最常見的需求就是connectionString,Debug組態連接LoadDB或測試資料庫,Release組態切換至正式資料庫。原本的測試方式很笨,就是切換Debug或Release模式,然後執行網站,看看讀取對應的組態內容是否正確。
在Azure Web Apps提供發行前與發行後的差異預覽,之前都一直誤以為這只是個檔案更新清單:
今天突然好奇的去點擊了我那由Debug切換至Release的web.config組態檔,結果:
跑出了預覽變更視窗。這個技巧能用在所有文字類型的檔案上,例如:.cshtml / .js / .css。目前使用在像 Web.config 或重點更新的檔案幫了不小的忙,好幾次都是直接在預覽變更就發現問題,而省下不必要的浪費。例如上圖,從比較的結果就能知道組態檔的值已經替換成功,這一點反而是方案總管中的原始檔比較無法做到的。
SVG稱可縮放的向量圖形,它本身有兩種格式,一種是XML格式,簡單想,它就如同一般HTML tag一樣,在網頁的中它使用<svg></svg>
標籤。
以下是使用wiki上的範例程式碼,你只要使用<svg></svg>
標籤,就能在網頁上畫面你想要的任何向量圖。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="467" height="462"> <!-- This is the red square: --> <rect x="80" y="60" width="250" height="250" rx="20" fill="red" stroke="black" stroke-width="2px" /> <!-- This is the blue square: --> <rect x="140" y="120" width="250" height="250" rx="40" fill="blue" stroke="black" stroke-width="2px" fill-opacity="0.7" /> </svg> </body> </html>