java - 对象中的 Java 状态检查方法与关注点分离
问题描述
我有一门课如下
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 还有一些方法来确定对象的状态。由于这些方法旨在确定对象的状态,因此我认为这些方法非常属于类。一些例子是 Java 的 Date、Calendar 和 String 类等。这些对象保存数据,也有几种方法来确定状态。
另一种方法是“关注点分离”,我们将对象保留为带有属性、setter 和 getter 的 POJO,并将方法移动到实用程序。使用这种方法,检查状态的每个人都应该首先记住检查实用程序类是否存在实用程序方法。而且我已经看到几个应用程序具有代码重复和逻辑来在多个地方检查这些状态。
我更倾向于将这些方法保留在 Employee 对象中的第一种方法。但是当我提出这个讨论时,我想我们的大多数同事都会支持关注点分离的方法。有人可以帮助我了解与关注点分离相比我的想法如何。
解决方案
封装是Java中OOP的基本特征之一。
在我看来,一个对象应该能够以最高的安全性(想想当它的状态存储在没有 getter 的私有字段中时)和准确性(因为对象包含所有内部属性)来查询它的特性。如果以这种方式设计,一个对象是原子的、自主的。
如果你想确定一个物体的特性,问它,对吗?
你的方法: hasAllEmployeeFields
, hasAddress
... 就是很好的例子。
当且仅当对象本身无法确定特征并且需要来自另一个对象的合作时,该特征才应该可以从外部查询。
例如:我们有一个对象Market {double avgPrice;}
和一个实体对象 ty Product {double price;}
。为了确定这Product
是否是奢侈品,我们需要通过方程来配合这两个对象price > 5 * avgPrice
。因此,特性确定逻辑应该放在实用程序方法中。
推荐阅读
- python - 在我的不和谐机器人键入某个命令后,如何将所有用户输入作为字符串获取?
- reactjs - React-Redux 示例有一个非纯函数。我认为减速器必须是纯的?
- algorithm - 算法考试
- r - 在矩阵上应用 Reduce
- c# - 无法让简单的 c# 掷骰子游戏正常工作
- c# - ASP.net Core 2.1 应用程序在调试中工作,但在发行版中不起作用(IIS 6.0)
- c# - 在特定范围内按日期分组
- arrays - 如何在控制器 symfony3 中循环数组 json
- node.js - 使用 Nodejs 将 DataTables 与 sql 数据库链接
- javascript - Amcharts 迷你图采用父 div 的全宽(100%)