在设计师讨论模块之间的逻辑关系时,会使用下列描述:
● 模块A调用模块B。
● 模块A的接口是……
● 模块A向模块B发送数据。
● 模块A和模块B共享数据。
● 某个事件发生时,模块A通知模块B。
可是等到使用程序设计语言实现上述机制时,会发现:
● 没有“模块”这个实体,没办法做到模块A调用模块B,真正的实现是模块A的类X调用了模块B的类Y;要深入模块A和B的内部掌握各个类之间的调用关系,肯定会更复杂一些。
● 因为没有“模块”这个实体,所以也没有模块的接口,真正的实现是模块A的所有类的公开接口的结合。
● 没有“发送数据”这个机制,真正的实现要么是使用程序调用的参数,要么是定义专门的pipe和stream实现数据传输。pipe和stream可能非常复杂,甚至超过原系统本身,例如Kafaka、RabbitMQ等。
● 没有“共享数据”这个机制,真正的实现是模块A访问了一些数据结构,模块B也访问了一些数据结构,但模块A和B的访问在代码上是完全独立的,没有任何关系,它们都只是依赖于数据结构而已。
● 没有“通知”这个机制,它在实现上可能是程序调用、事件推送、数据传送、消息传输……