一個程序員怎么能做出這樣的事情?
本文是從 Why On Earth Would A Developer Do This? 這篇文章翻譯而來。
我正好看到了下面的一段代碼:
public void Execute()
{
ArrayList empIds = PayrollDatabase.GetAllEmployeeIds();
foreach (int empId in empIds)
{
Employee employee = PayrollDatabase.GetEmployee(empId);
if (employee.IsPayDate(payDate))
{
DateTime startDate = employee.GetPayPeriodStartDate(payDate);
Paycheck pc = new Paycheck(startDate, payDate);
paychecks[empId] = pc;
employee.Payday(pc);
}
}
}
這段代碼有點老,是用.NET 2.0之前版本寫的。可是,并不是里面ArrayList的用法讓我苦惱。首先他從數據庫里取出所有員工的Id。然后他遍歷這個Id集合,從數據庫這取出每個員工的信息。每當我看到這樣的代碼,我都想踹寫這個程序的人一腳。
如果你還不明白這樣的寫法有什么問題,請這樣想想:你第一次把select語句發送給數據庫查詢員工Id,查詢出5條員工記錄。然后你需要向數據庫 請求另外5條查詢語句,分別查出這幾個員工的信息。這還好,6次查詢并不是一個多大的事情,不是嗎?可是你為什么不能把所有需要的數據一次性的全部查詢出 來呢(這樣只有一次開銷大的查詢)!想象一下,如果你要計算的是100個員工的工資呢,而不是5個?如果是1000個員工的呢?
讓我不可理解的是,這樣的代碼天天都會產生。難道這些人真的不在乎、或真的不知道這樣的代碼有多糟嗎?如果他們真的不知道,那真是很悲哀。如果他們不在意,那更糟糕,因為如果一個程序員明知這樣寫有問題還是要這樣寫,很顯然,他不認為他的工作有價值,他不關心他的程序,他的團隊,他的公司,以及他的客戶。
如果你奇怪我是從哪里找到這段代碼的…是在Robert C(敏捷軟件開發理論的創始人)那里。他的《敏捷軟件開發:原則、模式與實踐(C#版)》這 邊書里。是的,是 Robert C。Martin,也就是Uncle Bob。我也許不該批評面向對象領域里如此著名的人物,可是,說真的,Bob,你腦袋進水了嗎?你的整本書的目的都是在教育人如何寫出優質的代碼,里面可 以找到大量很有價值的教導。但把這樣的代碼當作例子實在是不可寬恕。
本文轉載自: 外刊IT評論 http://www.aqee.net/