对象中的Java状态检查方法与关注点分离

时间:2018-05-08 16:10:33

标签: java encapsulation pojo separation-of-concerns

我有一个课程如下

public class Employee {
    private String id;
    private String name;
    private String address;
    private String department;

    //setters and getters
    //overridden equals and hashcode methods

    public Boolean hasAllEmployeeFields() {
        //null and empty check on fields
    }

    public Boolean hasAddress() {
        //null and empty check on Address
    }

    public Boolean hasAssignedDepartment() {
        return department != null;
    }
}

除了setter和getter之外,这还有一些方法来确定对象的状态。由于这些方法旨在确定对象的状态,我认为这些方法非常属于该类。一些示例是Java的Date,Calendar和String类等。这些对象包含数据,并且还有几种方法来确定状态。

另一种方法是'分离关注',我们将对象作为POJO与属性,设置器和getter一起离开,并将方法移动到实用程序。通过这种方法,每个检查状态的人都应该首先记住检查实用程序类是否存在实用程序方法。我已经看到了几个与逻辑代码重复的应用程序,可以在多个位置检查这些状态。

我更倾向于将第一种方法保留在Employee对象中。但是,当我把它用于讨论时,我认为我们的大多数同事都会支持分离关注方法。有人可以帮助我理解与分离关注点相比,我的想法会如何。

3 个答案:

答案 0 :(得分:3)

封装是java中OOP的基本特征之一。

在我看来,一个对象应该能够以最高的安全性查询它的特征(当它的状态存储在没有getter的私有字段时思考)和准确性(因为该对象包含所有内部属性)。如果以这种方式设计,对象是原子的,自治的。

如果你想确定一个物体的特征,请问它,对吗?

您的方法:hasAllEmployeeFieldshasAddress ...就是完美的例子。

当且仅当对象本身无法确定它并且需要来自另一个对象的协作时,才能从外部查询特征。

例如:我们有一个对象Market {double avgPrice;}和一个entobject ty Product {double price;}。为了确定这个Product是否奢侈,我们需要通过等式price > 5 * avgPrice来合作这两个对象。因此,特征确定逻辑应放在实用方法中。

答案 1 :(得分:0)

关注点的分离与将代码分离为尽可能多的类不同。

你会找到几个清晰的例子here,但要回答你的直接问题:坚持你应该完全理解的基本方法 - object oriented数据结构(想想日历,字符串)和functional个处理器(想想流,map,reduce)。

答案 2 :(得分:-2)

我认为将Pojo与检查状态分离的方法分开是一个更好的设计。它将使Pojo便携且重量轻。在实用程序方法中分离检查状态的逻辑将通过编程到某些功能的接口来保持可移植性。