0
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) 

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

谁能帮我验证一下?

4

1 回答 1

2

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

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

当他们做一件事并且只做一件事时,例程是最好的。因此,视觉的纯粹性对于复杂性的管理至关重要——它使我们的大脑能够处理更多的事情,因为它们更简单。也就是说,你可以只看函数就知道它做了什么,你不必说“它汇总了销售额,但它最后还调用了另一个函数”,这有点掩盖了它的“使命” .

这也是函数式编程的一部分,我觉得语言必须采用这种方式来尝试实现 Code Complete 中提到的主要命令式。函数式编程的原则之一是“无副作用”,类似于“一个任务”或“一个目的”。我对您的代码所做的也可以被视为使其更具功能性,只是输入和输出,没有任何其他路径输入或输出。

另请注意,函数 get_profit() 读起来像伪代码,使其在某种程度上是自记录的,并且您不必深入研究任何函数即可了解该函数的作用或它的作用方式(理想情况下)。

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

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,因为编码有时真的很微妙,因为它是如此多维。这对我很有帮助。问候 - 斯蒂芬

于 2016-10-25T21:59:57.980 回答