2013年2月16日 星期六

The art of readable code摘要 -- 重整程式碼


extracting unrelated subproblems (分解問題)
aggressive是一個重要精神,讓functions可以組裝
introductory example: findClosestLocation() (範例)
將某些codes blocks依照他們工作的屬性獨立出來,並且賦予一個高階的function name,可以增加可讀性(refactoring: extra method)

pure utility code (純粹工具程式)
將一些常用的程式整合成一常見的function

other general-purpose code
同上,作者舉例javascript上一個format ajax response的function

create a lot of general-purpose code
project-specific functionality
開發工具functions

simplifying an existing interface (簡化已經存在的介面)
符合agile的open/close精神,減少不必要的接觸,就可以減少犯錯

reshaping an interface to your needs (從新修整介面成為你需要的模式)
refactoring(?)

taking things too far (不要考慮太多)
不要過分分割

one task at a time (一次只處理一件事情)
tasks can be small (分割工作)
將工作分割以及簡化成為一個小步驟

extracting values from an object (從分解數值看問題)
這部份建議看原著,有點類似refactoring
作者舉例javascript一個類似住址的結構變數假設就是addr,裡面有town, city, state, country,然而有一處理函數需要回傳[town|city|state], country,前三者選擇一個,優先權是town>city>state,直覺的寫法就是一串提取addr[town]...然後if ...,作者認為這樣子不大好,最好一次將次個結構提取出來,跟著做一串判斷
另一解法方式是類似如此

if (country === "USA") {
    first_half = town || city || "Middle-of-Nowhere";
    second_half = state || "USA";
} else {
    first_half = town || city || state || "Middle-of-Nowhere";
    second_half = country || "Planet Earth";
}
return first_half + ", " + second_half;
但作者提到這是熟悉javascript的方式

a larger example

turning thoughts into code (精煉你的想法)
describing logic clearly (清楚描述你的logic)
作者舉例之前Simplifying Loops and Logic的應用,顯示if~else需要簡化

knowing your libraries helps (讓你的函式庫有用)
書中描述一jquery範例實作網頁上tooltip顯示,一開始程式碼使用index跟slice()作為解析,更改的程式碼意圖表示用更抽象(藉由jquery)與一致的方式顯示tooltip。加上註解,這樣可以提高程式碼resue的機率

applying this method to larger problems (分割與處理)
作者提供了一個python處理transaction的方式,但是如果以直觀的方式寫code會出現很凌亂,書中把相似的片段加以集合以及問題加以分割

writing less code (精簡程式碼)
don’t bother implementing that feature—you won’t need it (不要實作你不需要的特色)
不要過分design

question and break down your requirements (處理你的需求)
不斷更新、改進需求

keeping your codebase small (保持程式碼的精簡)
愈少的程式碼愈好處理,必要時移除不必要的程式碼

be familiar with the libraries around you (工欲善其事,必先利其器)
花十五分鐘好好讀讀你用到的library

example: using unix tools instead of coding

===============我的感想===============
這裡提到的技巧都很像refactoring以及約耳趣談軟體內提到的,重複改善軟體(約耳並不鼓勵丟棄code),透過種種的精鍊,可以完成更好的code,除非本來的code真的一無可取

code改進好比改寫論文,必須要更加精簡,過程中就不斷地提升設計以用法,讓他們更精簡、更泛用,然則refactoring比較介於design與code之間,這本書則比較介於語法語code之間

此外很多程式設計師的意見並不一致,比方說這裡鼓勵使用人家的library,但是約耳點出,有時library也是要付出代價的,尤其是library往往也有他的bug,還有自己是否能控制library(指能夠理解並且改寫)。事實上library引用有時的確是很麻煩,好比tomcat最常遇到就是升級的時候一堆library需要升級的麻煩,之前專案的一堆程式碼是否需要改寫?此時問題已提升到configure management的範疇

沒有留言:

張貼留言