Coding 時, 要有自己的想法

Coding 達到客戶的要求, 通常會有不止一種的寫法, 那麼不同的寫法間, 您如何取捨呢 ?

在我就讀建築系時, 最重要的一門課叫"建築設計", 老師會畫出一塊地, 出題目要我們做建築設計, 例如電影院,個人住宅(別墅),集合住宅(公寓),...., 那麼, 究竟將個人住宅設計成方的,圓的,各式形狀, 哪一種才是 "正確" 的呢? 當然沒有正確的標準答案!! 因此老師在評斷學生作品時, 學生必需先花一段時間說明個人的設計概念(在此暫時稱為 '想法' ), 老師再根據學生的想法來說明學生哪裡沒做好; 例如當年我設計個人住宅時,放了一個旋轉樓梯可1,2樓互通, 並說明"我覺得樓梯不要做直的,我覺得比較好看", 老師的回應則是"你做的旋轉樓梯太小了,比較像是讓人爬上儲藏室/閣樓的size, 用在個人住宅裡並不恰當, 如果您想讓它豪華一點,或許可以將樓梯設計得再大方一點" , "設計概念"一詞在建築系/建築界裡, 算是老師/同學口中的常用辭彙。

在 coding 時, 若要達成客戶要求的功能往往都會有不止一種的寫法, 這點與我上一段提的建築設計有類似的狀況 , 既然寫法有很多種, 那麼哪一種是最好的呢? 個人覺得通常是沒有所謂"最好的寫法", 只要是沒bug,執行效能ok, 客戶多半是可以接受的, 在此我以我個人的 '想法' 來做說明。

由於我需要製做不同客戶的專案, 因此我的 '想法' 是 coding 時, 最好是 彈性、快速、穩定, 以下是我個人對我想法的定義

 

彈性: 最好能事先開發好常用功能的模組, 客戶需求符合時, 只需要修改系統參數就能加入系統中。
快速: 由於開發專案最大的成本是人力, 最好是 coding 時間能大幅縮短, 以增加競爭力及利潤。
穩定: 由於我做的是長期客戶, 一個客戶會持續地交付不同專案, 如果系統經常發生意外的錯誤, 或安全性欠佳, 客戶在交付下個專案時自然會考慮是否要尋找別的廠商。
 

接下來, 讓我們來看一段程式碼

01 sub AddData(sender As Object, e As EventArgs)
02   Dim RComments As String=Comments.Text  
03   RComments=Replace(RComments,"<" , "&lt;")
04   RComments=Replace(RComments,">" , "&gt;")
05   RComments=Replace(RComments,vbCrLf , "<br>")
06   Dim AddSQL as string = "INSERT INTO Book (" & _
07
08 "Name,Mail,WebName,WebUrl,FontColor,ViewAction,Comments,Ip,ReCreateDate" & _
09
10 ") VALUES ('" & _
11
12 Name.Text & "','" & Mail.Text & "','"& WebName.Text &"','"& WebUrl.Text &"','"& _
13
14 Request("FontColor") &"','"& ViewAction.SelectedItem.Value &"','"& RComments &"','"& _
15
16 request.servervariables("remote_addr") &"','"& Now() &"')"  
17   Dim cmd as New OleDBCommand (AddSQL, Conn)
18   Conn.Open ()
19   cmd.ExecuteNonQuery()
20   Conn.Close ()
21   
22   Response.Redirect("index.aspx")
23 end sub

這是網路上取得, 有關於新增留言記錄 VB.NET 的程式碼, 它本身是可以正常運作, 這段 Code  似乎沒有什麼特別之處, 或許您也會覺得 "對啊, 我本身也是這麼寫的, 不然還需要改哪裡嗎 ? "
是的, 如果 coding 時沒什麼特別的想法, 或者可以說您的 '想法'  是 "寫一段能正常運作的 code" , 那麼這段 code 是合理的。

但這段code如果是我寫的, 是否有符合我剛才講的 '想法' 呢?

首先, 由於留言板是很多專案都會用到的, 如果每次都要寫這段code, 並做驗證, 開發速度會比較慢, 我可能會傾向於先寫一個 class(例如取名為GuestBook), 它俱備增刪查改留言記錄的功能, 如此一來, 上述的code就可以簡化成

01 sub AddData(sender As Object, e As EventArgs)  
02    Dim Obj as GuestBook = new GuestBook()
03   Obj.Insert(Comments.Text,
04          Name.Text ,
05          Mail.Text,
06          WebName.Text,
07          WebUrl.Text,
08          Request("FontColor"),
09          ViewAction.SelectedItem.Value,
10          request.servervariables("remote_addr")
11       )
12   
13   Response.Redirect("index.aspx")
14 end sub

您可以看到這段code除了簡潔之外, 還有一些額外的優點:

  1. 不論日後系統的資料庫由Access換成 MS SQL Server 或 Oracle, 程式碼都不必換, 彈性增加了。
  2. 程式碼變短了, 開發速度變快了。
  3. 由於 GuestBook 類別是平時就寫好了, 因此您可以事先就做完整的測試, 不致於因為專案時程很趕而發生意料之外的 bug, 例如原始程式中, 並沒有針對輸入值做檢查, 若使用者輸入單引號, 便可能發生錯誤, 甚至造成安全性的漏洞。

這二段code 的功能都相同, 但因為 '想法' 不同(一個只想讓它正常運作即可,一個希望以後方便reuse) 而有了不同的寫法, 身為一個 developer, 除了僅僅按照客戶的要求或根據拿到的規格書 coding 之外, 當您有獨到的 '想法' 時, 往往可以為您的程式碼注入不同的生命力, 除了系統能正常運作之外, 讓人讀您的 Code 時也可以欣賞您獨到的 '想法'。
 

撰寫程式時, 會有很多的技巧,例如有人認為要寫成 function, class, 要切成N-Tier, 但我這裡想表達的其實並不是"coding時要寫成 function, 封裝成class, 或切割成N-Tier方便日後擴充", 只是想單純地想傳達"coding 時,往往有很多的寫法,但您應該要有自己的想法,才能在多個方法裡找到恰當的方式"

寫一些心得或看法,是基於分享, 當然不是想打筆仗, 但由於我原本的文章標題及內容用了Concept 這個字眼, 它似乎造成了認知上的不同, 因此我於 2008/2/27 將原始文章改寫, 希望上述的文字表達方式能減少一些主觀認知而造成的不必要誤會, 我將原始文章的內容放在下方, 供各位查看2008/2/27之前幾天的回應時不致於一頭霧水,

==============================

以下是2008/2/27以前的原始文章內容

==============================

標題 : Concept – 設計概念(一)

設計概念( Concept ) 在我就讀建築系時, 是老師/同學口中的常用辭彙, 轉行到開發應用系統則比較少聽人談起這個名詞。

Concept , 是您希望解決一個特定問題時的想法, 例如: 有二位有錢人都想要一棟房子, 前者是剛變賣袓產,獲得一大筆錢, 後者是國際企業的大老闆。
建築師在設計時便要先在腦中先有一個初步的 Concept, 例如

他先為前者規劃的是一棟足以炫耀他財富的豪宅
而為後者規劃的是一棟外表沈穩低調卻要求高度安全防護的豪宅
兩者都是豪宅, 都符合了遮風蔽雨的基本要求, 但不論外觀設計、建材選用、人行動線都會因為 Concept 的不同而導致最後的成品不同。
兩棟房子完成後都有不同的人喜愛, 那麼要如何欣賞它們呢? 首先, 我們可以先找建築師訪談, 了解他當初的 Concept, 再以他最後的成品是否符合此 Concept來做評斷。
例如前者的房子, 若只是內部裝潢奢華, 外表卻與一般的公寓大樓無異, 唯有進入屋內才能感受屋主的財力, 那麼我們便可以說這建築物與當初的concept 不符。而後者若將房子緊臨馬路, 任何人都可以靠近, 玻璃也沒做防彈處理, 只是簡單地在屋前屋後裝設攝影機, 也因為與當初的 Concept 不符而算不及格。

設計應用系統也是如此, 不論您是要開發套裝軟體或受客戶委託量身訂做的專案最好都先有 Concept。在此我們先僅就開發技巧來做說明。

由於我需要製做不同客戶的專案, 因此我的 Concept 是 彈性、快速、穩定
 

彈性: 最好能事先開發好常用功能的模組, 客戶需求符合時, 只需要修改系統參數就能加入系統中。
快速: 由於開發專案最大的成本是人力, 最好是 coding 時間能大幅縮短, 以增加競爭力及利潤。
穩定: 由於我做的是長期客戶, 一個客戶會持續地交付不同專案, 如果系統經常發生意外的錯誤, 或安全性欠佳, 客戶在交付下個專案時自然會考慮是否要尋找別的廠商。
 


 

接下來, 讓我們來看一段程式碼

 

01 sub AddData(sender As Object, e As EventArgs)
02   Dim RComments As String=Comments.Text  
03   RComments=Replace(RComments,"<" , "&lt;")
04   RComments=Replace(RComments,">" , "&gt;")
05   RComments=Replace(RComments,vbCrLf , "<br>")
06   Dim AddSQL as string = "INSERT INTO Book (" & _
07
08 "Name,Mail,WebName,WebUrl,FontColor,ViewAction,Comments,Ip,ReCreateDate" & _
09
10 ") VALUES ('" & _
11
12 Name.Text & "','" & Mail.Text & "','"& WebName.Text &"','"& WebUrl.Text &"','"& _
13
14 Request("FontColor") &"','"& ViewAction.SelectedItem.Value &"','"& RComments &"','"& _
15
16 request.servervariables("remote_addr") &"','"& Now() &"')"  
17   Dim cmd as New OleDBCommand (AddSQL, Conn)
18   Conn.Open ()
19   cmd.ExecuteNonQuery()
20   Conn.Close ()
21   
22   Response.Redirect("index.aspx")
23 end sub

 

這是網路上取得, 有關於新增留言記錄 VB.NET 的程式碼, 它本身是可以正常運作, 這段 Code  似乎沒有什麼特別之處, 或許您也會覺得 "對啊, 我本身也是這麼寫的, 不然還需要改哪裡嗎 ? "
是的, 如果 coding 時沒什麼特別的想法, 也就是您對開發這系統沒什麼 Concept , 或者可以說您的 Concept 是 "寫一段能正常運作的 code" , 那麼這段 code 是合理的。

但如果以我先前講的設計概念來看, 有什麼不對的地方呢?

首先, 由於留言板是很多專案都會用到的, 如果每次都要寫這段code, 並做驗證, 開發速度會比較慢, 我可能會傾向於先寫一個 class(例如取名為GuestBook), 它俱備增刪查改留言記錄的功能, 如此一來, 上述的code就可以簡化成

 

01 sub AddData(sender As Object, e As EventArgs)  
02    Dim Obj as GuestBook = new GuestBook()
03   Obj.Insert(Comments.Text,
04          Name.Text ,
05          Mail.Text,
06          WebName.Text,
07          WebUrl.Text,
08          Request("FontColor"),
09          ViewAction.SelectedItem.Value,
10          request.servervariables("remote_addr")
11       )
12   
13   Response.Redirect("index.aspx")
14 end sub

 

您可以看到這段code除了簡潔之外, 還有一些額外的優點:

  1. 不論日後系統的資料庫由Access換成 MS SQL Server 或 Oracle, 程式碼都不必換, 彈性增加了。
  2. 程式碼變短了, 開發速度變快了。
  3. 由於 GuestBook 類別是平時就寫好了, 因此您可以事先就做完整的測試, 不致於因為專案時程很趕而發生意料之外的 bug, 例如原始程式中, 並沒有針對輸入值做檢查, 若使用者輸入單引號, 便可能發生錯誤, 甚至造成安全性的漏洞。

這二段code 的功能都相同, 但因為 developer 有不同 Concept 而有了不同的寫法, 身為一個 developer, 除了僅僅按照客戶的要求或根據拿到的規格書 coding 之外, 當您有獨到的 Concept 時, 往往可以為您的程式碼注入不同的生命力, 除了系統能正常運作之外, 讓人讀您的 Code 時也可以欣賞您獨到的 Concept 。