标签: code-duplication

任何避免C#和javascript中重复代码的想法

我有一个asp.net mvc网站,我使用C#构建大部分页面,例如根据我的viewmodel给出一组数据构建html表

我也有很多javascript,然后动态地修改这些表(例如添加行).

添加新行的javascript代码看起来非常类似于我在C#中使用的"渲染"代码,它首先用于构建html表.

每次我将c#代码更改为添加新字段时,我都要记得回到javascript代码来执行相同的操作.

这里有更好的方法吗?

c# asp.net-mvc jquery code-duplication

9
推荐指数
1
解决办法
1240
查看次数

是否更好地进行代码重复并使其非常简单/可读,或者没有重复(使用泛型)但更复杂?

总的来说,我经常遇到这个问题.我的一些同事喜欢非常简单易读的类,即使这意味着存在一些代码重复,而我尽我所能避免代码重复,即使它意味着制作更复杂的架构.什么是最佳做法?我专门用Java工作.

java generics code-duplication

8
推荐指数
4
解决办法
698
查看次数

在Visual Studio 2010中检测重复的代码

Clone Detective是在VS 2008中查找重复代码的绝佳工具.

是否有任何工具可以找到集成到VS 2010中的重复代码?

*Clone Detective看起来并不像它正在积极开发1 2.

code-duplication visual-studio-2010

8
推荐指数
1
解决办法
5047
查看次数

使用__class__创建实例

用于__class__在类中创建新实例是一个好主意吗?

以下代码是执行此操作的示例:

from collections import namedtuple

_Position = namedtuple('Position', ['x', 'y'])
class Position(_Position):
    def __add__(self, other):
        return __class__(self.x + other.x, self.y + other.y)
Run Code Online (Sandbox Code Playgroud)

使用实际的类名称听起来像重复的代码给我.如果类的名称发生了变化,我必须在所有情况下更改它,即使现代IDE可以为您做到这一点.

顺便说一句.什么样的变量是__class__?你不应该只能访问它self.吗?

python code-duplication python-3.x

8
推荐指数
1
解决办法
2990
查看次数

可以将SonarQube代码重复检测器参数化以停止方法边界吗?

我在我的Java项目中使用SonarQube,并希望尽可能消除代码中的代码重复.

我的问题是SonarQube的代码重复检测没有考虑方法边界.它将文件的相同部分列为重复,并且经常发生复制在方法中间开始并在另一个中间结束.这些很难被重构.

这是一个例子.单击右上方列表框中的文件MavenArtifactRepository.java,然后查看页面下部的第4个复制块.

有没有办法参数化代码重复检测器插件来显示重复,这在语法上是连贯的?

java code-duplication sonarqube

8
推荐指数
1
解决办法
3535
查看次数

在C++继承中删除虚拟类成员的代码重复

我现在陷入了一个奇怪的问题.我写了一个非常简化的版本.

class Base
{
public:
  virtual int func1()=0;
  virtual int func2()=0;
protected:
  int n;
};

class der1: public Base
{
  // implements the virtual functions of the base and uses the protected data 
  // members of the base.
};

class der2: public Base
{
  // implements the virtual functions of the base and uses the protected data 
  // members of the base.
}
Run Code Online (Sandbox Code Playgroud)

现在的问题....都der1der2实现基础的虚拟功能几乎相同的方式.但是其他一些类(der3,der4)也有自己的实现.但仍需要继承基地.我如何重构代码以oop方式删除代码重复?

c++ inheritance refactoring protected code-duplication

8
推荐指数
1
解决办法
307
查看次数

如何避免使用Mocks重复逻辑

我有以下挑战,我没有找到一个好的答案.我正在使用Mocking框架(在本例中为JMock),以允许单元测试与数据库代码隔离.我正在模拟对涉及数据库逻辑的类的访问,并使用DBUnit单独测试数据库类.

我遇到的问题是我注意到逻辑在概念上在多个地方重复的模式.例如,我需要检测数据库中的值不存在,因此在这种情况下我可能会从方法返回null.所以我有一个数据库访问类来进行数据库交互,并适当地返回null.然后我有业务逻辑类,它从模拟接收null,然后测试如果值为null则适当地执行.

现在如果将来行为需要改变并且返回null不再合适,比如因为状态变得更加复杂,那么我将需要返回一个报告值不存在的对象以及一些其他事实来自数据库.

现在,如果我在这种情况下将数据库类的行为更改为不再返回null,那么业务逻辑类仍然会起作用,并且该错误只会在QA中捕获,除非有人记住耦合,或者正确地遵循了方法的用法.

我失去了一些东西,我必须有一个更好的方法来避免这种概念上的重复,或者至少让它受到测试,这样如果它发生变化,变化没有传播的事实就不能通过单元测试.

有什么建议?

更新:

让我试着澄清一下我的问题.我正在考虑代码何时随着时间的推移而发展,如何确保集成不会在通过模拟和模拟代表的类的实际实现测试的类之间中断.

例如,我只有一个案例,我有一个最初创建的方法,并没有期望空值,所以这不是对真实对象的测试.然后,在某些情况下,类的用户(通过模拟测试)被增强以传入null作为参数.在破坏的集成上,因为真正的类没有测试为null.现在,在构建这些类时,这并不是什么大不了的事,因为你在构建时测试两端,但如果设计需要在两个月之后发展,当你倾向于忘记细节时,你将如何测试之间的交互这两组对象(通过模拟与实际实现测试的对象)?

潜在的问题似乎是重复(即违反DRY原则),期望实际上保留在两个地方,虽然关系是概念性的,没有实际的重复代码.

[在Aaron Digulla对他的回答进行第二次编辑后编辑]:

是的,这正是我正在做的事情(除了在通过DBUnit测试的类中与DB进行进一步的交互,并且在测试期间与数据库交互,但它是相同的想法).所以现在,我们需要修改数据库行为,以便结果不同.使用模拟的测试将继续通过,除非1)有人记得或2)它在集成中断.因此,数据库的存储过程返回值(比如)基本上在模拟的测试数据中重复.现在困扰我的重复是逻辑是重复的,它是对DRY的微妙违反.它可能就是这样(毕竟有一个集成测试的原因),但我感觉到我错过了一些东西.

[编辑开始赏金]

阅读与Aaron的互动得到了问题的重点,但我真正想要的是如何避免或管理明显的重复,以便真正的类的行为的变化将显示在与模拟交互的单元测试作为破坏的东西.显然,这不会自动发生,但可能有一种方法可以正确设计场景.

[关于授予赏金的编辑]

感谢所有花时间回答问题的人.获胜者告诉我一些关于如何考虑在两层之间传递数据的新内容,并首先得到答案.

unit-testing mocking code-duplication

7
推荐指数
2
解决办法
1682
查看次数

如何在"向上"和"向下"方向上操作DOM时避免重复代码?

我正在写一个JS webapp客户端.用户可以编辑文本项的列表/树(例如,待办事项列表或备注).我用jQuery操作DOM很多.

用户可以使用键盘上下导航列表(类似于GMail中的J/K键),并执行其他几项操作.这些操作中的许多操作具有镜像"向上"/"向下"功能,例如

$.fn.moveItemUp = function() {
    var prev = this.getPreviousItem();
    prev && this.insertBefore(prev);
    // there's a bit more code in here, but the idea is pretty simple,
    // i.e. move the item up if there's a previous item in the list
}

$.fn.moveItemDown = function() {
    var next = this.getNextItem();
    next && this.insertAfter(next);
    // ....
}
Run Code Online (Sandbox Code Playgroud)

现在这个具有两个几乎相同的函数的模式在我的代码中的几个地方重复,因为在列表/树上有许多操作非常对称.

问题:如何优雅地重构这一点以避免代码重复?

到目前为止我提出的琐碎方法是使用.apply()......

$.fn.moveItem = function(direction) {
        var up = direction === 'up',
            sibling = up ? this.getPreviousItem() : this.getNextItem(), 
            func = …
Run Code Online (Sandbox Code Playgroud)

javascript jquery refactoring code-duplication

7
推荐指数
1
解决办法
1369
查看次数

汇编语言的自动代码重复数据删除?

我一直在阅读一些汇编编程视频,以便更好地理解如何手动优化编译后留下的*.s文件.gcc/g++ -S ... 其中一个主题是重构冗余代码,演示如何将冗余代码移动到自己的标记块以ret结束并用呼叫替换它.

视频中给出的示例是2个块,包含:

mov eax,power
mul ebx
mov power,eax
inc count
Run Code Online (Sandbox Code Playgroud)

它取而代之的是call CalculateNextPower和CalculateNextPower看起来像:

CalculateNextPower:
mov eax,power
mul ebx
mov power,eax
inc count
ret
Run Code Online (Sandbox Code Playgroud)

出于好奇,试图减少编译大小,我用-S和各种优化编译了一些C和C++项目,包括-Os,-O2,-O3,-pipe,-combine和-fwhole-program,并分析了结果*.s使用轻微修补(for .s文件)版本的duplo进行冗余的文件.只有-fwhole-program (现已弃用的IIRC)对消除文件中的重复代码有显着影响(我认为它的替换(-s)-flto在链接时会表现相似 - 大致相当于用-ffunction-sections -fdata-sections编译和--gc-sections链接)但仍然错过了大量的代码块.

使用duplo输出的手动优化导致随机C项目的大小减少约10%,并且当仅具有至少5个连续重复指令的连续块组件被重复数据删除时,随机C++项目中几乎减少30%.

我是否遗漏了一个编译器选项(甚至是一个独立的工具),在编译大小时会自动消除冗余程序集(包括其他编译器:clang,icc等等) 或者是否缺少此功能(原因?)?

如果它不存在,则可以修改duplo以忽略以'.'开头的行.要么 ';' (以及其他人?)并使用重复代码调用函数替换重复的代码块,但我对其他可直接使用编译器内部表示(最好是clang或gcc)的建议持开放态度.

编辑:我修补杜普洛识别重复组装块在这里,但它仍然需要在此刻手动重构.只要使用相同的编译器生成代码,就可以(但可能很慢)识别最大的重复代码块,将它们放在自己的"函数"块中,并用CALL替换代码到该块.

size assembly code-duplication compiler-optimization

7
推荐指数
1
解决办法
560
查看次数

Kotlin:我怎样才能避免构造函数中的代码重复?

通常我发现自己处于一种情况,我有一个具有许多可选参数的超类,并且这些相同的参数也需要在其子类中是可选参数.

例如,超类:

abstract class Plugin(val name: String, val version: String = "1.0",
                      val author: String = "", val description: String = "")
Run Code Online (Sandbox Code Playgroud)

扩展这个课程是一件痛苦的事.这是一个示例子类:

abstract class CyclePlugin(name: String, version: String = "1.0", author: String = "",
                       description: String = "", val duration: Int, val durationUnit: TimeUnit
                       = MILLISECONDS) : Plugin(name, version, author, description)
Run Code Online (Sandbox Code Playgroud)

注意:我将用我的解决方案回答这个问题.我正在寻找更好的解决方案.

constructor code-duplication duplicates kotlin

7
推荐指数
2
解决办法
396
查看次数