今天老师主要讲的是软件工程的方法,主要由面向过程的方法(OP)和面向对象的方法(OO)。
老师特别提到,70%的面向对象程序是在用面向对象的语言来写面向过程的程序。即面向对象的方法如何贯彻到整个软件的设计和实现中去呢?
在暑假进行实训开发的时候,我写的是网页版的五子棋。用JavaEE写servlet和JSP。当时使用了一种缓存数据库技术MemCache,用来记录用户账户,棋盘等所有数据。这一方面是相当于缓存放在内存中以供实时下棋来读写,一方面也是方便的从缓存中存入MySQL,实现MemCache+MysQL。
在处理后台逻辑的时候,我发现既然MemCache已经有了很高的读写效率,同时能够保证数据的一致性和较好的处理并发。然而在这种情况下,后台逻辑中的所有数据都可以随时从数据库中读写,在类的设计中,似乎并不需要有属性,只需要一个个的方法,属性所完成的功能完全由数据库读写来代替,反倒显的简介和方便。
另一方面,由于网页设计的特殊性,使得数据库在整个架构中的位置不可或缺,从而让servlet中只剩下对各个类的方法调用并加入一些处理逻辑。这时,整个代码看起来就非常的类似面向过程的代码。如果用全局方法来代替所有的类,似乎可以完全代替类的作用。
这是不是就陷入了老师所说的用面向对象语言编写面向过程的程序的怪圈呢??
我和好友做了一番讨论。
好友并觉得这有什么矛盾,觉得这可能是在网络应用这个特殊环境下产生的问题,并且这并不会导致对面向对象的性质诸如继承、多态的继续使用。然而我并不觉得这解决了本质问题,面向对象就在于数据和对数据的操作统一封装在了类里,这种封装性被数据库打破了。对数据的存取完全可以用get 和 set函数从数据库中直接进行,不用存储为属性。
讨论之后我继续进行了冲浪,找到一篇大概说明这个意思的文章:
http://www.cadedu.com/bianchengkaifa/wangzhanbiancheng/2010-02-08/19326.html
这篇文章大概的结论在于:
面向对象:处理复杂的业务逻辑
数据库,处理数据的查询、统计、简单的业务逻辑。
当然这篇文章中的数据库指的是关系型数据库,而在本文中讨论的高速缓存key-value数据库的条件下,可能文章的论点就会发生变化,因为此时,存取数据做查询已经不再是很慢的操作。
在网上搜索一番之后,我想问题最终的症结所在就是:
对象持久化
在开发网页五子棋的时候之所以将数据存入数据库,是为了通过数据库进行对弈双方棋局的交流,由于servlet销毁等特性,需要一种方式将对象持久的保存下来。这时候,便用数据库将类中的属性剥离成基本数据类型以存储如数据库中,完成对象的持久化。
网上所提的解决方案一方面是借助数据库,当然,网上的方法更高明,将对象序列化以及反序列化完成对象的直接存储;另一方面将对象序列化后存成文件,实现持久化。
而相比之下,面向对象的数据库还远远不成熟到可以实际大规模商用的阶段,因此,在现阶段,如Hibernate等架构所采用的均为上述的对象持久化的思路。
因此,
如果将对象作为一个整体来看待,似乎数据库便不会破坏对象的封装性,从而让数据库和面向对象能够在一定程度上实现妥协,能够融合在一起。
当然,撰写本文的时候我也深切的感受到自己的编程经验还远远不足,如果想要真正的将这个问题弄明白,或许还需要更多的面向对象的设计、编程实践来获得实际的体验来完成对面向对象方法的重新认识。另一方面,对于数据库的历史及各种牛人如何运用数据库也需要进行进一步的研究,从而最终得到一个对面向对象和数据库之间关系的合适的理解。