单一责任原则(SRP)是软件设计的坚实原则之一,该原则规定班级只能具有一个更改的责任或理由。在Java中,可以多种方式实施SRP。这是其中一些:
- 每个责任的单独类别:您可以为每个责任创建单独的类,例如输入处理,数据处理和输出渲染。这样,每个班级只有一个责任。
- 使用界面:您可以为每个责任定义接口并单独实施。这样,每个班级只有一个责任,您可以轻松地交换实现,而不会影响代码的其余部分。
- 抽象类:您可以使用抽象类来定义共同行为,然后创建实现特定职责的具体类。这样,您可以确保每个班级只有一个责任。
由开发人员根据项目的特定要求和约束选择最佳方法。
srp可以以更大的规模应用,然后称为关注点分离:将代码分开为模块,每个代码负责特定功能。这样,每个模块只有一个责任。
示例:Java中的SRP使用每个责任的单独类
问题描述:
Java应用程序读取文件中的数值数据,找到平均值然后输出结果。
解决方案
-
为输入处理创建一个单独的类:
public class InputHandler { public static List<Double> readData(String filename){ // Code to read data from file } }
此类负责处理输入数据并从文件中读取它。它只有一个责任,即从文件中读取数据。
资源 -
创建一个用于数据处理的单独类:
public class DataProcessor { public static double calculateAverage(List<Double> data) { // Code to perform calculations on data } }
此类负责处理输入数据并计算平均值。它只有一个责任,即对输入数据进行计算。
-
创建一个单独的类以输出渲染:
public class OutputRenderer { public static void displayResults(double result) { // Code to render output } }
此类负责渲染输出并显示结果。它只有一个责任,即以用户友好的方式渲染输出。
-
最后,创建一个主要类以将所有内容绑在一起:
public class Main { public static void main(String[] args) { String filename = “input.txt”; List<Double> data = InputHandler.readData(filename); double result = DataProcessor.calculateAverage(data); OutputRenderer.displayResults(result); } }
此主类简单地调用输入处理,数据处理和输出渲染类的方法,以读取输入数据,处理IT并显示结果。
我们将测试此实施以进行将来的变化。
更改请求:
客户端要求您从两个文件中读取数据,
解决方案:您只需要更改 Inpunthandler 并仅测试它,因此更改的范围较小且易于测试。
第二个更改请求:
第一行是输出的标题,因此您需要以格式显示输出
解决方案:创建用于保存数据和标题的新类。
public class Main {
public static void main(String[] args) {
String filename = “input.txt”;
List<Double> data = InputHandler.readData(filename);
double result = DataProcessor.calculateAverage(data);
OutputRenderer.displayResults(result);
}
}
您需要更改 inpunthandler , dataProcessor , outputrenderer ,但每个类更改的原因仍然只有一个,因为每个类都只有一个责任:
- inpunthandler 正在读取文件和填充dataholder class
- dataprocessor 计算是相同的,只有参数才更改。
- outputrenderer 更改输出以匹配格式
解决方案的主要类:
public class Main {
public static void main(String[] args) {
String filename = “input.txt”;
DataHolder data = InputHandler.readData(filename);
data = DataProcessor.calculateAverage(data);
OutputRenderer.displayResults(data);
}
}
结论
通过将责任分为不同的班级,您可以确保每个班级只有一个责任,这使得代码更易于维护,测试和扩展。
单一责任原则是指南,帮助您在路径之间进行选择,应该浮动您的有意识的思想,当编码alwas问自己做方法/class/class/interface/appracts class/pockage时,只有一个责任或只有一个改变的原因。