我主要使用基于JSF的项目中的遗留代码,并且在支持bean中有很多很长的类和方法。
这一直在困扰着我,但是当我寻找可以做的事情的时候,我所能提出的大部分时间都是将一个长方法划分为n个小方法。这让你仍然有一个很长的课程,有时甚至更难阅读。
那么你怎么做才能让你的支持bean简洁明了?或者你为一个页面保留一个大的支持bean?有没有最好的做法?
我认为这与jsf没有直接关系,而是与使用控制器“支持”视图的任何模型有关。所以一般建议也会有所帮助。
答案 0 :(得分:7)
将所有字段放在自己的类中,也称为实体或DTO类(例如User
,Product
,Order
等),然后引用它。那些可以是JDBC / JPA实体。将所有业务方法放在自己的类中,也称为服务或域对象(例如UserService
,ProductService
等)并引用它。那些可以是EJB。
E.g。因此不是
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不是强制性的!),与
结合使用<h:inputText value="#{bean.entity.field1}" />
实体也可以进一步划分。例如。 street
中的houseNumber
,zipCode
,city
,country
,User
可以被其他实体/ DTO Address
替换同样的User
。
如果运气不好,代码已由可视化编辑器(例如Netbeans + Woodstock)自动生成。如果没有完全重新设计它就没有太多的重构,我宁愿寻找另一个项目。
答案 1 :(得分:3)
恕我直言,每个方法应该是1步,如果那个步骤包含多个内部步骤,你应该将它们分解成更小的方法,以便更容易阅读。现代IDE的好处在于它们为您完成折射代码而不需要太多努力。
答案 2 :(得分:1)
不仅适用于支持bean,而且适用于所有对象:
您应始终将long methods extracting重构为多个较小的。{/ p>