У нашій кодовій базі є старі, і нові програмісти, як я, швидко вчаться робити це так, як це робиться заради рівномірності. Думаючи, що нам треба десь почати, я взяв на себе рефакторинг класу власника даних як такого:
- Видалили методи сеттера і зробили всі поля
final
(я беру "final
добре" аксіоматично). Як виявилося, сетери використовувались лише в конструкторі, тому це не мало побічних ефектів. - Ввів клас Builder
Клас Builder був необхідний тому, що конструктор (саме це спонукає до рефакторингу в першу чергу) охоплює близько 3 рядків коду. Він має безліч параметрів.
На щастя, мій товариш по команді працював над іншим модулем, і йому трапилося потребувати сеттерів, оскільки необхідні йому значення стали доступними в різних точках потоку. Таким чином код виглядав так:
public void foo(Bar bar){
//do stuff
bar.setA(stuff);
//do more stuff
bar.setB(moreStuff);
}
Я стверджував, що він повинен використовувати будівельник замість цього, оскільки позбавлення від сеттерів дозволяє полям залишатися незмінними (вони раніше чули, як я балакався про незмінність), а також тому, що будівельники дозволяють створенню об'єктів бути транзакційними. Я накреслив наступний псевдокод:
public void foo(Bar bar){
try{
bar.setA(a);
//enter exception-throwing stuff
bar.setB(b);
}catch(){}
}
Якщо цей виняток запускається, bar
матиме пошкоджені дані, чого б уникнути за допомогою конструктора:
public Bar foo(){
Builder builder=new Builder();
try{
builder.setA(a);
//dangerous stuff;
builder.setB(b);
//more dangerous stuff
builder.setC(c);
return builder.build();
}catch(){}
return null;
}
Мої товариші по команді відповіли, що виняток, про який йдеться, ніколи не буде спрацьовувати, що досить справедливо для цієї області коду, але я вважаю, що не вистачає лісу для дерева.
Компроміс полягав у тому, щоб повернутися до старого рішення, а саме використовувати конструктор без параметрів і встановити все за допомогою сетерів за необхідності. Обґрунтуванням було те, що це рішення відповідає принципу KISS, який міна порушує.
Я новачок у цій компанії (менше 6 місяців) і повністю усвідомлюю, що втратив цю. У мене питання:
- Чи є ще один аргумент щодо використання Builders замість "старого способу"?
- Чи пропонується запропонована вами зміна навіть насправді?
але насправді,
- Чи є якісь поради щодо кращого представлення таких аргументів, коли ви пропонуєте спробувати щось нове?
setA
?