它充满了复制和粘贴,只是在这里和那里进行了微小的调整。这使得它成为重构的首选对象。在开始之前,我想问一下,当你有很多重复的代码时,你首先寻找哪些重构机会?
记录一下,我的可能是使用:
- 通用类和方法
- 方法重载/链接。
我喜欢在需要重构时开始工作,而不是第一次有机会就开始。你可以说这是一种敏捷的重构方法。我何时感觉需要呢?通常是当我感觉我的代码中的丑陋部分开始蔓延时。我认为只要它们被包含在内,丑陋是可以接受的,但当它们开始有扩散的冲动时,那就是你需要处理的时候了。
重构时使用的技术应该从最简单的开始。我强烈推荐马丁·福勒的书。将通用代码组合成函数、删除不必要的变量和其他简单技巧可以让你获得很多收益。对于列表操作,我更喜欢使用函数式编程习惯。也就是说,我尽可能地使用内部迭代器、map、filter和reduce(在Python中有相应的东西,在Ruby、Lisp和Haskell中也有),这样可以使代码更加简洁和自包含。
#region
我使用了一个1,000 行代码的类,但只用到了其中一行!
说真的,避免重复的最好方法是按照你的列表中所涵盖的事项,并充分利用多态性,检查你的类并发现在基类中应该进行的最佳操作以及如何将其不同部分分解为子类。
首先,我建议在第一个类版本完成之前尽早进行重构。每当发现代码重复时,立即消除它。虽然这可能会花费一些额外的时间,但我认为结果会更加干净,并且在您编写代码时有助于重新思考以确保正确执行。
至于我最喜欢消除重复的方法...闭包,特别是在我最喜欢的语言(Ruby)中。它们往往是将两个代码片段合并相似性的一种非常简洁的方式。当然(像任何“最佳实践”或技巧一样),这不能盲目地完成...但我发现当我能使用它们时,它们非常有趣。
我可能会这样做:
为数据结构创建自定义(私有)类型,并将所有相关逻辑放在其中。例如:Dictionary<string, List<int>>等。
创建内部函数或属性以保证行为。如果您不断地从公共可访问的属性检查条件,则创建一个带有所有检查内容的私有getter方法。
将具有过多操作的方法拆分开来。如果您无法将某些简洁的东西放入函数中或给它一个好的名称,那么请开始将该函数拆分,直到代码变得简单易懂(即使这些“子”函数在其他地方没有使用)。
如果一切都失败了,请在其上打上[SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")]并注释原因。