Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更改现有类别-最佳实践打开/关闭原则_C#_Oop_Design Patterns_Solid Principles - Fatal编程技术网

C# 更改现有类别-最佳实践打开/关闭原则

C# 更改现有类别-最佳实践打开/关闭原则,c#,oop,design-patterns,solid-principles,C#,Oop,Design Patterns,Solid Principles,我试图找出改变现有类的最佳方法 因此该类被称为ExcelReport,它有一个方法创建(数据、标题)。这是生活和使用在许多地方。最近,我想更改方法,以便在Excel中格式化列 Create(data, headings, columnformats) 为了不打乱我现有的程序,我能想到的最好办法是在类中添加另一个方法Create2(数据、标题、列格式) 我得到了很多建议,说我应该用重载方法修改现有的类,我做到了。但这是否打破了开/关原则,因为我现有的类正在生产中 我是否应该使用新的改进方法创建一

我试图找出改变现有类的最佳方法

因此该类被称为
ExcelReport
,它有一个方法
创建(数据、标题)
。这是生活和使用在许多地方。最近,我想更改方法,以便在Excel中格式化列

Create(data, headings, columnformats)
为了不打乱我现有的程序,我能想到的最好办法是在类中添加另一个方法
Create2(数据、标题、列格式)

我得到了很多建议,说我应该用重载方法修改现有的类,我做到了。但这是否打破了开/关原则,因为我现有的类正在生产中

我是否应该使用新的改进方法创建一个新类
ExcelReport2(和接口)
,并使用依赖项注入将其传递到我的新程序中?

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
创建子类。

有趣。关于我对OCP的误解,你是对的,我删除了我的答案。为了在不修改Create on future extensions的情况下工作,格式化逻辑需要在CreationOptions中,对吗?否则,您需要修改Create以支持新选项。是的,或者您可以引入可以在主类中注册为扩展的格式化程序。这些格式化程序使用创建选项进行操作。但是很难给出建议,因为根据用例的不同,设计会有很大的不同。创建无效(创建选项选项);我正在改变我现有的课程,打破OCP?是的,但你这样做是为了能够遵守校长的要求。没有一个程序员是完美的,或者能够写出完美的代码。我们每天学习、修改和编写更好的代码。