更改现有班级-最佳实践开放/封闭原则

问题描述

我正在尝试找出更改现有班级的最佳方法

因此该类称为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创建新功能的子类即可。