「這個手環就像是為我的職業道德做出了公開聲明。它是一個明顯的指示,代表我承諾 『我將盡己所能把程式寫到最好』。所以它仍在我的手腕上,當我寫程式時,不斷提醒著我對自己曾經做出過,撰寫 Clean Code 的承諾」
取自: Clean Code (p.449)
calculateWeeklyPay(false)
)// (X) 程式碼不是愈短愈好!
public int m_otCalc() {
return iThsWkd * iThsRte +
(int) Math.round(0.5 * iThsRte *
Math.max(0, iThsWkd - 400)
);
}
Date newDate = date.add(5);
// vs.
Date daysLater = date.addDaysTo(5);
// (X)
if(page.size() == 55){
//...
}
// (O)
if(page.size() == page.MAX_PAGE_SIZE){
//...
}
int dailyPay = hourlyRate * 8;
double circumference = radius * PI * 2;
// (O)
bool shouldBeDeleted = timer.hasExpired() && timer.isRecurrent() == false;
if(shouldBeDeleted) {
...
}
// (X)
if(timer.hasExpired() && timer.isRecurrent() == false) {
...
}
if(shouldBeDeleted) {...}
// vs.
if(!shouldNotBeDeleted) {...}
public void paySalary() {
foreach(Employee e in employees) {
if(e.isPayDay()) {
Money pay = e.calculatePay();
e.deliverPay(pay);
}
}
}
上述函式做了三件事:檢視所有職員、檢查哪幾位職員該獲得薪資、付薪資。應當改寫成
public void paySalary() {
foreach(Employee e in employees){
payIfNecessary(e);
}
}
private void payIfNecessary(Employee e) {
if(e.isPayDay()) {
calculateAndDeliverPay(e);
}
}
private void calculateAndDeliverPay(Employee e) {
Money pay = e.calculatePay();
e.deliverPay(pay);
}
public static void main(String[] args) {
Arguments arguments = parseCLI(args);
...
}
a.getB().getC().doSomething();
以上例來說,將來若想在模組 B 和 C 之間安插新的模組 Q 時,必須找出所有的 "a.getB().getC()" 敘述,並安插入 getQ(),這使架構變得生硬,我們不應漫步在系統的物件圖裡,倒不如讓立即的合作者提供所需要的服務
myCollaborator.doSomething();
import package.*;
(但要注意,少數情況會遇到名稱衝突)public static final int
這種古老技巧ModemDecorator
),這樣的行為也叫做專案裡的「普及語言 (Ubiquitous Language)」getOos()
vs. createOrReturnOos()
)感謝所有追蹤到這邊的各位讀者們,您的支持與訂閱是我創作的最大動力。希望各位開發者們都能夠在未來持續發揮專業精神,撰寫 Clean Code (無瑕的程式碼),如同 Martin Flower 所承諾:「我將盡己所能把程式寫到最好」