- 在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据7条原则来开发程序,从而提高软件的开发效率,节约软件开发成本和维护成本,我们将在下面的几节中依次来介绍者7条原则,本节介绍里接口隔离原则
接口隔离原则定义
:设计编码过程中尽量将臃肿庞大的接口拆分成更小的和更具体的接口,让接口中只包含客户感兴趣的方法。
接口隔离原则由来
2002年罗伯特·c·马丁 给“接口隔离原则”的定义是:客户端客户端不应该被迫依赖于它不使用的方法(Clients should not be forced to depend on methods they do not use)。该原则还有另一个定义:一个类对另一个类的依赖应该建立在最小接口上。(The dependency one class to another one should depend on the smallest interface).
为各个类建立他们需要的专用接口,不要试图建立一个庞大的接口供所有依赖他的类调用。
接口隔离原则和单一职责都是为了提高类的内聚力,降低他们之间耦合度,体现了封装的思想,但两者是不同的:
- 单一职责原则注重职责,接口隔离原则注重接口依赖的隔离
- 单一职责原则是约束类,它针对的是程序中的实现和细节,接口隔离原则主要约束接口,这对抽象和程序整体框架的设计。
接口隔离原则的优点
1.降低接口粒度,提高接口灵活性,可维护性
2.提高系统内聚性,减少对外互动,降低系统的耦合性
3.使类对外的暴露部分显得有层次,接口间的继承也可以使细粒度的接口之间有辨识度
4.减少冗余代码,没有不必要的实现方法
接口合理原则实现方法
1.接口尽量有限度的小且只服务一个子模块或业务逻辑
2.为依赖接口类定制服务,只提供调用者需要的方法,屏蔽不需要的方法
3.深度了解业务,尽可能按需分配,高内聚,减少不必要的对外暴露,用最少的代码完成业务
【例】 学生成绩管理程序
分析:学生成绩管理程序一般包含插入成绩、删除成绩、修改成绩、计算总分、平均分、打印、查询等功能。将他们分别放到不同模块中,输入模块、统计模块、打印模块、如图:
学生成绩管理程序的类图.png
package principle;
public class ISPtest {
public static void main(String[] args) {
InputModule input = StuScoreList.getInputModule();
CountModule count = StuScoreList.getCountModule();
PrintModule print = StuScoreList.getPrintModule();
input.insert();
count.countTotalScore();
print.printStuInfo();
//print.delete();
}
}
//输入模块接口
interface InputModule {
void insert();
void delete();
void modify();
}
//统计模块接口
interface CountModule {
void countTotalScore();
void countAverage();
}
//打印模块接口
interface PrintModule {
void printStuInfo();
void queryStuInfo();
}
//实现类
class StuScoreList implements InputModule, CountModule, PrintModule {
private StuScoreList() {
}
public static InputModule getInputModule() {
return (InputModule) new StuScoreList();
}
public static CountModule getCountModule() {
return (CountModule) new StuScoreList();
}
public static PrintModule getPrintModule() {
return (PrintModule) new StuScoreList();
}
public void insert() {
System.out.println("输入模块的insert()方法被调用!");
}
public void delete() {
System.out.println("输入模块的delete()方法被调用!");
}
public void modify() {
System.out.println("输入模块的modify()方法被调用!");
}
public void countTotalScore() {
System.out.println("统计模块的countTotalScore()方法被调用!");
}
public void countAverage() {
System.out.println("统计模块的countAverage()方法被调用!");
}
public void printStuInfo() {
System.out.println("打印模块的printStuInfo()方法被调用!");
}
public void queryStuInfo() {
System.out.println("打印模块的queryStuInfo()方法被调用!");
}
}
打印输出
输入模块的insert()方法被调用!
统计模块的countTotalScore()方法被调用!
打印模块的printStuInfo()方法被调用!
网友评论