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)
是错的,它真的很烦我,因为我似乎无法弄清楚为什么它实际上困扰我,我想我可能已经跳过了别的东西。
任何人都可以帮我验证吗?
答案 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,因为编码确实很微妙,因为它是多维的。这对我很有帮助。问候 - 斯蒂芬