每当看到这样的代码,我都想踹写这个程序的人一脚

如果你还不明白这样的写法有什么问题,请这样想想:你第一次把select语句发送给数据库查询员工Id,查询出5条员工记录。然后你需要向数据库请求另外5条查询语句,分别查出这几个员工的信息。这还好,6次查询并不是一个多大的事情,不是吗?可是你为什么不能把所有需要的数据一次性的全部查询出来呢(这样只有一次开销大的查询)!

NetSmell 出品

我正好看到了下面的一段代码, 这段代码有点老,是用.NET 2.0之前版本写的。可是,并不是里面ArrayList的用法让我苦恼。

首先他从数据库里取出所有员工的Id。然后他遍历这个Id集合,从数据库这取出每个员工的信息。

每当我看到这样的代码,我都想踹写这个程序的人一脚。

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);

}

}

}

如果你还不明白这样的写法有什么问题,请这样想想:你第一次把select语句发送给数据库查询员工Id,查询出5条员工记录。然后你需要向数据库请求另外5条查询语句,分别查出这几个员工的信息。这还好,6次查询并不是一个多大的事情,不是吗?可是你为什么不能把所有需要的数据一次性的全部查询出来呢(这样只有一次开销大的查询)!想象一下,如果你要计算的是100个员工的工资呢,而不是5个?如果是1000个员工的呢?

让我不可理解的是,这样的代码天天都会产生。难道这些人真的不在乎、或真的不知道这样的代码有多糟吗?如果他们真的不知道,那真是很悲哀。如果他们不在意,那更糟糕,因为如果一个程序员明知这样写有问题还是要这样写,很显然,他不认为他的工作有价值,他不关心他的程序,他的团队,他的公司,以及他的客户。

如果你奇怪我是从哪里找到这段代码的…是在Robert C(敏捷软件开发理论的创始人)那里。他的《敏捷软件开发:原则、模式与实践(C#版)》这边书里。是的,是 Robert C。Martin,也就是Uncle Bob。我也许不该批评面向对象领域里如此著名的人物,可是,说真的,Bob,你脑袋进水了吗?你的整本书的目的都是在教育人如何写出优质的代码,里面可以找到大量很有价值的教导。但把这样的代码当作例子实在是不可宽恕。

原文:Why On Earth Would A Developer Do This?

显示余下内容
相关文章:
  1. 软件开发者保持高效的技巧
  2. 关于 AliSQL 开源大家关心的问题
  3. 10款最好用的MySQL数据库客户端图形界面管理工具
  4. 阿里云宣布开放开源AliSQL数据库
  5. 软件公司为什么用笨程序员
  6. 提高软件开发效率的5个经验
  7. 四周时间并不比二小时的编程时间有成效
  8. 程序员跳槽的最佳时机选择
  9. 二维图片上物体的三维编辑研究
  10. 编程巨星的唯一秘诀
 

《“每当看到这样的代码,我都想踹写这个程序的人一脚”》 有 1 条评论

  1. eastlei说道:

    不一定,有事需要故意这么做,我遇到过一种情况:如果一次查出的话需要用到聚合函数,并且由于数据库设计问题(外键不是id没加索引),导致速度非常慢,后来我在优化时估计改成你说的这种错误情况,速度提升10倍以上(有链接池,是在一个翻页列表中,一页不会超过15条,也就是说我查询了16次)。

发表评论

您的电子邮箱地址不会被公开。