我和一位同事讨论了我们项目中关于这些主题的方法。我正在创建一个Progress System,简言之就是ProgressMonitor类和一个Task类,ProgressMonitor处理一系列任务。所有非常直接的东西。但是当谈到任务ui时,我们不得不提出意见。每个任务都有自己的UI。我们同意我们应该有一个用于处理UI的HUD类。意见的不同之处在于,他希望HUD能够处理每个特定任务的UI,因此HUD类会变得非常大,而且任务的UI也几乎没有逻辑。我的观点是,HUD只处理项目中需要UI的所有事物的逻辑,并且所有特定的逻辑都由需要UI的对象处理。他的优点是一些所有权(需要访问一些ui信息的对象可以很容易地从HUD获得)我的优点,HUD保持清洁和可重复使用。
根据OOP,更正确的是什么?
我将从影响实施的问题开始:
如果问题1的答案为是并且将两个责任分开是很困难的,那么将UI逻辑添加到任务可以简单地解决问题。
如果问题2的答案为“是”,那么使用经典模型/视图分离将使编写新任务变得更容易,因为您只需要将任务逻辑添加到Task类。
您可以拥有一个TasksHUD类,负责处理TaskUI类的列表。 Eeach TaskUI类将有一个与之关联的Task,并处理此特定任务的UI和表示逻辑的呈现。
这样,您的TasksHUD类将管理向用户显示列表的方式,而每个列表条目将由TaskUI类处理。任务演示代码将被重用。
任务只负责执行,更改状态以及任务必须在您的应用程序中执行的其他操作(如果您提供更多详细信息,我可以更详细,可能更准确的描述),而呈现任务的责任将被赋予TaskUI。
这样,如果您需要更改任务呈现的逻辑,则必须仅更改TaskUI类。
您可以编写任意数量的任务,而无需为这些任务编写UI相关代码。
如果您需要更改Task类,您可能也可能不必更改TaskUI类,因为依赖从TaskUI转到Task。有些更改会影响UI,有些则不会。
如果问题3的答案是肯定的话:
您可以将处理它的UI的责任添加到任务中。这样就可以更容易地改变它们,因为它们在同一个类中。这里的一个问题是Task类可以增长具有多个责任。同时共享类似任务的渲染代码等。
在这种情况下,您可以在两个类Task和TaskUI中将Task与其UI分离,但您需要在应用程序中使用一种机制将特定的Task类与其TaskUI类相关联。这可能导致更多的课程和复杂性,可能无法管理。从长远来看,它可以节省你的时间(主要是来自chaising bug)。
这是一个伪代码示例:
interface TaskObserver {
void onTaskChanged(t);
}
interface TaskUI {
void render();
}
interface TaskUIFactory {
register(TaskUIFactoryRegistry registry);
TaskUI create(Task task);
}
interface Task {
TaskStatus status;
execute();
addEventListener(TaskObserver o);
}
class TaskA : Task {
// implementation.....
}
class TaskA_UI : TaskUI, TaskObserver {
TaskA mTask;
TaskA_UI(TaskA task) {
mTask = task;
mTask.addEventListener(this);
}
render() {
// rendering goes here
}
onTaskChanged(t) {
// raise an event or signal to the TaskHUD that a refresh is needed
}
}
class TaskA_UIFactory : TaskUIFactory {
void register(TaskUIFactoryRegistry registry) {
registry.Register(typeof(TaskA), this);
}
TaskUI createUI(Task task) {
return new TaskA_UI((TaskA)task);
}
}
添加任务时,TasksHUD可以使用TaskUIFactoryRegistry获取将创建TaskUI的TaskUIFactory。
以下是一些可以检查的资源,可以讨论这些问题: