我主要在基于 JSF 的项目中处理遗留代码,并且在支持 bean 中有很多相当长的类和方法。
这一直困扰着我,但是当我寻找可以做的事情时,大多数时候我所能想到的就是将一个长方法分成 n 个小方法。这给你的类(class)仍然很长,有时也更难阅读。
那么如何使支持 bean 简短明了呢?或者你是否为一页保留一个大的支持 bean?有什么最佳做法吗?
我认为这与 jsf 没有直接关系,而是与您使用 Controller “支持” View 的任何模型有关。因此,一般性建议也会有所帮助。
最佳答案
将所有字段放在它自己的类中,也称为实体或 DTO 类(例如 User
、Product
、Order
等)和而是引用它。这些可以是 JDBC/JPA 实体。将所有业务方法放在它自己的类中,也称为服务或域对象(例如 UserService
、ProductService
等)并引用它。这些可以是 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 委托(delegate),就像这样
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}" />
本身的实体也可以进一步划分。例如。 街道
、houseNumber
、zipCode
、city
、country
用户
可以替换为同一 User
中的另一个实体/DTO Address
。
如果您运气不好,代码已由可视化编辑器(例如 Netbeans + Woodstock)自动生成。无论如何,如果不完全重新设计,就没有太多要重构的,我宁愿寻找另一个项目。
关于java - 如何(或者你应该)避免 jsf 中的长方法/类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6412547/