现在软件设计的方法中,最流行的可能还是面向对象的模型,但是本人还是对C语言有着特殊的喜好,本着软件设计殊途同归的原则,进行了一些思考。
首先,软件设计的中心是什么,乍一看,面向对象和面向过程有不同的观念,一个是已数据为中心的,一个以流程为中心,但转念一想,他们又不无联系。
我们退一步看,计算机是什么,是计算的机器,也就是,计算机的本质是处理数据,由此看来,流程是为了处理数据,最终的着眼点还是在于数据。
下面,我们来提出几种UML的概念。
类,关联,依赖,组合,聚合,接口,多态
这些概念看起来都是由类引出来的,那“类”究竟是个什么东西呢?
类就是一些数据和方法的集合,这里的方法有个特点,就是能访问此类中的数据。
对于C语言,我们可能要把数据和类分开表达了,结构体可以表达一个数据集合,但如何仅让某些方法访问这些数据呢?
对了,就是给这个函数安排一个指向此结构体指针的参数。
由此,对类的类比就告一段落了:
数据:结构体
成员函数:以此结构体指针作为参数的函数
对于一个类,还会有一种纯虚函数(接口)的概念,也就是一些调用规范,强制他人实现的。
如果一个过程,可以在运行时决定用哪一个具体函数(实现),那就可以实现运行时多态,由此可见,C语言可以通过结构体中的函数指针成员,
来实现多态的语义,而接口,可以认为是函数指针成员的集合。
然后就是一些关联的表达了,所谓关联,就是此类访问其他类的一种途径。
这里有几种情况
1. 要使用其他类的数据
2. 要使用其他类的接口
3. 要使用其他类的函数
基本上,要使用什么就会保存一个相应的引用。
1. 用一个指向其他结构体的指针,那成员函数在实现功能的时候,就可以访问到其他类的数据了。
2. 用一个指向某个接口的指针,同样,就可以使用其他类的接口了。
3. 使用其他类的函数,更简单了,直接包含相应文件直接调用就行了。
另外,在实现一个流程的时候,可以用异步的方式,调用时,把返回结果的接收函数记录下来,由被调用方在完成后主动告知你结果,
这就是一个典型的回调方式的信息传递方式。
再比如,某个模块可以广播自己相关的某些信息,比如开机的事件,系统知道,他可以通知给其他的应用程序,在这个场景里,系统知道自己
能发出哪些事件,而不管哪些模块需要得到通知,由此可知,这种情况下,由其他模块把通知自己的方法告诉系统模块,然后系统在发生事件时,
依次通知各个模块,系统对每一种事件,可以维护一个函数列表(由其他模块注册),发生相应事件时,广播出去,而其他模块就是向系统模块注册函数了。
以上,是我在实践过程中,总结出的一点小经验,作为记录。
无限风光在顶峰!
吴孙杰