我有一个布局管理器类,这个类用于设置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?如果是,设计课程的正确方法是什么?
答案 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类的实现。解决方案可以使用抽象,这在前面的答案中提到过。