【问题标题】:Is it a bad practice that FooManager calls Foo.OnSthHappened()?FooManager 调用 Foo.OnSthHappened() 是一种不好的做法吗?
【发布时间】:2012-10-18 18:20:42
【问题描述】:

在我的项目中有一个文档管理系统。有一个基类Document 和一些派生类。还有一个DocumentManager 类,用于管理文档的打开/关闭/激活操作。

Document 及其派生类可能想要在加载、关闭等时执行某些操作,但状态更改由管理器类控制,因此目前有(虚拟)方法,如 OnLoaded()、@987654325 @ 在由 DocumentManager 类调用的 Document 类上。除了将这些方法公开似乎没有必要之外,它工作正常。

另一种设计是让DocumentManager 类触发事件,并且每个Document 实例订阅这些事件。恕我直言,这并没有太大的区别,但会带来内存泄漏的风险。

我有一种直觉,这些都不是“解决方案”,并且有适合该问题的最佳实践。有人可以请教我吗?

【问题讨论】:

  • Manger、Handler 等术语没有说明类的功能。并且应该避免。
  • 我不确定我是否理解这一点。您是说 DocumentManager 没有描述该类的功能,因此应该将其命名为不同的名称?

标签: oop events design-patterns inheritance


【解决方案1】:

我的直觉是,虽然在不知道项目的具体要求的情况下很难确定,但您的 DocumentManager 类中应该有逻辑,它可能应该在您的 Document 类的子类中.

我会想象一个(可能是抽象的)Document 基类,其中包含公共loadclosewhatever 方法。每个子类将根据其特定要求实现这些方法,允许您轻松创建任意数量的Document 子类,而无需更改DocumentManager 中的逻辑(请参阅polymorphism)。如果这些操作是异步的,您的Document 类将分派事件以通知DocumentManager 它们已完成。

这将使DocumentManagersingle responsibility 一起管理(我假设)其Document 实例的集合。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    • 2023-03-19
    相关资源
    最近更新 更多