如何(或者应该)避免jsf中的长方法/类



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

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

那么,你该怎么做才能让你的背锅变得简明扼要呢?或者你会为一页保留一个大的backingbean吗?有什么最佳实践吗?

我认为这与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不是强制性的!),与结合使用

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

实体本身也可以进一步划分。例如,UserstreethouseNumberzipCodecitycountry可以被同一User内的另一实体/DTO Address替换。


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

IMHO,每个方法都应该是一个步骤,如果这一个步骤包含多个内部步骤,则应该将它们分解为更小的方法,这样更容易阅读。现代IDE的好处是,它们可以毫不费力地为您折射代码。

不仅适用于backingbean,而且通常适用于所有对象:

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

相关内容

  • 没有找到相关文章

最新更新