一個程式設計師怎麼能做出這樣的事情?

類別: IT

我正好看到了下面的一段程式碼:

    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,你腦袋進水了嗎?你的整本書的目的都是在教育人如何寫出優質的程式碼,裡面可以找到大量很有價值的教導。但把這樣的程式碼當作例子實在是不可寬恕。

一個程式設計師怎麼能做出這樣的事情?原文請看這裡