我的爛Code重構之路(二)-泛型方法

我的爛Code重構之路(二)-泛型方法

Stinky tofu

前篇提到,以功能分解開發的缺點,但功能分解的開發方式也有其優點,那就是程式碼壞味道(Code Bad Smell)特別的重,就像是吃臭豆腐,味道難然不佳,但如果好好認真盡快的處理,變成一道美味的佳餚也並無可能。

壞味道-發現相似的邏輯

在撰寫函數式Class時,你應該有個直覺,那就是很容易發現相似的邏輯

舉個簡單的例子,我想整合使用臺北市政府資料開發平台上的資料:

如何使用路由傳遞含"+"符號到Web API 2

Web API 2如何使用路由傳遞"+"符號

我們需要傳遞一個加密過的參數,此加密方法產生有一定機會產出含"+"符號的亂數。"+"符號在網路傳遞過程中會有一些問題,常見的解決辦法是傳遞前後使用Encode與Decode方法來針對特殊符號進行加解密。但在Web API 2比較難處理。

Web API 2與"+"號的邂逅

在預設的Web API 2範本及預設的路由"api/{controller}/{id}"設置下,簡單進行兩個測試:

測試一

以QueryString方式"/api/values?id=1%2b1"進行請求。這裡的%2b是"+"符號Encode的代表號。這個測試可以順利到達Get(string id)方法之內。

我的爛Code重構之路

在《軟體構築美學 pdf p.16 》提到軟體開發中鐵三角的概念。

而作者則提出另一個水平的觀點:

軟體開發的天平
天平左邊放的是(預估的)時程和資源,代表我們希望盡量減少的部分。
天平右邊放的是品質和功能,我們希望這部分愈多愈好。
重點在於天平必須隨時保持平衡,如果要增加一項功能,就必須增加適量的時間和資源來維持平衡。
如果經費不足,你就得做出選擇:要犧牲品質還是功能。

在Azure Web Apps發行時進行進行程式碼異動比較

在Azure Web Apps發行時進行進行程式碼異動比較

使用版本控管(Version Control)(不論使用git、TFS、Visual Studio Online等管理系統)之後,異動的比較(Code Compare)是一個非常實用的功能,重點在於能即時與伺服器端版本控管進行程式碼比較,這絕對不是本機式比較軟體(如:http://winmerge.org/)所能比的上的。

今天無意中發現一個發行Azure Web Apps(之前稱Azure Websites)時好用的比較小技巧。可以在進行Azure的發行動作中進行比較的動作,等於是可以進行最後的確認動作。

需求:web.config的組態切換

我的需求是這樣,我的web.config針對Debug與Release有不同的組態設置,最常見的需求就是connectionString,Debug組態連接LoadDB或測試資料庫,Release組態切換至正式資料庫。原本的測試方式很笨,就是切換Debug或Release模式,然後執行網站,看看讀取對應的組態內容是否正確。

發行網頁 - 預覽

在Azure Web Apps提供發行與發行的差異預覽,之前都一直誤以為這只是個檔案更新清單

Azure web apps Publish Preview

今天突然好奇的去點擊了我那由Debug切換至Release的web.config組態檔,結果:

Azure web apps publish code compare

跑出了預覽變更視窗。這個技巧能用在所有文字類型的檔案上,例如:.cshtml / .js / .css。目前使用在像 Web.config 或重點更新的檔案幫了不小的忙,好幾次都是直接在預覽變更就發現問題,而省下不必要的浪費。例如上圖,從比較的結果就能知道組態檔的值已經替換成功,這一點反而是方案總管中的原始檔比較無法做到的

Dino的指點,這個程式碼比對更精確的說是「Web Deploy」所提供的功能,是個發怖前程式碼比對功能。

解決.svg無法在Azure websites載入顯示的問題

解決.svg無法在Azure websites載入顯示的問題

SVG稱可縮放的向量圖形,它本身有兩種格式,一種是XML格式,簡單想,它就如同一般HTML tag一樣,在網頁的中它使用<svg></svg>標籤。

SVG的XML格式

以下是使用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>