我有一个只包含数据的类,但它取决于从中获取数据的连接对象。连接对象管理与更大的API(旧单头C API)的低级套接字连接。目前我有这个:
public class MyData {
private int data1;
public MyData(Connection connection) {
data1 = connection.getLowLevelConnection().someDataFetchCall();
}
// getters, setters
}
它有效,但感觉不对。直觉我会说,数据应该在一个函数中获取,该函数返回我初始化的数据对象:
public class DataFetcher {
public static MyData getMyDataFromConnection(Connection connection) { ... }
// ... more data fetching functions
}
这种任务是否有命名模式?这样可以更容易地命名这些类。
答案 0 :(得分:2)
您将数据本身绑定到其加载机制。没有提出任何模式,你应该解耦。我想没有真正可以申请的模式。这是设计原则的问题,尤其是单一责任原则和依赖倒置。单一责任原则说你不应该把属于你的东西分开,你不应该把不属于他们的东西捆绑在一起。依赖倒置原则说不依赖于混凝土,取决于摘要。
设计应该最终提出
一个类加载数据以满足单一责任 原理
如果要独立于加载机制引入 抽象(例如界面),应用依赖性反转。
存储库"模式"是真的。定义了这样的结构。
附注:我个人不接受标签" pattern"在上面。它只是一个合理结构的标签,如果你应用SOLID原则,无论如何都会达到这个标签。相反,来自GoF的23种设计模式。他们没有弥补,他们被确定了。它们具有内在意义。 "模式"标签表明存储库"模式"属于同一类别,但它并不属于同一类别。它缺乏自然性和原子性。
答案 1 :(得分:1)
它有效,但感觉不对。
确实如此。
坚持DDD,如果MyData
是一个聚合,或者MyData
是一个实体,我会创建一个存储库。无论如何,我将类放到基础结构层并与MyData
接口到域层。例如,
MyData实体:
package myapp.domain.model;
public class MyData {
private int data1;
// other fields
public MyData(int data1) {
this.data1 = data1;
}
// other methods
}
服务界面:
package myapp.domain.service;
import myapp.domain.model.MyData;
public interface MyService {
MyData GetMyData();
}
服务实施:
package myapp.infrastructure.oldapi;
import myapp.domain.model.MyData;
import myapp.domain.service.MyService;
public class MyServiceImpl implements MyService {
@Override
public MyData GetMyData() {
MyData myData = connection.getLowLevelConnection().someDataFetchCall();
return myData;
}
}