Пытаясь переписать это так, чтобы оно не нарушало "принципы, обсуждаемые в Code Complete, 2-е издание

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

Итак, я уже определил, что 12 в цикле for должно быть константой, а не просто использовать целое число, и что montlysales должны быть переданы в качестве параметра в функцию, поэтому можно запустить проверку, чтобы увидеть, является ли продолжительность продаж равно целочисленному значению месяцев, которое также составляет двенадцать. Я не уверен, что это все нарушения принципов. Я чувствую последнюю строчку

return get_profit_from_sales(totalsales) 

это неправильно, и это действительно беспокоит меня, потому что я не могу понять, почему это на самом деле беспокоит меня, и я думаю, что я мог пропустить что-то еще.

кто-нибудь может помочь мне проверить?

1 ответ

Резюме - вы должны реорганизовать вызов другой функции и сделать эту функцию такой, чтобы она была чистой и выполняла только одно, уменьшая сложность и улучшая вашу способность абстрактно рассуждать о вашей программе и ее правильности.

Ваше чувство пауков покалывает, и вы должны доверять ему - вы правы, но то, что неправильно, является тонким.

Рутины лучше, когда они делают одну вещь, и только одну вещь. Таким образом, чистота видения важна в главном императиве, управлении сложностью - это позволяет нашему мозгу иметь возможность манипулировать большим количеством вещей, потому что они проще. То есть, вы можете просто посмотреть на функцию и узнать, что она делает, и вам не нужно говорить: "она суммирует продажи, но она также вызывает другую функцию в конце", что как бы затуманивает ее "миссию",

Это также является частью функционального программирования, и я считаю, что языки должны быть адаптированы, чтобы попытаться реализовать основной императив, о котором говорится в 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 примерно раз в год, так как кодирование иногда бывает очень тонким, потому что оно настолько многомерно. Это было очень полезно для меня. С уважением - Стивен

Другие вопросы по тегам