基于聚合的架构问题
Aggregating-based architecture issues
我又需要你的帮助了。
我有一个文档查看器应用程序,可以读取两种不同类型的文档:
- 特别版(基于 PDF,带有自定义页眉)
- 标准版("raw" PDF)。
使用原始 PDF 查看器应该像任何其他查看器一样。
使用自定义 - 在打开过程中执行一些额外的操作,
原始 PDF 不可用。
这些操作稍后应该仅在应用程序的菜单中可用。且仅适用于自定义文档。
项目 OOP 架构(由其他人设计)如下所示:
class GenericDocument
class PdfLibDocument
class CustomDocumentHighLevel
class CustomDocumentLowLevel
即每个较高级别 class 包含较低级别的成员:
class GenericDocument
{
SmartPointer< PdfLibDocument > m_document;
...
};
等等。
自定义文档有很多特定的功能:
class CustomDocumentLowLevel
{
public:
void DoSomeBlackMagic();
...
// Another black magic
};
出现问题然后我需要 "pull" 从 CustomDocumentLowLevel
到 GenericDocument
的一些低级方法(以在应用程序菜单中显示)- 因为我需要将此方法添加到所有四个 classes!
并且可能在未来我需要 "pull" 来自自定义文档的更多方法。
看起来这种软件架构在这种情况下是个糟糕的选择,不是吗?
所以我需要找到一种方法来重构这段代码。我应该用继承代替聚合吗?引入接口?
通常组合优于继承,但它似乎不适用于您的情况。为什么不互相继承 Viewer 呢?制作一个具有简单功能的基本查看器,在所有地方都可用,然后从中继承专门的查看器添加新功能。
至于菜单和与之相关的操作,它们应该被表示为一个单独的对象。为此检查 Command 模式。
UI 可以向您的查看者请求可用命令列表。每个查看器都可以在初始化或构造或您选择的任何内容上填写其内部命令列表。
我又需要你的帮助了。
我有一个文档查看器应用程序,可以读取两种不同类型的文档:
- 特别版(基于 PDF,带有自定义页眉)
- 标准版("raw" PDF)。
使用原始 PDF 查看器应该像任何其他查看器一样。
使用自定义 - 在打开过程中执行一些额外的操作,
原始 PDF 不可用。
这些操作稍后应该仅在应用程序的菜单中可用。且仅适用于自定义文档。
项目 OOP 架构(由其他人设计)如下所示:
class GenericDocument
class PdfLibDocument
class CustomDocumentHighLevel
class CustomDocumentLowLevel
即每个较高级别 class 包含较低级别的成员:
class GenericDocument
{
SmartPointer< PdfLibDocument > m_document;
...
};
等等。
自定义文档有很多特定的功能:
class CustomDocumentLowLevel
{
public:
void DoSomeBlackMagic();
...
// Another black magic
};
出现问题然后我需要 "pull" 从 CustomDocumentLowLevel
到 GenericDocument
的一些低级方法(以在应用程序菜单中显示)- 因为我需要将此方法添加到所有四个 classes!
并且可能在未来我需要 "pull" 来自自定义文档的更多方法。
看起来这种软件架构在这种情况下是个糟糕的选择,不是吗?
所以我需要找到一种方法来重构这段代码。我应该用继承代替聚合吗?引入接口?
通常组合优于继承,但它似乎不适用于您的情况。为什么不互相继承 Viewer 呢?制作一个具有简单功能的基本查看器,在所有地方都可用,然后从中继承专门的查看器添加新功能。
至于菜单和与之相关的操作,它们应该被表示为一个单独的对象。为此检查 Command 模式。
UI 可以向您的查看者请求可用命令列表。每个查看器都可以在初始化或构造或您选择的任何内容上填写其内部命令列表。