这是上周在代码审阅会议上讨论到的一段代码,这段代码的作用是根据指定记录数量和页面大小来计算最大分页数量的。
1 /// <summary> 2 /// 根据指定记录数量和页面大小返回分页页数。 3 /// </summary> 4 /// <param name="totalRecords">记录总数。</param> 5 /// <param name="pageSize">页面大小。</param> 6 /// <returns>返回分页页数。</returns> 7 public static long ComputePages(int totalRecords, int pageSize) 8 { 9 var total = Convert.ToDouble(totalRecords);10 var size = Convert.ToDouble(pageSize);11 12 var temp = total / size;13 14 return (long)Math.Ceiling(temp);15 }
在代码审阅会议上起初并没有留意到这段代码,但随着翻阅了多个代码页之后便发现“ComputePages”这个方法被多次重新定义,且功能完全一样。应该是开发人员复制粘贴过来的,原本也是想针对复制粘贴来讲讲这段代码的,但后来发现了更多的问题:
找到了问题所在,那么就会有一定的解决方案:
为了使得大家更容易理解,我将代码重构的一些具体思路和想法以备注的方式贴在代码里面了,大家认真观察,有问题可以提出。
1 /// <summary> 2 /// 根据指定记录数量和页面大小返回分页页数。 3 /// </summary> 4 /// <param name="totalRecords">记录总数。</param> 5 /// <param name="pageSize">页面大小。</param> 6 /// <returns>返回分页页数。</returns> 7 /* 8 * 1、方法返回值从long修改为int。原因如下: 9 * ·输入参数皆为int,且运算关系为除法,所以输出结果必定在int范围之内。不使用unit是因为那会给整个解决方案的其他部分代码带来很多的编码痛苦;10 * ·小小的内存性能改进;11 */12 public static int ComputePages(int totalRecords, int pageSize)13 {14 /*15 * 2、对记录总数的类型安全判断和业务逻辑处理:16 * ·记录总数肯定是大于等于零的数;17 * ·记录总数为零的时候,页数肯定也是零,此时后续的代码逻辑没有意义,可以直接返回0;18 */19 if (totalRecords < 1) return 0;20 /*21 * 3、对页面大小的类型安全判断和业务逻辑处理:22 * ·页面大小不能为0,因为分母不能为0;23 * ·页面大小不能为负数,因为这与事实不符;24 * ·当页面大小为1的时候,页数其实就是记录总数,直接返回totalRecords,这同时也避免了后续的代码无意义的执行,减少了性能损耗;25 */26 if (pageSize < 1) return totalRecords;27 28 /*29 * 4、对原方法业务逻辑的重构、类型转换方式的优化及性能优化:30 * ·通过任何数字乘以(或除以)浮点数其结果仍然为浮点数的方式完成自动的、隐式的类型转换,这不但使得代码更加简洁,且优化了性能;31 * ·代码简单、可读性强,更加容易理解业务逻辑;32 */33 return (int)Math.Ceiling(totalRecords*1.0/pageSize);34 }
俗话说细节决定成败。作为程序员,从代码的细节我们就能看得出一个人编程水平的高低和开发经验的多寡,这也从一定意义上决定了你的成与败!
之前我发表过很多文章,都是从人文角度来引导新手的,今天这篇文章,也正好说明了人文因素对程序员素质的影响!
要做事,请首先做好人,对自己的代码负责就是对自己负责,对自己负责就是对团队负责,对团队负责就是对企业利益负责,因为我们是同一个团队,拥有同样的利益!
新闻热点
疑难解答