c - C 语言的设计原理 DRY?

标签 c performance design-patterns

我的问题是为了更大的编码视角,但我试图用简单的例子来理解。假设我有几行代码

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/

相关文章:

c++ - 位扩展字节数组

c - asmlinkage 在 Linux 代码中没有定义

objective-c - 编写许多小方法对 Objective-C 有性能影响吗?

java - 我怎样才能使这段代码更有效地找到一对总和?

c++ - 我应该在带有模板的主题观察者模式中使用动态转换吗

java - 应用程序属性作为静态变量或带有单例的实例变量

c - 是否可以从 Bison 语法操作更改弹性状态?

c - 将标准输入写入文件

CSS 使用 svg 作为背景,外部模式不加载

大小为 K 的有色集团的算法