我在遗留项目中有一个PHP文件,至少有几千行.它主要由一个大约10个案例的switch语句分成许多不同的条件块.在每种情况下,似乎都有一个非常相似的 - 如果不是完全相同的 - 代码块.有哪些方法可以让我将这些代码块识别为相同或接近相同 - 因此我可以抽象出代码并开始重构整个文件?我知道这可以用非常手动的术语(将代码中的每个case语句分成单个文件和Diff),但我对我可以用什么工具加速这个过程感兴趣.
谢谢.
我正在开发一个Android项目,我正面临这种情况.
我有2节课:
class A extends B
{
openDoor(){
//impl
}
closeDoor(){
//impl
}
}
class X extends Y{
openDoor(){
//impl
}
closeDoor(){
//impl
}
}
Run Code Online (Sandbox Code Playgroud)
现在,如果你观察到两个类openDoor()和两个常见的方法closeDoor()
什么是避免重复方法的最佳方法?
我的方法
class ContainingDuplicateMethods{
openDoor(){
//impl
}
closeDoor(){
//impl
}
}
}
Run Code Online (Sandbox Code Playgroud)
在类中创建ContainingDuplicateMethods对象并调用方法,我们将其称为策略模式,但这是最佳解决方案吗?为什么,因为在大型项目中我们不能遵循这种方法,人们说它不是很好的做法,在这种情况下,我需要遵循什么方法?
请注意,class A and X已经扩展了其他类,我也不想使用静态因为 - 静态成员在程序执行开始时被加载到内存中,并且将在内存中直到程序终止,比如我的代码连续运行数天或数周继续使用静态引用创建许多对象,因此我们可能会耗尽内存.
Python作为动态语言,提供了多种方法来实现相同的功能.这些选项的可读性,可维护性和性能可能不同.尽管我用Python编写的常用脚本具有可支配性,但我现在有一个我正在研究的项目(学术性的)必须是可读的,可维护的并且表现相当好.由于我以前没有在Python中进行任何严格的编码,包括任何类型的分析,我需要帮助来决定上面提到的三个因素之间的平衡.
这是我正在研究的科学包中的一个模块的代码片段.它是一个具有非常基本骨架结构的n-ary Tree类.这是用继承和子类编写的.
注意:在下面的代码中,树与节点是相同的.每棵树都是同一个Tree树的一个实例.
class Tree(object):
def __init__(self, parent=None, value=None):
self.parent = parent
self.value = value
self.children = set()
Run Code Online (Sandbox Code Playgroud)
下面的两个函数属于这个类(以及许多其他函数)
def isexternal(self):
"""Return True if this is an external tree."""
return not bool(self.children)
def isleaf(self):
"""Return True if this is a leaf tree."""
return not bool(self.children)
Run Code Online (Sandbox Code Playgroud)
这两个函数都完全相同 - 它们只是两个不同的名称.那么,为什么不将它改为:
def isleaf(self):
"""Return True of this is a leaf tree."""
return self.isexternal()
Run Code Online (Sandbox Code Playgroud)
我怀疑的是:
我已经读过Python中的函数调用相当昂贵(为每个调用创建新的堆栈),但我不知道如果一个函数依赖于另一个函数是好还是坏.它将如何影响可维护性.这在我的代码中多次发生,我从另一个方法调用一个方法以避免代码重复.这样做是不好的做法?
以下是同一类中此代码重复方案的另一个示例:
def isancestor(self, tree):
"""Return True if this tree is an ancestor of the specified tree."""
return …Run Code Online (Sandbox Code Playgroud) 我有两个代码片段,试图将浮动列表转换为Vector3或Vector2列表.这个想法是从列表中一次取2/3个元素并将它们组合成一个向量.最终结果是一系列向量.
let rec vec3Seq floatList =
seq {
match floatList with
| x::y::z::tail -> yield Vector3(x,y,z)
yield! vec3Seq tail
| [] -> ()
| _ -> failwith "float array not multiple of 3?"
}
let rec vec2Seq floatList =
seq {
match floatList with
| x::y::tail -> yield Vector2(x,y)
yield! vec2Seq tail
| [] -> ()
| _ -> failwith "float array not multiple of 2?"
}
Run Code Online (Sandbox Code Playgroud)
代码看起来很相似,但似乎无法提取公共部分.有任何想法吗?
您可以使用Tortoise SVN比较两个修订或文件.还有比较两个目录的方法吗?
我有两个包含源代码的目录.90%的代码是相同的.现在我要在插件中存储相同的代码,因为重复的代码很糟糕.如果有比较两个目录的方法,Tortoise Diff将是完美的.
我怎样才能做到这一点?如果使用Tortoise是不可能的,那么为此目的,您是否还有其他想法/工具?
遗憾的是,我最近一直在开发的项目有大量的复制粘贴代码,即使在单个文件中也是如此.是否有任何工具或技术可以检测单个文件中的重复或近似重复?我有超越比较3,它适用于比较单独的文件,但我不知道比较单个文件.
提前致谢.
编辑:
感谢所有伟大的工具!我肯定会检查出来的.
这个项目是一个ASP.NET/C#项目,但我使用各种语言,包括Java; 我对哪种工具(最适合任何语言)删除重复感兴趣.
我想将当前行复制到它下面的新行.我发现这篇文章,但我找不到他们editor.action.copyLinesDownAction在选项>键盘中谈论的选项().
我们2017年如何做到这一点?
我有一个asp.net mvc网站,我使用C#构建大部分页面,例如根据我的viewmodel给出一组数据构建html表
我也有很多javascript,然后动态地修改这些表(例如添加行).
添加新行的javascript代码看起来非常类似于我在C#中使用的"渲染"代码,它首先用于构建html表.
每次我将c#代码更改为添加新字段时,我都要记得回到javascript代码来执行相同的操作.
这里有更好的方法吗?
位输入流由字节数组支持。有一些方法可以从该字节数组读取到各种强制原始数组。
有重复的代码。Java 缺乏原始类型的泛型,因此重复可能是不可避免的。
重复代码在以下方法中很明显:
@Override
public long readBytes(final byte[] out, final int offset, final int count, final int bits) {
final int total = offset + count;
assert out != null;
assert total <= out.length;
final long startPosition = position();
for (int i = offset; i < total; i++) {
out[i] = readByte(bits);
}
return position() - startPosition;
}
@Override
public long readShorts(final short[] out, final int offset, final int count, final int bits) {
final int …Run Code Online (Sandbox Code Playgroud) 我是一名编程老师,我想编写一个脚本来检测 C/C++/Python 文件中的重复量。我想我可以将任何文件视为纯文本。
该脚本的输出将是重复的相似序列的数量。最终,我只对 DRY 指标感兴趣(代码满足 DRY 原则的程度)。
我天真地尝试做一个简单的自相关,但很难找到合适的阈值。
u = open("find.c").read()
v = [ord(x) for x in u]
y = np.correlate(v, v, mode="same")
y = y[: int(len(y) / 2)]
x = range(len(y))
z = np.polyval(np.polyfit(x, y, 3), x)
f = (y - z)[: -5]
plt.plot(f)
plt.show();
Run Code Online (Sandbox Code Playgroud)
所以我正在寻找不同的策略...我还尝试比较每条线、每组2条线、每组3条线之间的相似性...
import difflib
import numpy as np
lines = open("b.txt").readlines()
lines = [line.strip() for line in lines]
n = 3
d = []
for i in range(len(lines)):
a = lines[i:i+n]
for j in …Run Code Online (Sandbox Code Playgroud) code-duplication ×10
c# ×2
java ×2
python ×2
refactoring ×2
algorithm ×1
analytics ×1
android ×1
arrays ×1
asp.net-mvc ×1
compare ×1
copy ×1
copy-paste ×1
diff ×1
f# ×1
jquery ×1
optimization ×1
performance ×1
php ×1
similarity ×1
svn ×1
tortoisesvn ×1