5

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

这一直困扰着我,但是当我寻找可以做的事情时,大多数时候我所能想到的就是将一个长方法划分为 n 个小方法。这给你的课程仍然很长,有时也更难阅读。

那么你如何保持你的支持豆短而简洁呢?或者你为一页保留一个大的支持豆?有没有最佳实践?

我认为这与 jsf 没有直接关系,而是与您使用控制器“备份”视图的任何模型相关。因此,一般建议也会有所帮助。

4

3 回答 3

7

将所有字段放在它自己的类中,也称为实体或 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 不是强制性的!),结合

<h:inputText value="#{bean.entity.field1}" />

实体本身也可以进一步划分。例如street,an 的, houseNumber, zipCode, city,可以被同一 中的另一个实体/DTO 替换。countryUserAddressUser


如果运气不好,代码已经由可视化编辑器(例如 Netbeans + Woodstock)自动生成。在没有完全重新设计的情况下无论如何都没有太多要重构的东西,我宁愿寻找另一个项目。

于 2011-06-20T14:30:59.393 回答
3

恕我直言,每个方法都应该是 1 步,如果该 1 步包含多个内部步骤,您应该将它们分解成更小的方法,以便于阅读。现代 IDE 的好处是它们无需太多努力就可以为您重构代码。

于 2011-06-20T14:18:51.063 回答
1

不仅适用于 backing beans,而且一般适用于所有对象:

您应该始终通过将长方法提取为多个较小的方法来重构它们。

于 2011-06-20T14:17:03.857 回答