面向对象的思想让裸编程带上灵魂
时间:10-02
整理:3721RD
点击:
前面发帖说裸编程要有思想,也许还不够具体,本帖就是要具体说裸编程的思想的具体做法。
没有思想的裸程序就如一副人体骨架,有个人形,但没有人样,骨骼之间的关节都是靠胶水或拉线连接起来的,生硬而呆板。如果给骨架包上皮肉,加上灵魂,我们就会惊叹:啊!这是帅哥,这是美女!因为骨架活了。
裸程序也一样,如果按传统的思维方式说这样就足够了,那么裸程序就形如骨架,通常只是一些功能的粗糙堆砌,也只会叫后人看了说这程序垃圾,而后人再做也未必能跳出这个圈子,那么后后人看了又叫这程序垃圾,如此下去,代代相传,传了什么?传了一个总被叫垃圾的东西:无思想的裸程序。
我做了程序好多年,也思考了编程好多年,不断的经验积累告诉我:写好的程序不是如何去完成代码,而是如何去组织代码,是如何组织,不是组织。上位机中面向对象的编程思想,就是一个非常可取的思想。
面向对象的编程思想在上位机中是有一个非常丰富的开发包和功能强大的操作系统支持的,裸编程如何引入这样的思想呢?也许很多人会觉得不可能。
其实,没有什么是不可能的。再复杂的思想,最终都会归结到汇编,归结到裸程序,我们的单片机程序,正是一种裸程序。只是在单片机编程时和微机编程时我们站在开发平台上的高度不一样,而已!
对这个高度的理解,也许很多人很困惑,因为我们平时很少注意它们,那么这里我就举个其他的例子来说明,尽管和裸编程好象不很想关,但是这个例子里的高度概念十分清晰。我们知道网络传输标准层次有七层:应用层、表示层、会话层、传输层、网络层、链路层、物理层,这么多层做什么用?也许理解这样分层的概念也十分辛苦,但是理解这样分层的思想,就容易多了,而且这也是我们硬件工程师们最应该借鉴的思想,让我们的硬件设计更具有标准性和前瞻性。这个七层的思想从根本上讲就是将一个网络传输产品细化,让不同的制造商选择一个适合自己的层次开发自己的产品,层次不一样,他们所选择的开发基础和开发内容就不一样,高一层开发者继承低层开发者的成果,从而节省社会资源,提高社会生产力。对这个指导思想我就不赘述了,各位自己去理解,这里要说的是,微机上的面向对象编程思想就是如同在应用层上实现的思想,而裸程序的面向对象思想则如同在链路层上实现的思想,他下面没有软件开发包,只有物理构架。但是在应用层上实现的思想,最终都要翻译到物理构架上。
看懂了上面的例子,就一定明白,裸程序的面向对象思想,是可以实现的,只是难度要大得多,理解要难得多。但是这不要紧,这正是软件水平的表现,你喜欢技术,又何惧之?其实也不会难到哪里去,只是把做事情的方式稍微改变一下而已。
传统上我们都喜欢用功能来划分模块,细分任务,面向对象思想不这样。面向对象思想则是先从一个任务中找出对象,在对象中搀杂些模块等来实现功能的。这就是两种风格截然不同的地方。比如我们要让我们的单片机把显示信息输出到显示器,那么传统的分析方法是信息格式化、格式化数据送显示器显示,似乎这样也就足够了,不同的显示器用不同的送显示程序或者程序段,配置不同的变量,能共的共起来,不能共的分开。但是面向对象的思想不是这样做的,而是首先把显示器当作一个对象,该对象具有一些功能和一些变量属性,不同的显示器在对象中使用相同的代码标识,如函数指针(C语言中),这样对于任何一个不同的显示器,在调用时都使用同样的代码。也许有人说,传统的做法这样也可以做呀,为什么要弄得罗里吧唆的呢?其实不然,使用了正确的思想的好处在前头已经说了好多了,如果还模糊就上去再看一次。
说了那么多理论,现在就说些具体的做法吧。以Keil C为编译环境来说说一个对象具体组织的一些做法。首先是找出对象,如显示器,这就是一个典型的对象。其次是分析一个活对象所应具有的基本特征,即属性与动作。显示器的属性如:类型代号、亮度、对比度、显存等,动作如:初始化、内容刷新和显示、开启和关闭、内容闪烁等花样显示等。这样分也比较容易理解,下面是对于代码的组织上,要注意对象的独立性与完整性,首先把显示器对象单独放在一个文档上,属于对象特有的变量与对象的定义放在一起,要区分公有变量与私有变量的定义方式,对于私有变量要考虑临时变量与永久变量的安排,这些安排都是对变量生命期的严格确定,这样可以节省内存,避免混乱。如某一个函数要使用一个变量,函数在调用完了就退出了,而有一个变量只有它使用,却要保存每一次调用函数所产生的结果,这样的变量怎么定义呢?很多人会直接定义一个全局变量,但是一个好的做法是把这个变量定义成该函数的局部变量,但是定义成静态的,那么这样这个变量对其他代码就是透明的,完全不可能会被误修改,而且代码分类性好,便于将来的维护。用函数指针来统一不同类型的显示器不同的处理方式,也是一个很好的处理办法,那样可以让具体处理方式千差万别的显示器都能用一个统一的对象,但是函数指针要慎重使用。
好了,说长了我就头晕,不说了,思想的精华,不必有一样的形态,不同的人会有不同的理解,我只希望能给大家的程序生涯抛砖引玉,我就觉得很有成就感了。
没有思想的裸程序就如一副人体骨架,有个人形,但没有人样,骨骼之间的关节都是靠胶水或拉线连接起来的,生硬而呆板。如果给骨架包上皮肉,加上灵魂,我们就会惊叹:啊!这是帅哥,这是美女!因为骨架活了。
裸程序也一样,如果按传统的思维方式说这样就足够了,那么裸程序就形如骨架,通常只是一些功能的粗糙堆砌,也只会叫后人看了说这程序垃圾,而后人再做也未必能跳出这个圈子,那么后后人看了又叫这程序垃圾,如此下去,代代相传,传了什么?传了一个总被叫垃圾的东西:无思想的裸程序。
我做了程序好多年,也思考了编程好多年,不断的经验积累告诉我:写好的程序不是如何去完成代码,而是如何去组织代码,是如何组织,不是组织。上位机中面向对象的编程思想,就是一个非常可取的思想。
面向对象的编程思想在上位机中是有一个非常丰富的开发包和功能强大的操作系统支持的,裸编程如何引入这样的思想呢?也许很多人会觉得不可能。
其实,没有什么是不可能的。再复杂的思想,最终都会归结到汇编,归结到裸程序,我们的单片机程序,正是一种裸程序。只是在单片机编程时和微机编程时我们站在开发平台上的高度不一样,而已!
对这个高度的理解,也许很多人很困惑,因为我们平时很少注意它们,那么这里我就举个其他的例子来说明,尽管和裸编程好象不很想关,但是这个例子里的高度概念十分清晰。我们知道网络传输标准层次有七层:应用层、表示层、会话层、传输层、网络层、链路层、物理层,这么多层做什么用?也许理解这样分层的概念也十分辛苦,但是理解这样分层的思想,就容易多了,而且这也是我们硬件工程师们最应该借鉴的思想,让我们的硬件设计更具有标准性和前瞻性。这个七层的思想从根本上讲就是将一个网络传输产品细化,让不同的制造商选择一个适合自己的层次开发自己的产品,层次不一样,他们所选择的开发基础和开发内容就不一样,高一层开发者继承低层开发者的成果,从而节省社会资源,提高社会生产力。对这个指导思想我就不赘述了,各位自己去理解,这里要说的是,微机上的面向对象编程思想就是如同在应用层上实现的思想,而裸程序的面向对象思想则如同在链路层上实现的思想,他下面没有软件开发包,只有物理构架。但是在应用层上实现的思想,最终都要翻译到物理构架上。
看懂了上面的例子,就一定明白,裸程序的面向对象思想,是可以实现的,只是难度要大得多,理解要难得多。但是这不要紧,这正是软件水平的表现,你喜欢技术,又何惧之?其实也不会难到哪里去,只是把做事情的方式稍微改变一下而已。
传统上我们都喜欢用功能来划分模块,细分任务,面向对象思想不这样。面向对象思想则是先从一个任务中找出对象,在对象中搀杂些模块等来实现功能的。这就是两种风格截然不同的地方。比如我们要让我们的单片机把显示信息输出到显示器,那么传统的分析方法是信息格式化、格式化数据送显示器显示,似乎这样也就足够了,不同的显示器用不同的送显示程序或者程序段,配置不同的变量,能共的共起来,不能共的分开。但是面向对象的思想不是这样做的,而是首先把显示器当作一个对象,该对象具有一些功能和一些变量属性,不同的显示器在对象中使用相同的代码标识,如函数指针(C语言中),这样对于任何一个不同的显示器,在调用时都使用同样的代码。也许有人说,传统的做法这样也可以做呀,为什么要弄得罗里吧唆的呢?其实不然,使用了正确的思想的好处在前头已经说了好多了,如果还模糊就上去再看一次。
说了那么多理论,现在就说些具体的做法吧。以Keil C为编译环境来说说一个对象具体组织的一些做法。首先是找出对象,如显示器,这就是一个典型的对象。其次是分析一个活对象所应具有的基本特征,即属性与动作。显示器的属性如:类型代号、亮度、对比度、显存等,动作如:初始化、内容刷新和显示、开启和关闭、内容闪烁等花样显示等。这样分也比较容易理解,下面是对于代码的组织上,要注意对象的独立性与完整性,首先把显示器对象单独放在一个文档上,属于对象特有的变量与对象的定义放在一起,要区分公有变量与私有变量的定义方式,对于私有变量要考虑临时变量与永久变量的安排,这些安排都是对变量生命期的严格确定,这样可以节省内存,避免混乱。如某一个函数要使用一个变量,函数在调用完了就退出了,而有一个变量只有它使用,却要保存每一次调用函数所产生的结果,这样的变量怎么定义呢?很多人会直接定义一个全局变量,但是一个好的做法是把这个变量定义成该函数的局部变量,但是定义成静态的,那么这样这个变量对其他代码就是透明的,完全不可能会被误修改,而且代码分类性好,便于将来的维护。用函数指针来统一不同类型的显示器不同的处理方式,也是一个很好的处理办法,那样可以让具体处理方式千差万别的显示器都能用一个统一的对象,但是函数指针要慎重使用。
好了,说长了我就头晕,不说了,思想的精华,不必有一样的形态,不同的人会有不同的理解,我只希望能给大家的程序生涯抛砖引玉,我就觉得很有成就感了。
很不错的文章 读读很有用
最好附上代码例子!