我的问题是为了更大的编码视角,但我试图用简单的例子来理解。假设我有几行代码
int main(void) {
int input_1 = 10;
int input_2 = 10;
/* some stuff */
return 0;
}
阅读设计原则后(我不确定它对于编程语言是否常见,我希望它是通用的)我开始知道上面的代码是有效的 C 代码,但它是脏代码 因为在这里我没有遵循DRY(不要重复自己)原则,因为神奇的数字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;
}
修改后的版本是否正确,或者我可以做得更好吗?最后,如果这些设计原则得到了最好的建议,那么为什么编译器不会产生任何警告。
最佳答案
这更多的是为了避免魔数(Magic Number)。如果您声称它是“相同的 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;
}
引入const
是不必要的,宏很好地解决了这个问题。这里解决了 DRY,宏定义是具体值的单一来源。
另一方面,如果这两个 10 个值之间没有语义关系,则使用 #define
两个宏来代替。如果它们确实有不同的含义,那么这并不是“重复自己”。不要误解这里的 DRY。
关于您的 const
版本的附注:它有两个缺陷
- 名称
值
根本没有语义,所以没有任何收获,数字仍然神奇 - 通过此声明,您引入了一个具有自动存储持续时间和类型
int
的新对象,但您实际上并不需要该对象。一个好的编译器会优化它,但最好不要依赖它——这就是为什么宏更适合这里。
关于c - C 语言的设计原理 DRY?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50058242/