本质上所有软件系统就是一组策略语句的集合。每一段代码都是策略。软件架构设计的重点工作之一就是,将这些策略彼此分离,然后按照变更要求进行分组。其中变更原因,频率层次相同的策略应该被分到一个组件中。反之,就不该放到一个组件中。
我们对层次,是严格按照输入与输出之间的距离,来定义的。也就是说,一条策略的距离系统的输入/输出越远,那么它的层次就越高。直接负责输入输出的,是最低。
举例:
输入一串字符,通过查表法转换这些字符,然后输出。数据流向实线,依赖关系虚线。
上图中,Translate
就应该是层次最高的组件,因为离输入输出最远。可以看到,数据流向,和依赖关系的方向并不一致。因为我们希望流向和依赖脱钩,但要在组件层次上挂钩。
如果我们将代码写成这样,就是一个错误的架构,因为高层次组件依赖了低层次组件。
function encrypt(){//高层次组件,Translate
while(true){
writeChart(translate(readChart()));//低层次组件writeChart,readChart。
}
}
好的架构应该如下图:使用接口隔离解耦。ConsoleReader
和ConsoleWriter
都是具体实现类,属于低层次组件。这两个具体实现类,都形成了对高层次组件的插件,高层次组件可以不知道具体实现类,而实现类依赖于高层次组件。
实际上这个案例,简单的体现了单一职责原则(SRP),开闭原则(OCP),共同闭包原则(CCP),依赖反转原则(DIP),稳定依赖原则(SDP),稳定抽象原则(SAP)。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。