问题标签 [code-duplication]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
1484 浏览

asp.net - 动态 UI 与静态 UI

我一直在想,我应该在什么时候放弃静态数据输入表单的便利性以及对动态 UI 的设计器支持,从而消除大量代码重复?

在编程世界中似乎存在冲突,人们不断地尝试删除代码重复以提高可维护性,但是当涉及到表单时,一切都消失了,一切都被明确地添加到表单中。

我应该寻找什么迹象才能知道什么时候该让设计师尘埃落定并创建动态 UI?

0 投票
11 回答
2226 浏览

unit-testing - 如何使用 Mocks 避免重复逻辑

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

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

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

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

我觉得我错过了一些东西,必须有一种更好的方法来避免这种概念上的重复,或者至少对其进行测试,以便如果它发生变化,那么没有传播变化的事实会使单元测试失败。

有什么建议么?

更新:

让我试着澄清我的问题。我正在考虑代码何时随时间演变,如何确保通过模拟测试的类和模拟所代表的类的实际实现之间的集成不会中断。

例如,我刚刚有一个案例,我有一个最初创建的方法并且不期望 null 值,所以这不是对真实对象的测试。然后,该类的用户(通过模拟测试)得到增强,可以在某些情况下将 null 作为参数传递。在集成中断时,因为未对真实类进行空值测试。现在,在开始构建这些类时,这没什么大不了的,因为您在构建时正在测试两端,但是如果设计需要在两个月后发展,而您往往会忘记细节,那么您将如何测试它们之间的交互这两组对象(通过模拟测试与实际实现测试的对象)?

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

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

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

[编辑开始赏金]

阅读与 Aaron 的互动就可以找到问题的重点,但我真正想要的是一些关于如何避免或管理明显重复的见解,以便真实班级行为的变化将出现在与 mock 交互的单元测试是有问题的。显然这不会自动发生,但可能有一种方法可以正确设计场景。

[关于奖励赏金的编辑]

感谢所有花时间回答问题的人。获胜者教会了我一些关于如何考虑在两层之间传递数据的新知识,并首先得到了答案。

0 投票
3 回答
4958 浏览

language-agnostic - 如何找到类似的代码片段?

有没有人有一些工具或一些推荐的做法如何找到一段与其他代码相似的代码?

我经常写一个函数或一个代码片段,我记得我之前已经写过类似的东西,我想重用以前的实现,但是使用纯文本搜索不会显示任何内容,因为我没有使用变量名完全一样。

拥有相似的代码片段会导致不必要的代码重复,但是对于大型代码库,不可能将所有代码都保存在内存中。是否有任何工具可以对功能上“相似”的代码和标记的片段或功能进行一些分析?

考虑以下示例:


在我看来,这已经被问了好几次了:

https://stackoverflow.com/questions/204177/what-tool-to-find-code-duplicates-in-c-projects

如何在开发过程中检测代码重复?

我建议在这里关闭重复。


其实我认为这是一个更普遍的搜索问题,比如:如果问题已经在 StackOverflow 上被问过,我该如何搜索?

0 投票
2 回答
394 浏览

c# - 多个项目之间的重复功能

我目前在两个社交网站上工作,它们有很多共同点,但又截然不同。我发现自己为两者(包括 UI)编写了很多相同的代码,并且想知道是否存在限制重复代码的最佳实践。

主要问题之一是这些项目彼此非常独立,并且很快就会有更多的差异而不是相似之处。此外,一旦最初的工作完成,它们可能会被移交给其他程序员,因此共享代码库最终可能会成为一个大问题。

可能不得不处理类似情况的人有什么建议吗?

PS:我是这两个项目的唯一开发者,而且看起来这种情况会持续一段时间。

0 投票
6 回答
991 浏览

code-analysis - 您使用什么重复检测阈值?

我们都同意重复是邪恶的,应该避免(不要重复自己的原则)。为确保这一点,应使用静态分析代码,如Simian(多语言)或Clone Detective(Visual Studio 插件)

我刚刚阅读了Ayende 关于科比的帖子,他说:

Kobe 的 8.5% 是复制粘贴代码。那就是在灵敏度调高的情况下,如果我们将阈值设置为 3,这是我通常所做的,它会上升到 12.5%。

我认为 3 作为阈值非常低。在我的公司,我们提供质量代码分析即服务,我们的默认重复阈值设置为 20,并且存在大量重复。我无法想象如果我们将其设置为 3,我们的客户甚至都不可能考虑更正。

我理解 Ayende 对 Kobe 的看法:它是一个官方样本,并被宣传为“旨在指导您规划、构建和实施 Web 2.0 应用程序和服务”。所以对质量的期望很高。

但是对于您的项目,您使用什么最小阈值进行复制?

相关问题:您如何狂热地消除代码重复?

0 投票
2 回答
167 浏览

c - 如何删除这些 C 宏之间的重复?

我有以下几个用于创建测试函数的C预处理器宏:

像这样使用:

像这样使用:

如何删除两个宏之间的重复?

0 投票
15 回答
713 浏览

open-source - “开源”是否翻译为“任何人都可以拿我的作品并在任何地方以他们喜欢的方式托管它”?

在“与程序员相关”和“明确负责”之间划清界限时,我通常倾向于后者,但我真的很想听听社区对此有何看法。我觉得这应该是 CW(我从未创建过 CW 主题),但我会让有更多 SO 经验的人打这个电话。

概括:

“开源”是否翻译为“任何人都可以拿我的作品并在任何地方以他们喜欢的方式托管它”?

编辑:对于那些询问的人,许可证是 LGPL。

细节:

我的开源作品托管在 Codeplex,并且已经存在一段时间了。今天,我看到它也托管在Softpedia上,没有明显参考原作者的实际站点(链接在那里,一两层深,但没有它应该的那么突出)。他们复制了所有源自 Codeplex 的相关内容并自己托管……就像一面镜子,但原作者不知情。

我根本没有被告知/询问/等等。“开源”是否翻译为“任何人都可以拿我的作品并在任何地方以他们喜欢的方式托管它”?

我对这个项目没有金钱利益。这只是一个有趣的爱好——满足用户需求并帮助我解决我作为开发人员的弱点(最好是协作)——也许是为了“回馈”。如果我想从这个项目中赚钱,我会对此更加恼火......例如,如果我从下载站点产生广告收入(当按软件名称搜索时,你现在会发现 Softpedia 持有在 Google 的搜索结果中,该项目的 Codeplex 页面曾经占据的位置)。

无论如何,我不喜欢另一个站点突然托管的气味,没有我的合作或祝福,不仅是可下载的安装程序,还有我的逐字产品描述、截图、更新日志等。

是的,他们显示了我的名字,但无法联系到我。坦率地说,“我的名字”是我讨厌他们在我不知情的情况下使用的东西——我不认识这些人,我也不想以任何方式与他们或他们的网站建立联系。

我得到它。我在线。我做了一些东西。人们会链接到我——这在技术上也是如此(如果你能找到链接),但这个网站感觉不对。

同样,如果这个网站甚至是对产品的最基本的评论/评论,那将是不同的。但这让我看起来像是把自己和他们联系在一起——在那里创建了一个帐户,或者其他什么——而我没有。

他们将许可证简单地列为“免费软件”,与 Codeplex 网站上容易提供的许可证相比,它是模糊的(至少可以说)。就像可以说是 Codeplex 的隐藏链接一样,他们对“免费软件”的定义在他们网站的其他地方有更详细的解释,但不像在 Codeplex 上那么明显。我什至还没有考虑过他们的“免费软件”定义是否/如何与选择 LGPL 的“我的”意图不同。

我还没有尝试联系这些人,但我的乐观情绪并不高,因为我开始吸引那些在不涉及他们的情况下复制他人内容的人(同样,这里没有“提交”内容,他们的网站不提供独特的评论/补充我的工作)。

我希望有人能提供一些有用/有用的东西?我喜欢这个项目(这是我的第一次开源尝试)。我不想让我或我的用户感到头疼?

这只是作为一个免费软件的开源软件作者的一部分吗?你的工作在别处被重复(而且还在别处——呵呵),你对此无能为力吗?你认为这是一个合法的“链接”吗?我是否错过了被激怒的标志?

0 投票
1 回答
144 浏览

code-duplication - 如何最好地处理跨平台/层的重复代码?

我很好奇每个人如何处理跨多个平台/层的代码重复。

例如,在我们的应用程序中,我们有一个显示声明的屏幕。如果一个声明满足某些标准并且用户希望查看其列表中哪些声明未完成,则该声明被认为是未完成的,因此应用程序中有一段代码可以执行此操作。

然后,我们也有完全独立于应用程序的报告,用户想要他们所有未决索赔的报告。由于无法创建索赔实体并从报告中查看它是否未完成,因此我们似乎必须有一些重复的代码。

您可以在数据库中有一个函数或某些东西来提供此信息和您的单段代码,但是您随后完全依赖数据库来实现业务逻辑,并且您必须为每个声明往返于数据库你想签入应用程序,并不完全理想!

那么,每个人都是如何处理这种情况的,有什么我应该注意的最佳实践吗?

0 投票
20 回答
4493 浏览

c++ - 代码重复的任何正当理由?

我目前正在审查一个非常古老的 C++ 项目,并在那里看到很多代码重复。

例如,有一个类有 5 个 MFC 消息处理程序,每个处理程序包含 10 行相同的代码。或者到处都有一个非常具体的字符串转换的 5 行代码段。在这些情况下,减少代码重复根本不是问题。

但是我有一种奇怪的感觉,我可能误解了某些东西,并且这种重复本来是有原因的。

复制代码的正当理由是什么?

0 投票
1 回答
255 浏览

.net - 为什么我在 Reflector 的 Linq 中看到如此多的代码重复?

编辑:我在原来的问题中犯了一个错误。它应该是关于方法LastLastOrDefault(或SingleSingleOrDefault,或FirstFirstOrDefault - 很多!)。

这个问题的启发,我打开了 Reflector 并查看了代码

然后我跳到代码

我看到完全相同的一段代码(大约 20 行),只有最后一行不同(第一个方法返回默认值(T),第二个方法抛出异常)。

我的问题是为什么会这样?为什么微软的人允许在 .Net 框架内复制重要的代码片段?他们没有代码审查吗?