Наша кодовая база устарела, и новые программисты, как и я, быстро учатся делать это так, как это делается для единообразия. Думая, что мы должны с чего-то начать, я взял на себя реорганизацию класса держателей данных как такового:
- Удалил методы установки и сделал все поля
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
?