繁体   English   中英

尝试重写此代码,使其不违反“ Code Complete 2nd Edition中讨论的原理”

[英]trying to rewrite this so it doesnt violate "prinicples discussed in Code Complete 2nd edition

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) 

是错的,它真的困扰我,因为我似乎无法弄清为什么它实际上困扰我,我想我可能已经跳过了其他事情。

有人可以帮我验证吗?

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

您的间谍意识刺痛,您应该信任它-您是正确的,但是错误是微妙的。

例行程序只能做一件事,而只能做一件事,是最好的。 因此,视力的纯净度在首要任务,复杂性管理中很重要-它使我们的大脑能够处理更多的事情,因为它们更简单。 也就是说,您只需要看一下功能就可以知道它的作用,而不必说“它实现了销售总额,但最后它又调用了另一个功能”,这掩盖了它的“使命” 。

这也是函数式编程的一部分,在我看来,语言必须采用这种语言来尝试实现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》,因为有时编码确实很微妙,因为它是多维的。 这对我很有帮助。 问候-斯蒂芬

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM