我的一位同事正在编写一份报告,该报告显示了我们小型咨询公司中每位员工每周(周日至周六)的进展情况。他编写的一段代码显示了与目标周中的日期相对应的列。他的算法如下:
- 获取该月的第一天是一周中的哪一天。如果是星期天,将标志设置为零;否则,将其设置为 1。
- 遍历一个月的所有日子。如果是星期天,增加标志。然后,如果标志的值等于要显示的星期,则显示对应于当天的列;否则,隐藏该列。
当然,标志表示当前周是什么。
我建议了另一种算法:
- 获取该月的哪几天是指定周的第一天 (F) 和最后 (L) 天。例如,2009 年 10 月的第一周从周二 1 日开始,到周六 3 日结束。
- 遍历对应于第 1 天到 F-1 天的列,并隐藏它们。
- 遍历对应于天 F 到 L 的列,并显示它们。
- 遍历对应天 L+1 到 DaysOfMonth 的列,并隐藏它们。
我的算法中的“困难”部分是第 1 部分。我的意思是“难以理解”中的“困难”,因为这样做的算法复杂性是恒定的。而且我的算法的优点是循环更紧密。我的同伴的循环对每个月的每一天进行比较。我的没有。
这是一个小例子,你可能会说这里的过度优化有点太偏执了。但是当我们编写实际的性能关键代码时,他的编程风格并没有改变。
他的代码也充满了这些测试:
/* doSomething() doesn't change the state of the relevant variables. */
if (condition)
{
flag++;
if (flag > test)
doSomething();
}
else
if (flag >= test)
doSomething();
当然,什么时候可以这样做:
if (flag >= test);
doSomething();
if (condition)
flag++;
我该怎么办?!?!?!
编辑:我更正了代码示例中的比较。