让代码重构渐行渐远系列(2)——降低代码重复度
重构背景及原因
最近由于项目组的人员在不断扩充,导致项目中代码风格各异,大有百花齐放甚至怒放之势。考虑到团队的生存与发展,经过众人多次舌战之后,最终决定项目组根据业务分成几个小分队,以加强团队管理与提高效率,同时也能培养阶梯人才。各个小分队为了“统一”代码风格,提高成员的代码能力以便最终能提高项目代码质量,减少以后的维护成本,最终决定“每日”进行小组内的代码走查/审查(Code Review),然后进行代码重构。
降低代码重复度:我所谓的代码重复指的不仅仅是多行一模一样的代码,同时也包括一些重复复制或是没必要的一些代码,如以下下代码:
1 public void 重复代码示例(int? 参数一) 2 { 3 if (参数一 != null) 4 { 5 //处理代码.... 6 } 7 else 8 { 9 参数一 = null; 10 //处理代码..... 11 } 12 13 //处理代码..... 14 15 }
可能有的朋友在第一眼看到这段代码时会说,这个没什么问题啊 ,哪有什么重复呀?真的就没有重复么?这段代码真的没有什么问题么?
那么请问下这个else里面的" 参数一 = null;" 这行代码有意义么?毕竟只有"参数一"为空时才会满足else分支条件,才会进入这个分支,也就是说你已经知道啦这个为null的时候又去给他赋值为null,这个算不算是重复呢?
可能有的朋友会说谁会写这样的代码呀,其实这种代码是我在项目中看到过类似的代码的。其实写出来这样的代码也没什么好奇怪的,因为有时候顺着业务逻辑走时就真的有可能会遇到这种问题的。
简单来说,上面的示例代码可以重构成如下代码:
1 public void 重复代码示例(int? 参数一) 2 { 3 if (参数一 != null) 4 { 5 //处理代码.... 6 } 7 8 //处理代码..... 9 10 }
接下啦就让我们看看我们比较熟悉的重复代码形式吧:
public void 重复代码示例方法一(string 参数一) { TestModel model = new TestModel(); if (!string.IsNullOrEmpty(参数一)) { model.Name = 参数一; model.Age = 0; model.Creator = "当前用户"; model.CreateTime = DateTime.Now; //逻辑代码 } } public void 重复代码示例方法二(int? 参数二) { TestModel model = new TestModel(); if (参数二 != null) { model.Age = 参数二.Value; model.Creator = "当前用户"; model.CreateTime = DateTime.Now; //逻辑代码 } }
public class TestModel { public string Name { set; get; } public int Age { set; get; } public string Creator { set; get; } public DateTime CreateTime { set; get; } }
那么我是否也可以重构一下以便减少重复代码呢?我想你也不想重复写代码吧!
1 public void 重复代码示例方法一(string 参数一) 2 { 3 TestModel model = new TestModel(); 4 if (!string.IsNullOrEmpty(参数一)) 5 { 6 model.Name = 参数一; 7 model.Age = 0; 8 NewMethod(model); 9 //逻辑代码 10 } 11 12 } 13 14 public void 重复代码示例方法二(int? 参数二) 15 { 16 TestModel model = new TestModel(); 17 if (参数二 != null) 18 { 19 model.Age = 参数二.Value; 20 NewMethod(model); 21 //逻辑代码 22 } 23 24 } 25 26 private static void NewMethod(TestModel model) 27 { 28 model.Creator = "当前用户"; 29 model.CreateTime = DateTime.Now; 30 }
这么一来,如果以后业务改变了,需要修改创建人和时间时我们就只需要修改 NewMethod(TestModel model) 这一个方法了,而不用修改原先的两处了,是不是相对的减少了代码重复度的同时,也便于维护呢?
当然啦,由于本人能力有限,以上示例不是特别恰当,但是我想说的是这种思想,减少重复代码,减低代码重复度的思想。
还是那句话,如果我们在写代码的时候就考虑到了这些我们还需要再花时间做此种重构么?代码重构怎能不渐行渐远呢?
以下是系列文章链接:
让代码重构渐行渐远系列(1)——解除多层嵌套
让代码重构渐行渐远系列(2)——降低代码重复度
让代码重构渐行渐远系列(3)——string.Equals取代直接比较与非比较