【发布时间】:2023-03-25 11:13:01
【问题描述】:
我有一个处理Task 对象的系统,现在我想做一些基准测试实验。具体来说,我将创建许多 (~100) 个Task 对象,每个对象都属于一个任务组,并且我想在整个任务组上运行系统。我想要一种可以轻松创建新Task 并将其与组关联的设计(轻松使基准套件多样化)。只有少数几个组,因此可以接受一些针对每个组的基础架构。
Tasks 可以包含任意的Objects,所以我不能从像 JSON 这样的“数据”文件类型中加载它们——只有 Java 代码足以创建Tasks。此外,为了可维护性,我想在单独的 Java 文件中创建每个 Task:
// SolveHaltingProblem.java
public class SolveHaltingProblem {
static Task getTask() {
Task task = new Task();
task.setName("SolveHaltingProblem");
... // Create task
return task;
}
static String getGroup() {
return "impossible-tasks";
}
}
那么,Tasks 的群组应该很容易聚集:
List<Task> tasks = gatherTasksInGroup("impossible-tasks");
没有一些愚蠢和容易出错的东西:
List<Task> gatherTasksInGroup(String groupName) {
List<Task> list = new ArrayList<>();
if (groupName.equals("impossible-tasks")) {
list.add(SolveHaltingProblem.getTask());
list.add(SomeOtherHardProblem.getTask());
...
} else if (...) {
... // ~100 more lines
}
return list;
}
我提供上述代码只是为了帮助传达我的需求,设计细节并不是一成不变的。也许最好让 SolveHaltingProblem 扩展 ImpossibleTaskGroup 扩展 TaskGroup...
我知道类向其他类注册自己的模式(有这个名称吗?),但我认为该模式不适用于这里,因为我没有创建 SolveHaltingProblem 的实例,并且因此我不能强制SolveHaltingProblem 的任何静态初始化程序运行。我也尝试在 StackOverflow 上搜索类似的问题,但我发现这个问题很难描述;如果这是重复的,我深表歉意。
总而言之,我的问题是:如何管理Tasks 组,以便轻松添加新Task 并将其与组关联?一个好的设计应该具有以下属性(从最重要到最不重要):
- 每个
Task都在一个单独的文件中创建 - 添加新的
Task并将其与组关联只涉及添加/更改一个文件 - 我们只为请求的组构造
Task对象 - 通过复制/粘贴现有组的基础架构并稍作修改,“轻松”创建一个新组
- 我们不会遍历类路径中的所有类,也不会遍历文件系统中的文件
【问题讨论】:
-
我不明白 SolveHaltingProblem 类的用法,为什么不只使用 Task 实例? Group 今天只是一个字符串,因此它可以成为 Task 的成员,或者您可以采取完全不同的路线,将 Group 变成一个在集合中包含多个 Task 对象的类。我会考虑使用工厂类或因子方法来创建任务
-
@JoakimDanielson 我猜 SolveHaltingProblem 类并不是绝对必要的,但它是希望在单独的文件中定义每个任务的副作用(以避免过长的 Java 文件并且必须 Ctrl-F 来修改特定任务)。当然,每个 Java 文件都必须定义一个单独的类(例如 SolveHaltingProblem)。我也不认为工厂模式适用,因为我不是一次要求一个任务(我想要一个组中的所有任务,而没有明确列出在该组中构造任务的每个类/文件/方法)。
-
你需要了解类和类的实例、对象的区别。您需要为您的 Task 类创建一个文件,然后您可以根据需要从该类创建任意数量的不同对象,除了创建这些对象的代码之外不需要任何其他文件。
-
我明白其中的区别。也许我应该指出 Task 对象非常复杂,每个 Task 需要 20-50 行代码来设置(不,没有更简单的方法来创建它们)。因为“创建这些对象的代码”很复杂,我想将它们分成不同的文件(或者至少是不同的方法)。
-
这个问题正在Meta讨论
标签: java design-patterns