【问题标题】:Changing an Existing class - Best Practice Open/Closed Principle [closed]更改现有课程 - 最佳实践开放/封闭原则 [关闭]
【发布时间】:2020-09-16 13:22:43
【问题描述】:

我正在尝试找出更改现有课程的最佳方法。

所以这个类被称为ExcelReport,它有一个方法Create(data,headings)。这是现场直播并在许多地方使用。现在最近我想改变方法,以便我可以在 Excel 中格式化列。

Create(data, headings, columnformats)

为了不破坏我现有的程序,我能想出的最好办法是在类中添加另一个方法Create2(data,headings,columnformats)

我收到很多建议说我应该使用重载方法修改现有类,我确实这样做了。但这不会破坏打开/关闭原则,因为我现有的课程正在生产中吗?

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

【问题讨论】:

    标签: c# oop design-patterns solid-principles


    【解决方案1】:

    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 就可以工作,格式化逻辑需要在 CreationOptions 中,对吗?否则,您需要修改 Create 以支持新选项。
    • 可以,或者你可以引入可以在主类中注册为扩展的格式化程序。这些格式化程序使用创建选项进行操作。但很难在那里给出建议,因为设计因用例而异。
    • 如果我被要求添加一个新的重载方法。无效创建(CreationOptions 选项);我正在改变我现有的课程并打破 OCP ?
    • 是的,但您这样做是为了能够遵守原则。没有一个程序员是完美的,或者可以写出完美的代码。我们每天都在学习、适应和编写更好的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 2023-04-01
    • 2021-02-01
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多