【问题标题】:Questions about Blob anti-pattern in C++关于 C++ 中 Blob 反模式的问题
【发布时间】:2012-03-12 18:27:17
【问题描述】:

我正在使用 C++ 为我们部门开发视频播放器。

这个视频播放器有三个核心模块:Reader(用于读取数据包),Processor(解码原始数据),Display Handle(在屏幕上绘制数据)。它们不是紧密耦合的类,这意味着它们可以独立地执行工作。

但是,我有一个 GUI 模块,用于连接这三个模块和客户端。它将检索用户的命令,例如暂停、继续、跳转到视频剪辑中的特定位置。然后,此 GUI 模块会将作业委托给上述三个模块。 结果,这个 GUI 模块变得相当大,因为它包含许多客户端将与之交互的功能。不过,我真的很小心,我不让这个 GUI 模块做任何真正的处理任务(它们是在三个核心模块上完成的),我担心这个 GUI 模块会成为一个上帝对象或“Blob”,这是一个反- 面向对象设计中的模式。

这是此处 GUI 模块的示例声明:

class CorePlayer
{
public:
   CorePlayer();
   ~CorePlayer();

public:
   void start();
   void pause();
   void continue();
   void jumpToFrame(int frameNum);
   void toggleFullScreen();
   .........
private:
   Reader* rModule_;
   Processor* pModule_;
   DisplayHandle* dspHandle_;
}

......区域还有更多功能。它们是人们需要媒体播放器的功能。他们不执行真正的处理,他们将工作委托给模块。

任何人都可以帮助澄清我对这个 GUI 模块是使用所描述设计的“Blob”的担忧吗?

【问题讨论】:

  • 一个大类不一定表示使用 Blob 反模式。有时你需要一个具有很多功能的类。但是,如果没有看到您的代码或更详细的架构描述,就很难说。当您说“GUI 模块”时,您是否将其至少分为视图和控制器?
  • @user1118321 我添加了一些示例代码。它更像是一个管理类,用于管理客户端和处理模块之间的接口。
  • 对我来说看起来不错 - 但是我会使用智能指针而不是裸阅读器*
  • @pm100 我实际上在这里使用 QScopedPointer,因为整个应用程序是基于 Qt 框架的。只是为了简单起见。
  • 我同意@pm100。考虑到您发布的内容,我觉得很好。

标签: c++ design-patterns blob anti-patterns


【解决方案1】:

在我看来,这不像是一个 blob——它只是一个用于播放模块的功能丰富的 GUI 控制器。不过,如果它塞满了与播放无关的附加功能,例如“设置”、“插件管理”等,它就会变成一个 blob。

【讨论】:

  • 如果您需要这些设置,最好让设置处理程序在某处注册自己并从 GUI 管理器委托给那里,并通过回调或单击按钮上的其他内容。
  • 我还在每次新播放开始时将模块的初始化和一些配置放在这个 GUI 控制器中。我这样做是因为在朗姆酒期间每个模块可能对另一个模块不可见,但它们需要来自其他模块的信息以某种方式进行初始化。这是合适的做法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-26
  • 2011-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-27
  • 1970-01-01
相关资源
最近更新 更多