程序在编码之前如何进行测试?

How can a program be tested before being coded?

我正在使用 C。 我希望 while 循环中的这种情况可以防止在我的 "sum" 变量中求和任何大于 400 万的偶数:

while ( (box1 < 4000000) || (box2 < 4000000) || (box3 < 4000000)) {

    box3 = box1 + box2;
    if (box3 % 2 == 0) /* checks if box is even */
        sum += box3;  /* if TRUE adds even value to the variable sum */

    box1 = box3 + box2;/* exceeded 4 millions on 12th loop */
    if (box1 % 2 == 0)
        sum += box1;

    box2 = box3 + box1; 
    if (box2 % 2 == 0)
        sum += box2;/* then summed undesired value here */
    printf("%d\n", sum);
}

我完全没有想到循环中的第一条或第二条语句中的框可能超过 400 万。那件事发生了,我花了很长时间才发现我的程序在 while 再次检查条件之前对一个额外的值求和。我希望您能原谅我并耐心等待让您在这里度过宝贵的时间,但我需要知道有经验的程序员是否知道如何避免这种简单但烦人的错误。

如果这是真的,我会很高兴有机会向更好的程序员学习。谢谢

为了展示一种正确的思考方式,如评论中所述 - 这里的技术是识别您将同一代码片段重复三次,并且这三个代码片段中有两个没有被正确检查。它通常被称为 DRY 原则 ("Don't Repeat Yourself")。注意到这一点后,您重构了代码,以便 "it is DRY"。 DRY 代码比非 DRY 代码的故障点更少,这显然降低了出错的可能性。

int previous = 1, current = 1;
int next;
int sum = 0;

// single test for end
while (current < 4000000) {

    // test for evenness
    if (current % 2 == 0) {
        sum += current;
    }

    // next value
    next = previous + current;

    // shuffle values around so you can reuse the same code
    previous = current;
    current = next;
}

另请注意,如果变量命名为 box1box2box3,则没有人可以轻松阅读您的代码 - 包括您未来的自己。根据复杂程度,在一到六个月内您将不知道自己写了什么;拥有合理的名称对于顺利维护非常重要。

但是请注意,这些只是优秀代码的一些原则。正如许多评论者所指出的那样,他们中的大多数人都是通过经验来的。你开始注意到 "code smell",当你注意到时,你重构它,让它不再有味道。

(此外,如评论中所述,有关编程技巧的一般问题应转至 https://softwareengineering.stackexchange.com/;Stack Overflow 更侧重于特定问题。如果您搜索该站点,则有讨论好的或可维护代码的线程数。)