冗余代码构造

时间:2008-09-26 12:45:14

标签: coding-style

我经常看到的最令人遗憾的冗余代码构造涉及使用代码序列

if (condition)
    return true;
else
    return false;

而不是简单地写

return (condition);

我在各种语言中看到了这个初学者错误:从Pascal和C到PHP和Java。你会在代码审查中标记出哪些其他类似的结构?

19 个答案:

答案 0 :(得分:11)

if (foo == true)
{
   do stuff
}

我一直告诉开发人员应该这样做

if ((foo == true) == true)
{
   do stuff
}

但他还没有得到提示。

答案 1 :(得分:10)

if (condition == true)
{
  ...
}

而不是

if (condition)
{
  ...
}

修改

甚至更糟糕的是转向条件测试:

if (condition == false)
{
  ...
}

很容易理解为

if (condition) then ...

答案 2 :(得分:8)

使用注释而不是源代码控制:
- 如果需要,可以输出或重命名功能而不是删除它们并信任源控制可以让它们回来 - 添加“RWF Change”之类的评论,而不仅仅是进行更改并让源控制分配责任。

答案 3 :(得分:5)

某处我发现了这件事,我觉得这是布尔冗余的顶峰:

return (test == 1)? ((test == 0) ? 0 : 1) : ((test == 0) ? 0 : 1);

: - )

答案 4 :(得分:4)

与C语言以外的语言分别声明:

int foo;  
foo = GetFoo();

答案 5 :(得分:4)

冗余代码本身不是错误。但如果你真的想保存每一个角色

return (condition);

也是多余的。你可以写:

return condition;

答案 6 :(得分:3)

void myfunction() {
  if(condition) {
    // Do some stuff
    if(othercond) {
      // Do more stuff
    }
  }
}

而不是

void myfunction() {
  if(!condition)
    return;

  // Do some stuff

  if(!othercond)
    return;

  // Do more stuff
}

答案 7 :(得分:3)

我曾经有一个人反复这样做过:

bool a;
bool b;
...
if (a == true)
    b = true;
else
    b = false;

答案 8 :(得分:2)

我看到的最常见的冗余代码构造是从未在程序中的任何位置调用的代码。

另一种是在没有使用它们的地方使用的设计模式。例如,在任何地方写“new BobFactory()。createBob()”,而不是只写“new Bob()”。

删除未使用和不必要的代码可以大大提高系统的质量和团队维护它的能力。从未考虑过从系统中删除不必要的代码的团队,这些好处往往令人吃惊。我曾经与团队一起进行了代码审查,删除了项目中超过一半的代码,而没有改变他们系统的功能。我认为他们会被冒犯,但他们经常会在此之后回复我的设计建议和反馈。

答案 9 :(得分:2)

最后无用地回来:

   // stuff
   return;
}

答案 10 :(得分:2)

在堆上分配元素而不是堆栈。

{
    char buff = malloc(1024);
    /* ... */
    free(buff);
}

而不是

{
    char buff[1024];
    /* ... */
}

{    
    struct foo *x = (struct foo *)malloc(sizeof(struct foo));
    x->a = ...;
    bar(x);
    free(x);
}

而不是

{
    struct foo x;
    x.a = ...;
    bar(&x);
}

答案 11 :(得分:2)

复制粘贴冗余:

if (x > 0)
{
   // a lot of code to calculate z
   y = x + z;
}
else
{
   // a lot of code to calculate z
   y = x - z;
}

而不是

if (x > 0)
  y = x + CalcZ(x);
else
  y = x - CalcZ(x);

甚至更好(或更混淆)

y = x + (x > 0 ? 1 : -1) * CalcZ(x)

答案 12 :(得分:2)

对空的恐惧(这也会导致严重的问题):

if (name != null)
  person.Name = name;

如果是冗余的(不使用其他):

if (!IsPostback)
{
   // do something
}
if (IsPostback)
{
   // do something else
}

冗余检查(Split永远不会返回null):

string[] words = sentence.Split(' ');
if (words != null)

更多关于检查(如果要循环,第二次检查是多余的)

if (myArray != null && myArray.Length > 0)
  foreach (string s in myArray)

我最喜欢的ASP.NET:在代码中分散DataBind以便进行页面渲染。

答案 13 :(得分:2)

exit语句作为第一个语句放在函数中以禁用该函数的执行,而不是以下选项之一:

  • 完全删除功能
  • 评论职能部门
  • 保留功能但删除所有代码

使用exit作为第一个语句会很难发现,您可以轻松地阅读它。

答案 14 :(得分:2)

在字符串上使用.tostring

答案 15 :(得分:1)

我经常遇到以下情况:

function foo() {
    if ( something ) {
        return;
    } else {
        do_something();
    }
}

但这并不能告诉他们其他方面没用。它必须是

function foo() {
    if ( something ) {
        return;
    }
    do_something();
}

或 - 取决于在do_something()之前完成的检查的长度:

function foo() {
    if ( !something ) {
        do_something();
    }
}

答案 16 :(得分:1)

来自噩梦般的代码评论.....

char s[100];

接着是

memset(s,0,100);

接着是

s[strlen(s)] = 0;

有很多令人讨厌的

if (strcmp(s, "1") == 0)

关于代码的问题。

答案 17 :(得分:0)

当您想要设置行为时使用数组。在插入之前,您需要检查所有内容以确保它不在数组中,这会使您的代码变得越来越慢。

答案 18 :(得分:0)

Redundant .ToString()调用:

const int foo = 5;
Console.WriteLine("Number of Items: " + foo.ToString());

不必要的字符串格式:

const int foo = 5;
Console.WriteLine("Number of Items: {0}", foo);