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

Java state checking methods in object vs separation of concerns

我有一个class如下

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 之外,this 还有一些方法可以确定对象的状态。由于这些方法是为了确定对象的状态,所以我认为这些方法非常属于class。一些示例是 Java 的 Date、Calendar 和 String classes 等。这些对象保存数据,也有几种方法来确定状态。

另一种方法是“关注点分离”,我们将对象保留为带有属性、setter 和 getter 的 POJO,并将方法移至实用程序。使用这种方法,每个检查状态的人都应该首先记住检查实用程序 classes 是否存在实用程序方法。而且我已经看到几个应用程序有代码重复,逻辑在多个地方检查这些状态。

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

我认为将 Pojo 与检查状态的方法分开是更好的设计。这将使 Pojo 轻便便携。在实用方法中分离用于检查状态的逻辑将通过编程到特定功能的接口来保持事物的可移植性。

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

您会找到几个清晰的示例 here,但要回答您的直接问题:坚持您(应该)完全理解的基本方法 - object oriented 数据结构(想想 Calendar、String ) 和 functional 个处理器(想想流、映射、减少)。

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

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

如果你想确定一个物体的一个特征,就问吧?

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

当且仅当对象本身无法确定一个特征,并且需要另一个对象的合作时,该特征才应该可以从外部查询。

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