清理开始时的事情:
我了解如何将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;
}
}
答案 0 :(得分:1)
让我试着给你一些见解,但是我不会涵盖你提到的所有问题。
首先也是最重要的。试验。典型的企业应用程序包含~10000~20000单元测试,不考虑数据随机化(如果有的话,很少出现这种情况:OO程序员还没有发现像Haskell QuickCheck
这样的工具)。而这些测试通常是进入地狱的一种方式。数百个模拟按照给定的顺序连接起来,复杂的依赖注入只是为了使它能够正常工作"和测试实现混淆的其他类型的设置在很大程度上依赖于...测试类的有用方法或有点class SuchKindOfTestsUtilities
。在大多数情况下,没有时间经常清理测试,或者人们根本不关心:为什么假设测试可能包含代码重复,违反了众所周知的干净代码原则而没有任何后果... < / p>
现在想象一下你必须引入新的功能。有时间压力。有几十个课程和你不太熟悉的东西。你有像Neo一样的选择:绿色(不要像蓝色)或红色,其中&#34;绿色&#34;代表&#34;不要改变什么工作,除非绝对必要!!!&#34;范例;的确,&#34;冷冻&#34;现有的东西,特别是编码不好,是最好的方法,除非你的经理和企业准备等待(和支付)长时间的重构(他们通常认为这是浪费时间)。
那只是冰山一角;)