固体OCP违规后果

时间:2018-03-10 16:11:51

标签: oop design-patterns solid-principles open-closed-principle

清理开始时的事情:

  • 我了解如何将OCP应用于下面的代码(虚拟类,DI等等,网上有大量关于此的资源)

  • 我知道(但不明白)为什么我需要申请OCP的论据(主要出现在网上的3个,如下所示)

  • 我认为我错过了这一点,因为我没有足够的商业经验。

我在OCP中不明白的是所有关于OCP的文章中的论点/后果(如下所述)

违反OCP是不好的,因为:

1。你需要为旧班写测试 - 这对于为新班写测试更好,更好。

我不明白为什么这么糟糕?

在这两种情况下,我都需要编写新测试。无论是新班级还是旧班级。

2。您需要重新部署应用程序 如果有两个客户端:A(不需要新功能)和B(谁想要新功能)

2.1当我通过修改基类违反OCP时。

客户端A - 不需要重新部署 - 因为他不需要新功能

客户端B - 需要重新部署 - 以获得新功能

2.2当我没有通过添加派生类来违反OCP时。

客户端A - 不需要重新部署 - 因为他不需要新功能

客户端B - 需要重新部署 - 以获得新功能

我不明白为什么需要重新部署整个应用程序? 在这两种情况下都是相同的情况 - 客户端A不需要重新部署,客户端B需要重新部署应用程序。

第3。您可以向工作系统引入错误 但是当我将新功能放入其中时,我也可以这样做,不是吗?

你能帮我理解上面这几点的含义吗? 我正在使用website

中的以下示例
public enum InvoiceType
{
    Final,Proposed
};

public class Invoice
{
    public InvoiceType InvoiceType { get; set; }

    public double GetDiscount(double amount,InvoiceType invoiceType)
    {
        double finalAmount = 0;
        if (invoiceType == InvoiceType.Final)
        {
            finalAmount = amount - 100;
        }
        else if(invoiceType == InvoiceType.Proposed)
        {
            finalAmount = amount - 50;
        }
        return finalAmount;
    }

}

1 个答案:

答案 0 :(得分:1)

让我试着给你一些见解,但是我不会涵盖你提到的所有问题。

首先也是最重要的。试验。典型的企业应用程序包含~10000~20000单元测试,不考虑数据随机化(如果有的话,很少出现这种情况:OO程序员还没有发现像Haskell QuickCheck这样的工具)。而这些测试通常是进入地狱的一种方式。数百个模拟按照给定的顺序连接起来,复杂的依赖注入只是为了使它能够正常工作&#34;和测试实现混淆的其他类型的设置在很大程度上依赖于...测试类的有用方法或有点class SuchKindOfTestsUtilities。在大多数情况下,没有时间经常清理测试,或者人们根本不关心:为什么假设测试可能包含代码重复,违反了众所周知的干净代码原则而没有任何后果... < / p>

现在想象一下你必须引入新的功能。有时间压力。有几十个课程和你不太熟悉的东西。你有像Neo一样的选择:绿色(不要像蓝色)或红色,其中&#34;绿色&#34;代表&#34;不要改变什么工作,除非绝对必要!!!&#34;范例;的确,&#34;冷冻&#34;现有的东西,特别是编码不好,是最好的方法,除非你的经理和企业准备等待(和支付)长时间的重构(他们通常认为这是浪费时间)。

那只是冰山一角;)