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