一個程序員怎么能做出這樣的事情?

webphp 13年前發布 | 6K 次閱讀 程序員

本文是從 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/

 本文由用戶 webphp 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!