![]() |
1
3
三是一个很好的经验法则,但要看情况而定。为了消除重复,重构常常涉及到将代码库和API的概念简单性与较小的代码库进行权衡,后者一旦有人理解了,就更容易维护。我通常是从这个角度来评价事物的。 在一个极端,如果修复重复使代码更具可读性,并且几乎没有或根本没有增加代码的概念复杂性,那么任何重复都是不可接受的。举个例子,当重复的代码整齐地分解成一个简单的引用透明的函数,它可以做一些易于解释和命名的事情。 当需要更复杂、更重的解决方案(如元编程、OO设计模式等)时,我可能会允许4或5个实例,特别是在复制片段很小的情况下。在这些情况下,我认为解决方案的概念复杂性使得治疗比疾病更糟糕,直到有很多实例。 在最极端的情况下,我所使用的代码库是一个快速发展的原型,我不知道项目可能朝着什么方向发展,从而绘制出既合理简单又合理未来证明的抽象线,我只是放弃了。在这样一个代码库中,我认为最好只关注权宜之计并完成一些事情,而不是好的设计,即使同一段代码重复了20次。通常,正在创建所有复制的原型部分都是那些将很快被丢弃的部分,而且一旦您知道原型的哪些部分将被保留,就可以随时重构这些部分。如果没有将被丢弃的部件所创建的附加约束,重构在这个阶段通常更容易。 |
![]() |
2
3
我不知道什么是一个好的“度量标准”,但我会说,我通常努力的是
然后重构以消除重复。所有的复制都是坏的。我很少让代码出现在两个地方,而在三个地方,它肯定会消失。 |
![]() |
3
1
我个人对此相当狂热。我试图设计我的项目以避免代码重复。我的目标是在较低的单个数字中获得阈值,如果我不能达到这一点,这意味着我的设计不够好,我需要回到绘图板或重构。 |
![]() |
4
1
取决于编程语言。(这位“克隆侦探”似乎认识到了这一点:“编程语言约束”是他第一次展示的方框之一。) 在Lisp程序中, 任何 重复的表达式很容易被重构——我猜你会称之为阈值2。所有东西都由表达式组成,并且有宏来翻译表达式,所以很少有借口重复任何东西,甚至一次。(我能想到的唯一一件很难提取的事情就是循环子句,事实上,许多人出于这个原因提倡避免循环。) 在许多其他语言中,程序由具有具有语句的方法的类组成,因此很难只提取表达式并将其用于两个不同的文件中。它通常意味着在提取时改变事物的结构。通常还有一个类型安全的要求,这是有限制的(除非你想写一个 整批 一直在使用反射代码来逃避它,但是如果这样做了,就不应该使用静态语言)。如果我使当前静态类型的程序完全干涸,那么它既不短也不容易维护。 我想结果是我们真正想要的是“易于维护”。有时,在某些语言中,这意味着“只需在此处放置一个注释,说明您复制的内容和原因”。dry是可维护代码的良好指标。如果你经常重复,那不是个好兆头。但是,追踪任何一个统计数据也往往是不好的——否则,我们只需对此进行优化就可以解决所有的问题。 |
![]() |
5
1
我想我们需要结合
以便在删除重复项的成本/效益之间取得良好的平衡。 |
![]() |
6
0
我们的 CloneDR 在大型源系统中查找由langauge语法参数化的重复代码(精确复制和未遂)。它支持Java、C语言、COBOL语言、C++语言、PHP语言等多种语言。 它接受许多参数来定义“什么是克隆?”,包括: a)相似阈值,控制两个代码块之间的相似程度 要声明的克隆(通常95%是好的) b)最小克隆大小的行数(3个往往是一个不错的选择) c)参数数量(文本有明显的变化;5个是一个不错的选择) 使用这些设置,它会发现实际上10-15%的冗余代码 它所处理的一切。 |
![]() |
ali · flex box最佳实践 2 年前 |
![]() |
Jan Wytze · Scala隔离特定平面图 7 年前 |
![]() |
Scott Deerwester · 在Go中包装多个实现 7 年前 |
![]() |
Moshe · 有没有办法做这个干衣机 7 年前 |
![]() |
Josh Kelley · 惯用角形构件 7 年前 |
![]() |
Karol Selak · 如何使用冗余的'let!`方法调用? 7 年前 |
![]() |
Brandon Benefield · JS类和OOJ 7 年前 |
![]() |
TheNovice · 跨两个Ruby模块继承/共享代码 7 年前 |