网站引导页怎么做.,做游戏视频网站,怎样学网络推广,html5商城网站开发1.背景
2002 年罗伯特C.马丁给“接口隔离原则”的定义是#xff1a;客户端不应该被迫依赖于它不使用的方法#xff08;Clients should not be forced to depend on methods they do not use#xff09;。该原则还有另外一个定义#xff1a;一个类对另一个类的依赖应该建立…
1.背景
2002 年罗伯特·C.马丁给“接口隔离原则”的定义是客户端不应该被迫依赖于它不使用的方法Clients should not be forced to depend on methods they do not use。该原则还有另外一个定义一个类对另一个类的依赖应该建立在最小的接口上The dependency of one class to another one should depend on the smallest possible interface。 2.概念
接口隔离原则Interface Segregation PrincipleISP要求程序员尽量将臃肿庞大的接口拆分成更小的和更具体的接口让接口中只包含客户感兴趣的方法。 通俗的讲 一个类对另外一个类的依赖性应当是建立在最小的接口上的 一个接口代表一个角色不应当将不同的角色都交给一个接口。没有关系的接口合并在一起形成一个臃肿的大接口这是对角色和接口的污染 使用多个专门的接口比使用单一的总接口要好 不要强迫客户使用它们不用的方法如果强迫用户使用它们不使用的方法那么这些客户就会面临由于这些不使用的方法的改变所带来的改变
接口隔离原则和单一职责原则很像都是为了提高类的内聚性、降低它们之间的耦合性体现了封装的思想但两者是不同的 单一职责原则注重的是职责而接口隔离原则注重的是对接口依赖的隔离。 单一职责原则主要是约束类它针对的是程序中的实现和细节接口隔离原则主要约束接口主要针对抽象和程序整体框架的构建。
应用接口隔离原则的建议 接口尽量小但是要有限度既不能是大而全的接口也不能是一个方法一个接口这样就失去了面向抽象的意义应该按照功能的密不可分来定义接口而且应该是动态的因为随着业务发展功能需求是有变化的所以我们在设计的时候要考虑留好提前量避免抽象的变化 为依赖接口的类定制服务只提供调用者需要的方法屏蔽不需要的方法 了解环境拒绝盲从每个项目或产品都有选定的环境因素环境不同接口拆分的标准就不同深入了解业务逻辑 提高内聚减少对外交互使接口用最少的方法去完成最多的事情 3.案例分析
需求我们要开发一个学生成绩管理项目包含插入成绩、删除成绩、修改成绩、计算总分、计算均分、打印成绩信息、査询成绩信息等功能如果将这些功能全部放到一个接口中显然不太合理正确的做法是将它们分别放在输入模块、统计模块和打印模块等 3 个模块中。 /// summary/// 输入模块/// /summarypublic interface IInputModule{/// summary/// 添加成绩/// /summaryvoid Insert();/// summary/// 删除成绩/// /summaryvoid Delete();/// summary/// 修改成绩/// /summaryvoid Modify();}/// summary/// 统计模块/// /summarypublic interface ICountModule{/// summary/// 计算总分/// /summaryvoid CountTotalScore();/// summary/// 计算平均分/// /summaryvoid CountAverage();}/// summary/// 打印模块/// /summarypublic interface IPrintModule{/// summary/// 打印学生信息/// /summaryvoid PrintStudentInfo();/// summary/// 查询学生信息/// /summaryvoid QueryStudentInfo();}/// summary/// 实现类/// /summarypublic class StudentSoreList : IInputModule, ICountModule, IPrintModule{private StudentSoreList(){}public static IInputModule GetInputModule(){return (IInputModule)new StudentSoreList();}public static ICountModule GetCountModule(){return (ICountModule)new StudentSoreList();}public static IPrintModule GetPrintModule(){return (IPrintModule)new StudentSoreList();}public void Insert(){Console.WriteLine(输入模块的Insert()方法被调用);}public void Delete(){Console.WriteLine(输入模块的Delete()方法被调用);}public void Modify(){Console.WriteLine(输入模块的Modify()方法被调用);}public void CountTotalScore(){Console.WriteLine(统计模块的CountTotalScore()方法被调用);}public void CountAverage(){Console.WriteLine(统计模块的CountAverage()方法被调用);}public void PrintStudentInfo(){Console.WriteLine(打印模块的PrintStudentInfo()方法被调用);}public void QueryStudentInfo(){Console.WriteLine(打印模块的QueryStudentInfo()方法被调用);}}{//ISP:接口隔离原则IInputModule inputModule StudentSoreList.GetInputModule();inputModule.Insert();ICountModule countModule StudentSoreList.GetCountModule();countModule.CountTotalScore();IPrintModule printModule StudentSoreList.GetPrintModule();printModule.PrintStudentInfo();} 4.优缺点
优点 将臃肿庞大的接口分解为多个粒度小的接口可以预防外来变更的扩散提高系统的灵活性和可维护性 接口隔离提高了系统的内聚性减少了对外交互降低了系统的耦合性 如果接口的粒度大小定义合理能够保证系统的稳定性但是如果定义过小则会造成接口数量过多使设计复杂化如果定义太大灵活性降低无法提供定制服务给整体项目带来无法预料的风险 使用多个专门的接口还能够体现对象的层次因为可以通过接口的继承实现对总接口的定义 能减少项目工程中的代码冗余。过大的大接口里面通常放置许多不用的方法当实现这个接口的时候被迫设计冗余的代码
缺点 需要掌握接口细分的程度,如果太细,会造成接口膨胀,增加系统的复杂性