问题描述
我正在尝试找出更改现有班级的最佳方法。
因此该类称为ExcelReport
,它具有一个方法Create(data,headings)
。这是实时的,并在许多地方使用。现在,最近我想更改方法,以便可以在Excel中设置列的格式。
Create(data,headings,columnformats)
为了不打乱我现有的程序,我能想到的最好的办法就是在类中添加另一个方法Create2(data,columnformats)
。
我有很多建议,说我应该使用重载方法来修改现有的类。但这是否不违反我现有课程的“开/关原则”?
是否应该使用新的改进方法创建新类ExcelReport2(and Interface)
并使用依赖项注入将其传递到新程序中?
解决方法
OCP
在面向对象的程序设计中,开放式原则指出“软件实体(类,模块,功能等)应为扩展而开放,而为修改而封闭”; [1]即此类实体可以允许在不修改其源代码的情况下扩展其行为。
您的解决方案
您很可能稍后会为此创建更多选项。 而且,由于您要求采用开放式/封闭式原理,我们需要考虑到这一点(开放式扩展,封闭式变更)。
更健壮的替代方法是创建新的重载:
void Create(CreationOptions options);
看起来很简单,对吧?问题是任何子类都可以引入自己的选项,例如MyPinkThemedFormattedCellsCreationOptions
。
因此,到目前为止,您的新选项类将如下所示:
public class CreationOptions
{
public SomeType Data { get; set; }
public SomeType Headings { get; set; }
public SomeType[] ColumnFormats { get; set; }
}
由于新功能不涉及现有的API,因此可以扩展,而更改时可以关闭,因为现在您只需要基于CreationOptions
创建新功能的子类即可。