且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

GAE研究小组:面向对象与面向过程的工程化理解

更新时间:2022-09-28 15:06:24

这段时间摆弄GAE,对于Python语言一直有点糊涂,看起来Python作为较新的一门语言,对于面向对象的支持度较好,但是在《Python核心编程》一书中,又看到Python与Ruby的比较,说明Python并不是一门纯面向对象的语言,而Ruby是。这给我带来一点困扰。

另外,我没有做过基于CGI的纯Web服务程序,目前正在努力学习和理解这个程序的工作原理,这里面也面临了一个问题,其运行模型为完全的响应请求型,即没有请求,不工作,有请求,启动一个线程或子进程开始工作,这和原来做的服务器,自己来组织线程的任务分配,有很大差异性,一时间,很难把面向对象模型套用进去加以思考。

这个周末主要在思考这个问题,渐渐有了一点心得,这里share出来,和大家讨论一下,还是那句话,一家之言,欢迎拍砖哈。

以前我们讨论过,软件编程语言的发展,其实就是一部数据私有化的历史。

以前做过很长一段时间的面相过程,面向过程的主体是函数,而C语言函数的出现,应该可以看做数据私有化的初步,因为第一次出现了函数内部变量,相对于汇编语言而言,函数私有变量明确了每个函数执行体,拥有自己的变量空间,不再是所有变量都必须全局,这给程序的安全性,带来了很大的好处。

但这种设计,相对比较原始,只能解决部分问题。变量私有化之后,固然带来了安全性,非授权访问被禁止,但同时,也带来了变量的“短生命周期”,即私有变量的生命周期,是和函数一起的,随函数退出而死亡。

这在多任务操作系统的并行计算中,给程序员带来了很大的困扰。并行计算中涉及大量的等待同步,这期间线程执行生命体其实无事可做,操作系统为了回收时间片,一般要求函数无事时及时退出,空闲出时间片给其他应用。这就涉及到现场保护问题。此时的函数,并没有完成其业务,仅仅是因为等待而临时退出,应该保留所有的中间变量,等待下次重入可以继续手边的工作。

这在C里面带来了很大的困扰,因为C只有两种变量,全局,和局部,结果,程序员为了在函数临时退出后,保留现场,***回到原始社会,重新使用全局变量来做这件事,这就让程序的安全性又退回了以前的水平。

所有的问题,其实归结到一点,工程需求,需要部分变量在函数结束后,仍然保留等待后续使用,但又不希望使用全局变量破坏程序的结构性。

于是,C++的面相对象思路出现了。我的理解,对象就是一堆数据和一堆方法的集合,在C++中,函数不再是程序的核心,即方法论失效了。关键是数据,一切都是围绕数据而存在,类和对象,为大家提供了一个数据的长久保存方法,函数反而由数据的拥有者,降格为数据的使用者。这就解决了变量的“长生命周期”和私有化保护需求之间的矛盾。

ok,理解到这里,我好像有点领悟了。

GAE中,我们的应用其实也分为两个方面,不要苛求一定要面向过程或者面向对象。

对于一个用户请求,如果是私有访问,与其他用户数据不相干,则这个可以看做一个纯过程应用,即以一个简单的过程函数,来处理请求并回应即可。如一个用户修改其个人资料,完全可以作为一个数据库事务,过程执行,以函数方式编程。

对于某些公有性用户请求,互相之间有数据互动,甚至可能影响其他用户的访问处理,则适合以该数据为核心,在内部构建数据对象,所有的类似用户请求,全部访问这个对象实现功能,采集结果回送,此时,以面向对象的类方式编程较为方便。

当然,对象的长期保存,在云计算中是个难题,不过这是另外一个话题,也不是无解。

比如对象实例化的数据可以考虑放到数据库中做永固性保存,访问类套用数据库的数据实现访问,但每个访问类不要去摧毁数据,此时的访问类有点类似“粘合剂”作用,将用户请求的访问行为,粘合到数据库中的数据上,就比较简单了。

一点想法哈,尚未得到验证,请大家讨论。

本文转自 tonyxiaohome 51CTO博客,原文链接:http://blog.51cto.com/tonyxiaohome/198758 ,如需转载请自行联系原作者