逐层调用原则与单向调用原则现在约定将 N 层架构的各层依次编号为 1、2、…、K、…、N-1、N,其中层的编号越
大,则越处在上层。那么,我们设计的架构应该满足以下两个原则:
1.第 K(1<K<=N)层只准依赖第 K-1 层,而不可依赖其他底层。
2.如果 P 层依赖 Q 层,则 P 的编号一定大于 Q。
其中第一个原则,保证了依赖的逐层性,与整个架构的依赖是逐层向下的,而不能跨层依赖。第二个原则,则保证
了依赖的单向性,与只能上层依赖底层,而不能底层反过来依赖上层。
针对接口编程,而不是针对实现编程这里所指的接口,不是特指编程语言中的具体语言元素(如 C#中由 Interface
定义的语言接口),而是指一种抽象的,在语义层面上起着接合作用语义体。它的具体实现,可能是接口,可能是
抽象类,甚至可能是具体类。
我认为,从不同的视角,接口可以有以下两种定义:
1.接口是一组规则的集合,它规定了实现本接口的类或接口必须拥有的一组规则。体现了自然界“如果你是……则
必须能……”的理念。
2.接口是在一定粒度视图上同类事物的抽象表示。注意这里我强调了在一定粒度视图上,因为“同类事物”这个概
念是相对的,它因为粒度视图不同而不同。
具体到 N 层架构中,针对接口编程的意义在部分上是这样的:
现仍约定将 N 层架构的各层依次编号为 1、2、…、K、…、N-1、N,其中层的编号越大,则越处在上层,那么第 K
层不应该依赖具体一个 K-1 层,而应该依赖一个 K-1 层的接口,即在第 K 层中不应该有 K-1 层中的某个具体类。
依赖倒置原则在软件设计原则中,有一种重要的思想叫做依赖倒置。它的核心思想是:不能让高层组件依赖底层组
件,而且,不管高层组件和底层组件,两者都应依赖于抽象。
那么,这个原则和我们上面的原则是否矛盾呢?其实并不矛盾。
因为这个原则定义中的“依赖”是指“具体依赖”,而上面定义中的依赖全部指“抽象依赖”。我对这两种依赖的
定义如下:
具体依赖——如果 P 层中有一个或一个以上的地方实例化了 Q 层中某个具体类,则说 P 层具体依赖于 Q 层。
抽象依赖——如果 P 层没有实例化 Q 层中的具体类,而是在一个或一个以上的地方实例化了 Q 层中某个接口,则说
P 层抽象依赖于 Q 层,也叫接口依赖于 Q 层。
从这两个定义可以看到,所谓的依赖倒置原则,正是上面提到针对接口编程,而不是针对实现编程,两者在本质上
是统一的。
综上所述,可以看出,本课题设计的分层架构,应该是这样一种架构:
1.N 层架构的各层依次编号为 1、2、…、K、…、N-1、N,其中层的编号越大,则越处在上层。
评论0
最新资源