所有权责任和可重用性

Ownership responsibility and reusability

我与同事讨论了我们项目中这些主题的方法。 我正在制作一个进度系统​​,简而言之,一个 ProgressMonitor class 和一个 Task class,ProgressMonitor 处理一系列任务。所有非常直接的东西。但是当涉及到任务 ui 时,我们不得不发表意见。 每个任务都有自己的 UI。我们同意我们应该有一个 HUD class 来处理 UI。 不同的意见是,他希望 HUD 处理每个特定任务的 UI,因此 HUD class 会增长 quite 大,任务几乎没有关于它的逻辑UI。 我的意见是,HUD 只会处理与我们项目中所有需要 UI 的事物相同的逻辑,而所有特定逻辑都由需要 UI 的对象处理。 他的优势是一些所有权(需要访问某些 ui 信息的对象可以很容易地从 HUD 中获取) 我的优势,HUD 保持轻便清洁和可重复使用。

根据 OOP,什么更正确?

我将从影响实施的问题开始:

  • 问题 1:任务是否与它的UI密切相关?

  • 问题2:所有任务的UI是相同的还是有细微差别?

  • 问题3:是否需要根据具体的任务,对每个任务显示不同的UI?

如果问题 1 的答案是 并且很难分离这两个职责,将 UI 逻辑添加到任务可以简单的东西很多。

如果问题 2 的答案是 那么使用 classic model/view 分离将使得编写新任务更容易,因为您只需要将任务逻辑添加到 Task class.

你可以有一个 TasksHUD class 负责处理 TaskUI 的列表class。 Eeach TaskUI class 将有一个 Task 与之关联并处理 UI 和此特定任务的表示逻辑。

这样您的 TasksHUD class 将管理列表向用户显示的方式,而每个列表条目将由 Task 处理UIclass。任务展示代码将被重复使用。

Task 将仅负责执行、更改其状态以及任务必须在您的应用程序中执行的其他操作(如果您提供更多详细信息,我可以提供更详细的信息)并且可能更准确的描述),而呈现任务的责任将交给 TaskUI

这样,如果您需要更改呈现任务的逻辑,您只需更改 TaskUI class。

您可以编写任意多的任务,而无需为这些任务编写 UI 相关代码。

如果您需要更改 Task class 您可能需要更改也可能不需要更改 TaskUI class 因为依赖关系从 TaskUI 变为 Task。有些更改会影响 UI 有些不会。

如果问题 3 的答案是 那么:

您可以将处理它的 UI 的职责添加到 Task。这样更改它们会更容易,因为它们在同一个 class 中。这里的一个问题是 Task class 可以成长为具有多重责任。还共享类似任务的渲染代码等

在这种情况下,您可以将 Task 与其 UI 分离为两个 classes TaskTaskUI 但您的应用程序中需要一种机制,将特定的 Task class 与其 任务UIclass。这可能会导致更多 classes 和可能不想管理的复杂性。在很长的 运行 中,它可能会节省您的时间(主要来自 chaising 错误)。

这是一个伪代码示例:

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 获取任务UI将创建任务的工厂UI。

您可以查看以下讨论此类问题的一些资源: