【问题标题】:Is a huge class ok for the sake of simplicity?为了简单起见,一个庞大的班级可以吗?
【发布时间】:2014-12-30 10:52:29
【问题描述】:

我正在开发与电影播放相关的应用程序,目前遇到了一些设计问题。

如您所料,我有一个包含文件路径、文件大小等属性的电影类。 电影类不知道电影内部的任何内容,也不直接解码电影文件。

为了实现这一点,我还有另一个大类:解码器。 此类了解所有电影内部信息,例如持续时间、帧速率等。 它还提供了从文件中检索视频或音频数据的方法。 将解码器分成更小的块没有多大意义,因为解码器使用第三方库,并且需要传递大量 C 指针。为了简化内存管理等,我宁愿避免这种情况。

电影拥有一个具有明确定义接口的解码器,因为解码器本身是使用我的电影类中的策略模式实现的。

                  Movie      ---------------->     Decoder (implements interface)
                    |                                  |
                    v                                  v
           File related variables                 Movie internals

我想知道这种设计在信息隐藏和 SRP 方面是否良好。 所有外部类都知道一部电影有一个带有一堆属性的解码器。 让他们只知道有一部电影不是更好吗? 但是电影类会变得非常庞大,并且会有很多只访问解码器属性的存根方法。

任何建议将不胜感激。


编辑:

我更深入地研究了 Facade 模式(受@Erik 的回答启发),它看起来就像这里的完美搭配。我可以进一步细分 Movie 类,但“外部世界”不需要了解细节以避免复杂性。但是,这会产生一个包含很多方法的 Facade 类。

因此,从外部看它是一个巨大的类,而从内部看它被很好地分成逻辑砖块。 那你觉得还可以吗?

【问题讨论】:

  • 一般来说大班不好。它本身就破坏了封装。
  • 我很清楚这一点,但您的评论无助于解决问题。
  • 我很清楚这一点:)。我对你的问题投了赞成票。我认为添加大量包装代码而不是添加逻辑一定是有动机的。
  • 顺便说一句,问题是大班是否可以。我对此说不。即使那个庞大的类被分解为包含的类。

标签: oop information-hiding


【解决方案1】:

您可以创建一个新类,它本身不包含任何逻辑,而只是简单地包装一个 Movie 并公开大量方法,每个方法都调用 Movie 和 Decoder 上的必要方法,而不是将所有代码放入一个新类中。

这基本上是外观模式的实现:

https://en.wikipedia.org/wiki/Facade_pattern

它的优点是外部类不知道电影是如何工作的,除了“它是具有我们可以要求的所有这些属性的这个类”,而在内部你不会得到庞大的类。

【讨论】:

    【解决方案2】:

    Movie 是一个包含电影属性的数据对象,而解码器是一个处理元素,它似乎提供了 API 来对电影对象执行各种操作。

    您可以修改您的Decoder 以接受Movie 对象并执行这些操作。 Movie 不需要引用 Decoder 对象。解码器更像是电影对象的Visitor。如果无法修改解码器类,则可以创建一个 Proxy 类,该类提供这些 API,这些 API 采用 Movie 对象并调用 Decoder 类中的方法,并具有 Movie 对象的适当属性。

    【讨论】:

    • 我想过这个,但我认为这行不通。电影和解码器都只使用文件路径进行初始化。解码器不需要电影。它只需要文件路径。此外,我有一个 UI 元素,它显示有关电影的所有相关信息,这些信息来自 Movie 和 Decoder 对象。
    猜你喜欢
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多