假设class X我想要返回内部成员的访问权限:
class Z
{
// details
};
class X
{
std::vector<Z> vecZ;
public:
Z& Z(size_t index)
{
// massive amounts of code for validating index
Z& ret = vecZ[index];
// even more code for determining that the Z instance
// at index is *exactly* the right sort of Z (a process
// which involves calculating leap years in which
// religious holidays fall on Tuesdays for
// the next thousand years or so)
return ret;
}
const …Run Code Online (Sandbox Code Playgroud) 我们有一个相当大的代码库,400K LOC的C++,代码重复是一个问题.有没有可以有效检测重复代码块的工具?
理想情况下,这将是开发人员在开发过程中可以使用的东西,而不是偶尔运行以查看问题所在.如果我们可以将这样的工具与CruiseControl集成在每次签入后提供报告,那也很好.
我前段时间看过Duploc,它显示了一个漂亮的图形,但需要一个小型的环境来使用它,这使得自动运行它相当困难.
免费工具会很好,但如果有一些好的商业工具我也会感兴趣.
从版本15开始,IntelliJ警告我有关代码重复的信息.
在某些情况下,这可能是故意的,所以我想通过使用@SuppressWarnings注释忽略/禁止此警告.但是这个的正确价值是什么?
编辑:我不是要求完全禁用这种检查,因为有问题是否可以禁用Intellij中的重复代码检测?
在最近的一次代码审查中,我在一个类中发现了几行重复逻辑(少于15行).当我建议作者重构代码时,他认为代码更容易理解.在再次阅读代码后,我不得不同意提取重复的逻辑会稍微损害可读性.
我知道DRY是指南,而不是绝对的规则.但总的来说,你是否愿意以DRY的名义伤害可读性?
int a, b, c;
Constructor()
{
a = 5;
b = 10;
c = 15;
//do stuff
}
Constructor(int x, int y)
{
a = x;
b = y;
c = 15;
//do stuff
}
Constructor(int x, int y, int z)
{
a = x;
b = y;
c = z;
//do stuff
}
Run Code Online (Sandbox Code Playgroud)
为了防止重复"东西"和一些任务,我尝试了类似的东西:
int a, b, c;
Constructor(): this(5, 10, 15)
{
}
Constructor(int x, int y): this(x, y, 15)
{
}
Constructor(int x, int y, int z) …Run Code Online (Sandbox Code Playgroud) 在我的一个Java项目中,由于Java处理(而非)原语的方式,我受到代码重复的困扰.具有相同的变化手工复制到四个不同的位置(之后int,long,float,double)再次,对于第三次的时候,再和再次我来到非常接近(?)来抢购.
在各种形式中,这个问题已经在StackOverflow上提出了:
共识似乎趋向于两种可能的替代方案:
好吧,第二个解决方案就是我现在正在做的事情,它对我的理智慢慢变得危险,就像众所周知的折磨技术一样.
自从提出这些问题并且Java 7出现以来已过去两年了.因此,我希望有一个更简单和/或更标准的解决方案.
Java 7是否有任何可能在这种情况下缓解压力的变化?我在简明的变更摘要中找不到任何内容,但也许在某处有一些不起眼的新功能?
虽然源代码生成是另一种选择,但我更喜欢使用标准JDK功能集支持的解决方案.当然,使用cpp或其他代码生成器可以工作,但它添加了更多的依赖项,并需要更改构建系统.
似乎JDK支持的唯一代码生成系统是通过注释机制.我设想一个可以像这样扩展源代码的处理器:
@Primitives({ "int", "long", "float", "double" })
@PrimitiveVariable
int max(@PrimitiveVariable int a, @PrimitiveVariable int b) {
return (a > b)?a:b;
}
Run Code Online (Sandbox Code Playgroud)
理想的输出文件将包含此方法的四个请求变体,最好使用相关的Javadoc注释等.是否有某处注释处理器来处理这种情况?如果没有,构建一个会怎样?
也许最近出现了一些其他技巧?
编辑:
一个重要的注意事项:除非我有理由,否则我不会使用原始类型.即使是现在,在某些应用程序中使用盒装类型也会产生非常真实的性能和内存影响.
编辑2:
使用max()作为示例允许使用compareTo()所有数字盒装类型中可用的方法.这有点棘手:
int sum(int a, int b) {
return a …Run Code Online (Sandbox Code Playgroud) 我的一位同事正在我们一起工作的项目中实现一个新功能,他通过从同一个项目中获取包含类似功能实现的文件来创建它,创建一个重命名所有全局声明并稍微修改它的副本.实现.所以我们最终得到了两个大文件,除了重命名之外几乎完全相同.
我试图解释它使我们的项目更难维护,但他不想改变任何说他更容易以这种方式编程的东西,并且没有理由修复代码,如果它"不是打破了".
我怎么能说服他这样的代码重复是件坏事呢?
它与这些问题有关,但我对针对技术人员(另一个程序员)的答案更感兴趣,例如,对书籍这样的权威来源的引用会很棒.我已经尝试过简单的参数并且没有成功.
你是如何消除重复代码的狂热者?
就个人而言,每当我看到重复代码时,无论是在测试代码还是生产中,我都倾向于重复复制.我唯一的例外是这些:
C++ 11"移动"是一个很好的功能,但我发现当与"复制"同时使用时,很难避免代码重复(我们都讨厌这个).下面的代码是我实现的一个简单的循环队列(不完整),两个push()方法几乎相同,除了一行.
我遇到过很多像这样的情况.任何想法如何避免这种代码重复而不使用宏?
===编辑===
在这个特定的例子中,重复的代码可以被重构并放入一个单独的函数中,但有时这种重构是不可用的或者不能轻易实现.
#include <cstdlib>
#include <utility>
template<typename T>
class CircularQueue {
public:
CircularQueue(long size = 32) : size{size} {
buffer = std::malloc(sizeof(T) * size);
}
~CircularQueue();
bool full() const {
return counter.in - counter.out >= size;
}
bool empty() const {
return counter.in == counter.out;
}
void push(T&& data) {
if (full()) {
throw Invalid{};
}
long offset = counter.in % size;
new (buffer + offset) T{std::forward<T>(data)};
++counter.in;
}
void push(const T& data) {
if (full()) { …Run Code Online (Sandbox Code Playgroud) code-duplication ×10
c++ ×3
refactoring ×3
coding-style ×2
dry ×2
c# ×1
c++-faq ×1
c++11 ×1
class ×1
const ×1
constructor ×1
copy-paste ×1
java ×1
parameters ×1
primitive ×1
this ×1
unit-testing ×1