一个程序员怎么能做出这样的事情?
webphp 13年前
<div id="OSChina_News_20352" class="NewsContent TextContent NewsType2"> <p>本文是从 <a href="/misc/goto?guid=4958183270679128806" target="_blank">Why On Earth Would A Developer Do This?</a> 这篇文章翻译而来。</p> <hr /> <p>我正好看到了下面的一段代码:</p> <div style="font-family:Consolas;background:white;color:black;font-size:10pt;"> <p style="margin:0px;"> <span style="color:blue;">public</span> <span style="color:blue;">void</span> Execute()</p> <p style="margin:0px;"> {</p> <p style="margin:0px;"> <span style="color:#2b91af;">ArrayList</span> empIds = <span style="color:#2b91af;">PayrollDatabase</span>.GetAllEmployeeIds();</p> <p style="margin:0px;"> <span style="color:blue;">foreach</span> (<span style="color:blue;">int</span> empId <span style="color:blue;">in</span> empIds)</p> <p style="margin:0px;"> {</p> <p style="margin:0px;"> <span style="color:#2b91af;">Employee</span> employee = <span style="color:#2b91af;">PayrollDatabase</span>.GetEmployee(empId);</p> <p style="margin:0px;"> <span style="color:blue;">if</span> (employee.IsPayDate(payDate))</p> <p style="margin:0px;"> {</p> <p style="margin:0px;"> <span style="color:#2b91af;">DateTime</span> startDate = employee.GetPayPeriodStartDate(payDate);</p> <p style="margin:0px;"> <span style="color:#2b91af;">Paycheck</span> pc = <span style="color:blue;">new</span> <span style="color:#2b91af;">Paycheck</span>(startDate, payDate);</p> <p style="margin:0px;"> paychecks[empId] = pc;</p> <p style="margin:0px;"> employee.Payday(pc);</p> <p style="margin:0px;"> }</p> <p style="margin:0px;"> }</p> <p style="margin:0px;"> }</p> </div> <p>这段代码有点老,是用.NET 2.0之前版本写的。可是,并不是里面ArrayList的用法让我苦恼。首先他从数据库里取出所有员工的Id。然后他遍历这个Id集合,从数据库这取出每个员工的信息。每当我看到这样的代码,我都想踹写这个程序的人一脚。</p> <p>如果你还不明白这样的写法有什么问题,请这样想想:你第一次把select语句发送给数据库查询员工Id,查询出5条员工记录。然后你需要向数据库 请求另外5条查询语句,分别查出这几个员工的信息。这还好,6次查询并不是一个多大的事情,不是吗?可是你为什么不能把所有需要的数据一次性的全部查询出 来呢(这样只有一次开销大的查询)!想象一下,如果你要计算的是100个员工的工资呢,而不是5个?如果是1000个员工的呢?</p> <p>让我不可理解的是,这样的代码<strong>天天</strong>都会产生。难道这些人真的不在乎、或真的不知道这样的代码有多糟吗?如果他们真的不知道,那真是很悲哀。如果他们不在意,那更糟糕,因为如果一个程序员明知这样写有问题还是要这样写,很显然,他不认为他的工作有价值,他不关心他的程序,他的团队,他的公司,以及他的客户。</p> <p>如果你奇怪我是从哪里找到这段代码的…是在Robert C(敏捷软件开发理论的创始人)那里。他的<a href="/misc/goto?guid=4958183271416811284" target="_blank">《敏捷软件开发:原则、模式与实践(C#版)》</a>这 边书里。是的,是 Robert C。Martin,也就是Uncle Bob。我也许不该批评面向对象领域里如此著名的人物,可是,说真的,Bob,你脑袋进水了吗?你的整本书的目的都是在教育人如何写出优质的代码,里面可 以找到大量很有价值的教导。但把这样的代码当作例子实在是不可宽恕。<br /> <br /> 本文转载自: 外刊IT评论 <a href="/misc/goto?guid=4958183272158702965" rel="nofollow">http://www.aqee.net/</a> <br /> </p> </div>