Page 68 - 4787
P. 68
До рефакторингу
int discount(int inputVal, int quantity, int yearToDate){
if (inputVal > 50) inputVal -= 2;
}
Після рефакторингу
int discount(int inputVal, int quantity, int yearToDate) {
int result = inputVal;
if (inputVal > 50) result -= 2;
}
Насамперед, домовимося про сенс виразу «присвоювання параметру». Під
цим мається на увазі, що якщо як значення параметра передається об'єкт з ім'ям
foo, то присвоювання параметра означає, що foo зміниться і стане вказувати на
інший об'єкт. Немає проблем при виконанні якихось операцій над переданим
об'єктом - це необхідно робити постійно. У даному випадку слід заперечити
проти зміни foo, що перетворює його в посилання на зовсім інший об'єкт:
void aMethod(Object foo) {
foo.modifyInSomeWay();
foo = anotherObject;
}
Це пов’язано з відсутністю ясності і змішанням передачі з значеннями і
передачею за посиланням. У Java використовується виключно передача за
значенням, і даний приклад грунтується саме на цьому способі. При передачі за
значенням зміни параметра відображаються в отриманій програмі. Це може
збентежити тих, хто звик до передачі за посиланням.
Інша область, яка може викликати замішання, це саме тіло коду. Код
виявляється значно зрозуміліше, якщо параметр використовується тільки для
представлення того, що передано, оскільки це суворе вживання. He присвоюйте
значень параметрам в Java і, побачивши код, який це робить, застосуйте
«Видалення присвоювань параметрами» (Remove Assignments to Parametrs ) .
67