【问题标题】:OO Design Principle - Open Closed PrincipleOO设计原则——开闭原则
【发布时间】:2013-04-10 04:45:05
【问题描述】:

我有一个布局管理器类,这个类是为设置数据网格布局而设计的。 代码:

class LayoutManager
{
    private object _target;

    public LayoutManager(object aDataGrid)
    {
        _target = aDataGrid;
    }

    public void SaveLayout(string strProfileID)
    {
    }

    public void LoadLayout(string strProfileID)
    {
    }

    //in future I might add below function
    public void ResetLayout()//OtherFunction0
    {
    }

    public void OtherFunction1()
    {
    }

    public void OtherFunction2()
    {
    }


}

根据 OCP “一个类应该对扩展开放,但对修改关闭”。如果我在 LayoutManager 类中添加新功能,此操作是否违反 OCP?如果是,那么设计课程的正确方法是什么?

【问题讨论】:

标签: oop


【解决方案1】:

我不认为向类添加方法通常会违反 OCP 原则, 因为这实际上扩展了类的行为。 问题是如果你改变现有的行为。 这样,如果您添加的方法上的代码可能会改变现有方法的行为 (因为它改变了对象的状态)这将是一个违规。

遵循 SOLID 原则的正确方法是制作接口: ILayoutManager 具有您想要的接口,并具有记录的行为。

LayoutManager 类将实现此接口。 其他新方法可能会添加到新接口中,例如 ILayoutFoo 或添加到现有接口中,只要它们不会破坏现有方法中记录的行为的约定。

【讨论】:

    【解决方案2】:

    如果没有一些具体的代码,就不可能直接回答这个问题。

    一般来说,OCP 的结果是,当类从您的基类派生然后覆盖方法时,内部不变量不应该中断,因为那是修改。派生类不应该有任何方法来改变类行为的那些部分。派生类可以通过使用基类公开的部分来改变行为或添加新功能。

    【讨论】:

      【解决方案3】:

      每当我们谈到开闭原则时,都会出现一个重要问题,即Strategic Closure

      应该清楚的是,没有重要的程序可以 100% 关闭。一般来说,无论一个模块多么“封闭”,总会有某种变化,它不会被封闭。由于关闭不可能完全,它必须是战略性的。也就是说,设计者必须选择关闭他的设计的变化类型。这需要一定程度的从经验中获得的先见之明。经验丰富的设计师非常了解用户和行业,可以判断不同类型变化的概率。然后,他确保为最可能的更改调用开闭原则。

      例如,在著名的 Shape 类示例中,您只是授权您的程序(在客户端和 Shape 一侧)刚刚关闭以进行有关添加新形状的修改。

      public class Shape {
      
          public draw() {
          }
      }
      
      public class Circle extends Shape {
          @Override
          public void draw() {
              // implementation special to Circle
          }
      }
      
      public class Client {
      ...
          public drawMyShape(Shape shape) {
              shape.draw();
          }
      ...
      }
      

      根据此策略,当您设计程序时,您应该决定您希望对更改关闭的部分。因此,在您的示例中,当您设计程序时,如果您决定您的实体(在本例中是 GraphCalculator 类)应该关闭以进行修改并打开以添加新功能的扩展,则在此示例中添加新功能违反开闭原则,因为它改变了客户端和 GraphCalculator 类的实现。并且解决方案可以使用抽象,这在之前的答案中有所提及。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-10
        • 1970-01-01
        • 2010-10-07
        • 1970-01-01
        • 1970-01-01
        • 2017-12-01
        • 1970-01-01
        相关资源
        最近更新 更多