【问题标题】:Base class has one responsibility, and derived class has another responsibility. Does this conforms to SRP?基类有一个职责,派生类有另一个职责。这符合 SRP 吗?
【发布时间】:2016-04-18 07:06:13
【问题描述】:

我有一个派生自 ButtonModifier 的 VolumeButton。如果我将业务逻辑(音量增大/减小、静音等)放入 VolumeButton,启用/禁用基类 ButtonModifier 的逻辑。喜欢,

public class VolumeButton : ButtonModifier
{
    /// Event handler to change the volume.
    void ChangeVolume() { ... }
}

public class ButtonModifier
{
    /// Updates the visibility of the button.
    void UpdateVolumeVisibleStatus() { ... }

    /// Enable or disable the button.
    void Enable(bool enable) { ... }
}

一方面,只有业务逻辑更改会影响 VolumeButton,而基础架构更改会影响 ButtonModifier。所以它符合SRP。另一方面,VolumeButton 从基类继承了启用/禁用逻辑。那么它有两个职责?

这两个类是否符合SRP?

【问题讨论】:

    标签: design-principles


    【解决方案1】:

    VolumeButton 和 ButtonModifier 只有一个理由单独更改。因此,它们确实符合 SRP。但是,直觉上我认为 VolumeButton 继承了 ButtonModifie 的职责,这导致它违反了 SRP。

    从代码依赖的角度来看,您并没有通过将一项职责从派生类转移到基类来解耦任何依赖。根据 Bob 大叔的“C# 中的敏捷原则、模式和实践”Chapter 8,在所有示例中,Bob 大叔都引入了额外的抽象来分离职责。因此,对您的问题的一个有用提示可能是“您是否引入了额外的抽象来解耦依赖关系?”

    【讨论】:

      【解决方案2】:

      我认为它们不符合 SRP,因为派生类从其基类获取所有公共/受保护成员,例如:

      public class Flyable
      {
          public void fly(){...}
      }
      public class Bird : Flyable
      {
          public void walk(){...}
      }
      

      鸟会飞也能走路。 也许这个例子不完全适合你的情况。但我想说的是,如果这两个职责分开,一个在基类,另一个在派生类,那么派生类将获得两个职责。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-17
        • 1970-01-01
        • 2011-05-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多