所有权责任和可重用性

问题描述 投票:0回答:1

我和一位同事讨论了我们项目中关于这些主题的方法。我正在创建一个Progress System,简言之就是ProgressMonitor类和一个Task类,ProgressMonitor处理一系列任务。所有非常直接的东西。但是当谈到任务ui时,我们不得不提出意见。每个任务都有自己的UI。我们同意我们应该有一个用于处理UI的HUD类。意见的不同之处在于,他希望HUD能够处理每个特定任务的UI,因此HUD类会变得非常大,而且任务的UI也几乎没有逻辑。我的观点是,HUD只处理项目中需要UI的所有事物的逻辑,并且所有特定的逻辑都由需要UI的对象处理。他的优点是一些所有权(需要访问一些ui信息的对象可以很容易地从HUD获得)我的优点,HUD保持清洁和可重复使用。

根据OOP,更正确的是什么?

oop design-patterns reusability responsibility
1个回答
2
投票

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

  • 问题1:任务是否与其UI密切相关?
  • 问题2:所有任务的UI是否相同或有轻微差异?
  • 问题3:您是否需要根据特定任务为每个任务显示不同的UI?

如果问题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。

以下是一些可以检查的资源,可以讨论这些问题:

© www.soinside.com 2019 - 2024. All rights reserved.