C中的设计原理DRY?

Ach*_*hal -2 c performance design-patterns

我的问题是更大的编码视角,但我试图通过简单的例子来理解.可以说我有几行代码

int main(void) {
    int input_1 = 10;
    int input_2 = 10;
    /* some stuff */
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在阅读了设计原则之后(我不确定它是否常见于编程语言,我希望它是通用的)我开始知道上面的代码是有效的C代码,但它是一个脏代码,因为在这里我不是在关注DRY(Don不重复自己的原则,因为幻数10正在重复.

首先我怀疑的是,C标准是否对编码的最佳实践说了同样的内容,我读了规格,但我没有完全准确?

我修改如下,以避免短语脏代码

int main(void) { /* I'm not 100 percent sure that this is not dirty code ? */
    const int value = 10; /*assigning 10 to const variable*/
    int input_1 = value; 
    int input_2 = value;  
    /* some stuff */
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

修改后的版本是正确的还是我可以做得更好?最后,如果最好地建议这些设计原则,那么为什么编译器不会产生任何警告.

小智 5

这更多是关于避免幻数.如果你声称它是" 相同的10 ",你10应该有一些语义含义.那你应该做点什么

#define FROBNUM 10 // use a name here that explains the meaning of the number

int main(void) {
    int input_1 = FROBNUM; 
    int input_2 = FROBNUM;  
    /* some stuff */
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

引入一个const是不必要的,宏很好地解决了这个问题.这里解决了DRY,宏定义是具体值的唯一来源.


另一方面,如果两个10值之间没有语义关系,则#define改为使用两个宏.如果它们确实具有不同的含义,那么这不是"重复自己".不要在这里误解DRY.


关于你的版本的附注const:它有两个缺陷

  • 这个名字value根本不是语义,因此没有任何收获,这个数字仍然是神奇的
  • 使用此声明,您将引入一个自动存储持续时间和类型的新对象int,您并不真正需要它.一个好的编译器会优化它,但最好不要依赖它 - 这就是为什么宏在这里更合适.