C++ 如何调用这种编写代码的方式?

C++ 如何调用这种编写代码的方式?,c++,language-agnostic,C++,Language Agnostic,我正在回顾一个非常老的项目,并且已经第二次看到类似这样的代码(类似C++的伪代码): 在此代码中,conditionA在两次计算中的计算结果相同,conditionB的计算结果相同。因此,代码相当于: if( conditionA ) { actionA(); } if( conditionB ) { actionB(); } 因此,前一个变体只是相同效果代码的两倍。这种编写代码的方式(我指的是前一种变体)怎么能被称为呢?我称之为糟糕的代码。尽管我倾向于在项目中找到类似的结构,这些

我正在回顾一个非常老的项目,并且已经第二次看到类似这样的代码(类似C++的伪代码):

在此代码中,
conditionA
在两次计算中的计算结果相同,
conditionB
的计算结果相同。因此,代码相当于:

if( conditionA ) {
   actionA();
}
if( conditionB ) {
   actionB();
}

因此,前一个变体只是相同效果代码的两倍。这种编写代码的方式(我指的是前一种变体)怎么能被称为呢?

我称之为糟糕的代码。尽管我倾向于在项目中找到类似的结构,这些结构在没有进行任何代码审查的情况下不断增长。(或其他松散的开发实践)。

我称之为糟糕的代码。尽管我倾向于在项目中找到类似的结构,这些结构在没有进行任何代码审查的情况下不断增长。(或其他松散的开发实践)。

我也会称之为糟糕的代码


缩进没有最好的方法,但有一条黄金法则:选择一条并坚持下去。

我也会称之为坏代码


缩进没有最好的方法,但有一条金科玉律:选择一个并坚持下去。

这是一个不知道如何使用缩进的人编写的代码。

这是一个不知道如何使用缩进的人编写的代码。

这是“冗余”代码,是的,这是不好的。如果必须在对actionA的调用中添加某个前提条件(假设前提条件本身不能放入actionA),那么我们现在必须在两个地方修改代码,因此可能会忽略其中一个

在这种情况下,删除某些代码行会比编写新代码感觉更好。

这是“冗余”代码,是的,这是不好的。如果必须在对actionA的调用中添加某个前提条件(假设前提条件本身不能放入actionA),那么我们现在必须在两个地方修改代码,因此可能会忽略其中一个


在这种情况下,删除某些代码行比编写新的代码行感觉更好。

这确实是一种糟糕的编码实践,但请注意,如果条件A和B评估有任何副作用(var增量等),则这两个片段并不相等。

这确实是一种糟糕的编码实践,但请注意,如果条件A和条件B评估有任何副作用(var增量等),则这两个片段并不相等。

无效代码?
此外,可以称为“按行付费”

低效代码?

另外,可以称为“按行付费”

我会称之为“两次更好”。这样做是为了确保运行时真正理解问题;)


(尽管在多线程、不安全的环境中,两种变体的结果可能不同。)

我称之为“两次更好”。这样做是为了确保运行时真正理解问题;)


(虽然在多线程、不安全的环境中,两种变体的结果可能不同。)

我可以称之为“我上个月在匆忙/不专注/疲劳时编写的代码”。我们都犯过或已经犯过这样的错误。只要改变它。如果你想,你可以试着找出是谁干的,希望不是你,然后给他/她的反馈。

我可以称之为“我上个月写的代码,当时我很匆忙/没有集中精力/很累”。我们都犯过或已经犯过这样的错误。只要改变它。如果你想,你可以试着找出是谁干的,希望不是你,然后给他/她的反馈。

既然你说你已经不止一次看到过这件事,那么这似乎不仅仅是因为疲劳而导致的一次性错误。我认为有人反复提出这样的代码有几个原因:

  • 代码本来是不同的,经过了重构,但不管是谁做的,都会发现这是多余的
  • 做这件事的人对布尔逻辑没有很好的掌握
    (还有一种可能性是,这可能比你的简化剪报节目要复杂得多。)

    既然你说你不止一次看到过这一点,那么这似乎不仅仅是由于疲劳造成的一次性错误。我认为有人反复提出这样的代码有几个原因:

  • 代码本来是不同的,经过了重构,但不管是谁做的,都会发现这是多余的
  • 做这件事的人对布尔逻辑没有很好的掌握 (还有一点可能性,这可能比你的简化剪报节目要多。)

    伙计们?看看这部分:(条件a和&条件b) 基本上,如果conditionA恰好为false,则它不会计算conditionB

    现在,这将是一种糟糕的编码风格,但如果conditionA和conditionB不仅仅计算数据,而且如果这些条件后面还有一些代码改变了数据,那么这两种符号之间可能会有巨大的差异

    如果conditionA为false,则conditionA将计算两次,conditionB仅计算一次。 如果conditionA为true,conditionB为false,则两个条件都将求值两次。 如果两个条件都为true,则两个条件都只执行一次

    在第二个建议中,两个条件只执行一次。。。因此,只有当两种方法的计算结果都为真时,这些方法才是等效的

    为了使事情变得更复杂,如果conditionB为false,那么actionA可以更改一些会更改此验证的内容!因此,else分支也将执行actionB。但是,如果两个条件的计算结果都为true,并且actionA会将conditionB的计算结果更改为false,那么它仍然会执行actionB

    我倾向于把这样的代码称为:“为什么当你能用硬的方式做事情时,让事情变得简单?”并将其视为一种设计模式。实际上,在“”中,代码变得更加复杂,因此只有主开发人员才能理解它,而其他开发人员只会感到困惑,并希望放弃
    if( conditionA ) {
       actionA();
    }
    if( conditionB ) {
       actionB();
    }
    
    if (A&&B){
      action1;
    } elseif(A){
      action2;
    } elseif(B){
      action3;
    } else{action4}
    
    if( fizz && buzz ) {
       printFizz();
       printBuzz();
    } else {
       if( fizz ) {
          printFizz();
       }
       else if( buzz ) {
          printBuzz();
       }
       else {
          printValue();
       }
    }