在C#(或者任何语言)中,我们最喜欢的消除重复的方式是什么?

时间:2020-03-05 18:52:35  来源:igfitidea点击:

我刚刚编写了700行类的代码。可怕。我垂头丧气。与英国的夏天相反,它与DRY相反。

它到处都是剪切和粘贴,并有一些细微的调整。这使其成为重构的主要候选者。在开始进行此工作之前,我想过我会问我们何时有很多重复,我们寻找的第一个重构机会是什么?

作为记录,我可能正在使用:

  • 通用类和方法
  • 方法重载/链接。

你是什​​么人

解决方案

回答

#地区

我只用了一行就完成了1,000行的学习!

认真地说,避免重复的最佳方法是列表中涵盖的内容,以及充分利用多态性,检查课程并发现在基类中最好做的事情以及如何分解其中的不同部分一个子类。

回答

首先,我建议重构的时间要比完成第一个版本的时间要早​​得多。任何时候看到重复,都应尽快消除。最初可能需要花费一些时间,但是我认为结果最终会更干净,并且可以在进行代码时重新思考代码,以确保自己做的正确。

至于我最喜欢的删除重复项的方式。...闭包,尤其是在我最喜欢的语言(Ruby)中。它们往往是采用两段代码并合并相似性的一种非常简洁的方法。当然(就像任何"最佳实践"或者技巧一样),这不能盲目地完成……我只是发现当我可以使用它们时,它们真的很有趣。

回答

我要做的一件事是,尝试制作一些小的和简单的方法,使我可以在编辑器(Visual Studio)的单个页面上看到它们。

我从经验中学到,简化代码可以使编译器更轻松地对其进行优化。方法越大,编译器就越难以工作!

我最近还看到了一个大方法导致内存泄漏的问题。基本上,我有一个非常类似于以下内容的循环:

while (true)
{
  var smallObject = WaitForSomethingToTurnUp();
  var largeObject = DoSomethingWithSmallObject();
}

我发现我的应用程序在内存中保留了大量数据,因为即使在smallObject返回某些内容之前'largeObject'不在作用域中,垃圾回收器仍然可以看到它。

我通过将'DoSomethingWithSmallObject()'和其他相关代码移至另一种方法来轻松解决了这一问题。

同样,如果我们使用小的方法,则在一个类中的重用率将大大提高。我通常会尝试确保我的所有方法都不像其他任何方法一样!

希望这可以帮助。

缺口

回答

我通常使用完全非异域的方法来解决"重复代码在这里和那里进行较小的调整并粘贴"的问题,将相似的代码块提取为另一种方法。在该代码块的每个实例中的一点点不同,都将其更改为参数。

斯科特·汉塞尔曼(Scott Hanselman)提供了一些简单的技巧来消除重复的if / else if和switch块:
http://www.hanselman.com/blog/CategoryView.aspx?category=Source+Code&page=2

回答

我可能会这样:

为数据结构创建自定义(专用)类型,并将所有相关逻辑放入其中。字典<string,List <int >>等

使内部功能或者特性保证行为。如果我们不断从可公共访问的属性中检查条件,则创建一个私有的getter方法,并纳入所有检查。

分开的方法太多了。如果我们不能在中加入简洁的名称或者给它起一个好名字,那么就开始将功能分开,直到代码被使用为止(即使这些子功能不在其他地方使用)。

如果所有其他方法都失败,请在其上拍一个[SuppressMessage(" Microsoft.Maintainability"," CA1502:AvoidExcessiveComplexity")]并注释原因。

回答

我喜欢在需要时开始进行重构,而不是获得第一个机会。我们可能会说,这在某种程度上是一种灵活的重构方法。我什么时候需要?通常,当我感到代码中的丑陋部分开始蔓延时。我认为只要将丑陋包含在内,丑陋就可以了,但是当它们开始具有传播欲望的那一刻,那就是我们需要照顾好生意的时候了。

我们用于重构的技术应该从最简单的开始。我强烈推荐马丁·福勒(Martin Fowler)的书。将通用代码组合到函数中,删除不需要的变量,以及其他简单的技术可以使我们受益匪浅。对于列表操作,我更喜欢使用函数式编程习惯用法。也就是说,我会尽可能使用内部迭代器,映射,过滤器和reduce(在python中,ruby,lisp和haskell中都有相应的内容),这使代码更短,更独立。

回答

有时,当我们使用复制和粘贴代码"完成功能"时,我们已经意识到它已被残废和损坏,以至于任何重构尝试实际上都将花费比在原点进行重构要长得多的时间。明显的。

以我个人的经验,我最喜欢的"消除重复的方式"是Resharper的"提取方法"功能(尽管在Visual Studio中也可以使用)。

很多时候,我会看到重复的代码(我正在维护的一些旧版应用程序)不是完整的方法,而是在完全独立的方法中的大块代码中。这为将这些大块转化为方法提供了绝佳的机会。

怪物类还倾向于揭示它们包含多个功能。这反过来又有机会将每个不同的功能分成自己的(希望是更小的)类。

我必须重申,做所有这些都不是一件令人愉快的经历(对我而言),因此我真的很愿意在一个小泥球的时候做对,而不是让大泥球滚动然后尝试解决它。