3

我有一个布局管理器类,这个类设计用于设置数据网格布局。代码:

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

4

3 回答 3

3

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

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

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

于 2013-04-10T04:56:40.250 回答
1

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

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

于 2015-05-01T07:03:37.087 回答
0

每当我们谈到开放封闭原则时,都会出现一个重要问题,这就是所谓的战略封闭

应该清楚的是,没有重要的程序可以 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 类的实现。解决方案可以使用抽象,这在之前的答案中提到过。

于 2017-09-02T05:04:26.440 回答