如何(或者你应该)避免在jsf中使用长方法/类

我主要在基于JSF的项目中使用遗留代码,并且在支持bean中有很多很长的类和方法。

这一直在困扰着我,但是当我寻找可以做的事情的时候,我所能提出的大部分时间都是将一个长方法划分为n个小方法。 这给你一个很长的课程,有时甚至更难阅读。

那你怎么做才能让你的支持豆简洁明了? 或者你为一个页面保留一个大的支持bean? 有没有最好的做法?

我假设这与jsf没有直接关系,而是与你用控制器“支持”视图的任何模型有关。 所以一般建议也会有所帮助。

将所有字段放在它自己的类中,也称为实体或DTO类(例如UserProductOrder等)并改为引用它。 那些可以是JDBC / JPA实体。 将所有业务方法放在自己的类中,也称为服务或域对象(例如UserServiceProductService等),并引用它。 那些可以是EJB。

因此不是

 public class Bean { private Long id; private String field1; private String field2; private String field3; // Etc... All model fields. @PostConstruct public void init() { // >20 lines of business/domain code to prefill the fields from DB. } public void save() { // >20 lines of business/domain code to save the fields in DB. } // Getters/setters for all fields and possibly also all nested fields. } 

但更重要的是

 public class Bean { private Long id; private Entity entity; @EJB private EntityService service; @PostConstruct public void init() { entity = service.find(id); } public void save() { service.save(entity); } // Getter/setter for id and getter for entity. } 

此外,我还看到了代码,其中嵌套对象/实体是由bean中的其他getter / setter委托的,就像这样

 private Entity entity; public String getField1() { return entity.getField1(); } public void setField1(String field1) { entity.setField1(field1); } // Etc... 

这完全没必要。 只需一个实体的getter就足够了(setter不是强制性的!),结合使用

  

这些实体本身也可以进一步划分。 例如, houseNumber streethouseNumberzipCodecitycountrycountry可以被同一User另一个实体/ DTO Address替换。


如果运气不好,代码已由可视化编辑器(例如Netbeans + Woodstock)自动生成。 如果没有完全重新设计它就没有太多的重构,我宁愿寻找另一个项目。

恕我直言,每个方法应该是1步,如果那1步包含多个内部步骤你应该将它们分解成更小的方法,以便更容易阅读。 现代IDE的好处在于它们为您完成折射代码而不需要太多努力。

不仅适用于支持bean,而且适用于所有对象:

你应该总是通过将 长方法 提取为多个较小的方法来重构它们。