OO设计原则 - 开放封闭原则

时间:2013-04-10 04:45:06

标签: oop

我有一个布局管理器类,这个类用于设置datagrid布局。 代码:

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?如果是,设计课程的正确方法是什么?

3 个答案:

答案 0 :(得分:3)

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

遵循SOLID主体的正确方法是创建一个接口: 带有所需接口的ILayoutManager,带有记录的行为。

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

答案 1 :(得分:1)

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

一般来说,OCP的结果是,当类派生自您的基类然后重写方法时,内部不变量不应该因为该修改而中断。派生类不应该以任何方式改变课程的这些部分。行为。派生类可以通过使用基类公开的部分来更改行为或添加新功能。

答案 2 :(得分:0)

每当我们谈论开放封闭原则时,一个重要问题就会发挥作用,称为Strategic Closure

  

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

例如,在着名的Shape类样本中,您只需要关闭您的程序(在Client和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类的实现。解决方案可以使用抽象,这在前面的答案中提到过。