簡體   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