Gab*_*ele 5 java oop open-closed-principle solid-principles
场景:我在类字段中存储了一些信息(例如,双精度数组)(比如字段Measurements,类中的整数数组MeasureData).现在我想使用这些数据来执行一些计算(例如,计算数组的算术平均值,最大值和最小值).此刻,我不知道在未来,我需要做的这些数据的任何其它操作(例如,也许我会需要得到标准差,总和或其他).我会有很多类型的对象MeasureData.
解决方案:我可以编写一个类Calculator,声明它是final,使用私有构造函数并使用几个静态方法来执行我需要的计算.这似乎是有道理的,因为它Calculator充当实用类,没有任何字段,就像标准Math类一样.
问题:如果在几个月内我需要进行任何其他计算,我将需要编写另一个静态方法Calculator.这是否意味着违反开放/封闭原则(毕竟,我正在修改类的实现Calculator)?
严格的答案是肯定的; OCP声明一个类是可以扩展的,但是关闭以进行修改.您将修改Calculator,因此违反OCP(正如您已经总结的那样).
这导致两点:
首先,在这种情况下违反OCP是一件大事吗?您正在进行相加更改Calculator以向其添加新方法. Calculator是一个静态助手类,用于从对象中获取有意义的数据.添加新方法(如计算SD)不会影响其中的任何其他操作.通过适当的实现,是否真的有办法添加此方法可能会损害您的项目?
其次,如果您觉得OCP违规是不可接受的,那么这是一个教科书示例,可以使用策略模式.考虑:
Measurements.Java
public class Measurements {
private int[] data;
public Measurements(int[] data) {
this.data = data;
}
public Number performCalculation(Calculation c) {
return c.performCalculation(data);
}
}
Run Code Online (Sandbox Code Playgroud)
Calculation.java
public interface Calculation {
Number performCalculation(int[] data);
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以做一个计算类要对数据做各种不同的计算(如:MeanCalculation,StdDevCalculation等).如果您想要一个新的计算(例如:)MedianCalculation,您可以在不修改该区域中的任何其他代码的情况下进行此操作(关闭以进行修改,打开以进行扩展;符合OCP).最终结果如下:
Measurements values = ...
Number mean = values.performCalculation(new MeanCalculation());
Number SD = values.performCalculation(new StdDevCalculation());
// etc.
Run Code Online (Sandbox Code Playgroud)
我并不是说这是针对您具体情况的最佳方法(或者甚至是最佳实施方法); 你需要自己回答这个问题.但我希望这个答案能为这个问题提供一个体面的外部视角.