试图重写这个,所以它不违反Code Complete第2版中讨论的原则

时间:2014-11-25 03:43:39

标签: code-complete

function profit(){
    int totalSales=0;
    for (int i=0; i<12;i++) // computer yearly sales
          totalSales+=montlysales[i];
   return get_profit_from_sales(totalsales);
}

所以我已经确定for循环中的12应该是一个常量而不是仅仅使用一个整数,并且montlysales应该作为参数传递给函数,然后可以运行检查以查看是否销售长度等于月份的整数值,也就是十二。 我不确定这些是否都违反了原则。我觉得最后一行

return get_profit_from_sales(totalsales) 

是错的,它真的很烦我,因为我似乎无法弄清楚为什么它实际上困扰我,我想我可能已经跳过了别的东西。

任何人都可以帮我验证吗?

1 个答案:

答案 0 :(得分:2)

总结 - 你应该重构对另一个函数的调用,并使这个函数变得纯粹,只做一件事,降低复杂性,并提高你抽象地推理你的程序及其正确性的能力。

你的蜘蛛感觉刺痛,你应该相信它 - 你是对的,但错误是微妙的。

当他们做一件事时,例程是最好的,而且只有一件事。因此,在最重要的要求,复杂性的管理中,视觉的纯洁是重要的 - 它允许我们的大脑能够更多地处理因为它们更简单。也就是说,你可以只看一下这个功能并知道它的作用,而你不必说,“它总计销售额,但它最后还调用了另一个功能”,这就是它的“使命”。

这也是函数式编程的一部分,我觉得必须采用语言来尝试实现Code Complete中的主要命令。功能编程作为其原则之一,“无副作用”,类似于“一个任务”或“一个目的”。我对你的代码做了什么也可以看作是使它更具功能性,只是输入和输出,而不是通过任何其他路径进出。

另请注意,函数get_profit()读取类似伪代码,使其有点自我记录,并且您不必深入研究任何函数来理解函数的功能或执行方式(理想情况下)。< / p>

所以,这是我对上面解释的内容的想法(松散编码,未检查!)。

function get_total_sales(int montlysales[]){
    int totalSales=0;
    for (int i=0; i<12;i++) // computer yearly sales
        totalSales+=montlysales[i];
    return totalSales;
}

function calc_profit(int all_sales, int all_commissions, int all_losses)(){
    // your calculations here
    int profit = all_sales - all_commissions - all_losses;  // ... etc. 
    return profit;
}

function get_profit(){
    int montlysales[] = read_from_disk();
    int total_sales = get_total_sales(montlysales);
    int tot_commissions = get_tot_commissions();
    int tot_losses = get_tot_losses();
    int profit_made = calc_profit(total_sales, tot_commissions, tot_losses);
    return profit_made;
}

我每年大约读一次Code Complete,因为编码确实很微妙,因为它是多维的。这对我很有帮助。问候 - 斯蒂芬