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

2024-04-20

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

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

那么,如何才能让你的支持 bean 变得简短明了呢?或者你会在一页上保留一个大的支撑豆吗?有没有最佳实践?

我认为这与 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, houseNumber, zipCode, city, country of an User可以被另一个实体/DTO 取代Address同一内User.


如果您运气不好,代码已由可视化编辑器(例如 Netbeans + Woodstock)自动生成。无论如何,如果不完全重新设计它,就没有太多需要重构的地方,我宁愿寻找另一个项目。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐