我主要在基于 JSF 的项目中使用遗留代码,并且在支持 bean 中有很多相当长的类和方法。
这一直困扰着我,但是当我寻找可以做的事情时,大多数时候我所能想到的就是将一个长方法划分为 n 个小方法。这给你的课程仍然很长,有时也更难阅读。
那么你如何保持你的支持豆短而简洁呢?或者你为一页保留一个大的支持豆?有没有最佳实践?
我认为这与 jsf 没有直接关系,而是与您使用控制器“备份”视图的任何模型相关。因此,一般建议也会有所帮助。
我主要在基于 JSF 的项目中使用遗留代码,并且在支持 bean 中有很多相当长的类和方法。
这一直困扰着我,但是当我寻找可以做的事情时,大多数时候我所能想到的就是将一个长方法划分为 n 个小方法。这给你的课程仍然很长,有时也更难阅读。
那么你如何保持你的支持豆短而简洁呢?或者你为一页保留一个大的支持豆?有没有最佳实践?
我认为这与 jsf 没有直接关系,而是与您使用控制器“备份”视图的任何模型相关。因此,一般建议也会有所帮助。
将所有字段放在它自己的类中,也称为实体或 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 委托,如下所示
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
,an 的, houseNumber
, zipCode
, city
,可以被同一 中的另一个实体/DTO 替换。country
User
Address
User
如果运气不好,代码已经由可视化编辑器(例如 Netbeans + Woodstock)自动生成。在没有完全重新设计的情况下无论如何都没有太多要重构的东西,我宁愿寻找另一个项目。
恕我直言,每个方法都应该是 1 步,如果该 1 步包含多个内部步骤,您应该将它们分解成更小的方法,以便于阅读。现代 IDE 的好处是它们无需太多努力就可以为您重构代码。