关于模式争论的一点点思考

07-02-10 laputa
我是一位C++程序员,最近在了解模式方面的知识,让我没有想到的是,在模式和OO方面,会有这么热烈的争论。

当然,我发现在JAVA界,尤甚。

首先说说我为什么会关心设计模式,最直接的是我听说过这个东西,然后发觉这个东西确实为我的软件开发工作

指了一条路,至少我发觉它可以开阔你的眼界。其次是我在开发工作中遇到了问题,由于缺乏设计,做成的软件

扩展行和可维护性很差。举个简单的例子,我的一个项目中,由于数据层和表现层没有很好的分离,后来软件升

级,数据的组织形式和访问机制已经改变,为了适应这个改变,很多东西需要重写,包括展现层,而对于展现层,

其实并没有多大的改变!我想如果我当初多点考虑软件的设计,我想是可以把修改降到最低的。这只是一个简单

的例子,实际开发中遇到的问题远不止这些。

所以我开发关心设计,学习一些设计模式,尝试把它应用到实际的开发中。但是让我意想不到的是,在模式,OO

的运用上,存在这么多的分歧,而且当我跟朋友讨论起模式的时候,他正告我说小心走到模式的学院派里。于是

我开始关注这个问题。

于是我尝试问自己几个问题:

1,模式是什么东西,他可以给你带来的是什么。

2,应用模式到你的开发中,会有哪些负面的影响?

要回答这些问题,对于我现在的水平,显然是不容易的。所以这里写的,只能算是记录自己的心路历程,而

并非经验总结。

1,模式是什么东西,他可以给你带来的是什么。

这个问题相信有参与讨论的程序员都有自己的理解。我的理解是模式是特定场景下的特定问题的解决方法的指导。

离开了场景和问题,也没有模式一说。这些指导方法哪里来的,正确吗?它来源于丰富程序开发经验的程序员的

经验总结。是的,它是一个经验总结,是有经验的程序员们总结出来的解决特定问题的方法,这些方法的好处一般

是提高模块复用性,减少模块间耦合,增强扩展性等。它给你带来的最直接的就是提供给你一个解决特定问题的方法

,不是吗?那么你是否需要使用它呢?用不用,取决于你的判断,你的问题和你的开发场景。首先你要判断该模式是否

适用于你当前的问题,context和question是否一致,解决方法跟你的系统有没有什么冲突?在判断为适用的情况下?

就是否需要用这个模式来解决这个问题呢?下面我们会分析这个问题。

2,应用模式到你的开发中,会有哪些负面的影响?

模式的缺点,一般都是由于它的优点所引起的,只所以成为模式,必有它的可取之处,我的理解是一般在提高模块复

用性,减少模块间耦合,增强扩展性等方面起积极作用。但是这样的好处并不是免费获得的,首先,从写代码的角度来

说,你可能要写花费更多的时间去实现,有些简单的问题,或许你用过程化的解决方法,可以很快得到解决,但是运用

模式,你必须要分析你的应用场景,抽象你的问题,还需要理解你所使用的模式,掌握它,实现它。其次,由于模式一般

会在扩展行和复用性方面去考虑,代码的运行效率有时候就会必你直接的过程化实现要低,占用的资源也可能会上涨。这个

你就要考虑你是否可以承受。

为什么TCP的实现没有用OO的方法,为什么操作系统很少提供OO的API,为什么CPU也只是一条条

的执行指令,而没有提供更高的封装模型?这些情况延续到今天。

500个平方的豪宅,旋转式设计,当然你可以控制它的旋转速度或者是否旋转,智能化的家居摆设,全可由遥控器控制,

智能化的飞机起落平台,不需要的时候可以智能折叠。。。。所有的东西,基本上都可以应需而变,只要你喜欢。

但是,如果你只是一个旅客,只需要在这里住一晚,你是否乐意去住这样一个豪宅,如果你只是一届平民,口袋里只

有百来块钱,你是否认为这样的房子有必要存在?更有甚者,如果我根本不懂什么是高科技,而且我口袋里根本没钱,

难免我不会产生仇富思想,恨不得这个房子马上跨掉。。。。

人人都知道高级豪华小车好,但是我们生产最多的,可能是自行车。人人都知道豪宅住起来舒服,但是普通人只能挤进

50个平方的经济适用房。

无可否认,随着经济的发展,人们的生活水平会有所提高,正如硬件的发展,推动软件的发展一样。

东扯西扯,我想最主要的一点就是,不要什么东西都绝对化,我们生活的社会就是一个很好的参考,不断的学习,独立的

思考,是应该做的事情。

Coolyu0916
2007-02-10 21:11
同意楼主的观点

我从3年前就开始接触了设计模式

第一次看的时候我真的很迷惑

我为什么要用设计模式,原来我能很简单完成的事情干吗要做的那么复杂

然后我也遇见了跟楼主一样的问题

所以当我再次看的时候忽然有种豁然开朗的感觉

但是我在工作中开始使用的时候却发现不知道如何来应用

有的时候想用这种模式,有的时候想用那种模式

最终设计自己看完了还是有些混乱

更主要的是作为一个程序员我对效率的追求也是一样的苛刻

所以为了兼顾效率,有的时候就没有按照设计模式来处理,以致于不伦不类

直到最近我再次看设计模式,逐渐跟我做的项目不断印证才感到有些感觉,片面的在某个点追求极端的效率有的时候会损失整个系统的可扩展性,这是我的切身体会。既然成为系统必然拥有一定的复杂度,当复杂度上升到一定阶段的时候,如果不加以良好的设计,如果再没有良好的文档,当你修改的时候简直就是恶梦,而一个良好的设计完全可以取代文档。源代码是程序员用的最好的文档。

最后指出楼主一个错误,tcp的应用有设计模式的,楼主可以看一下ace这个平台,就是基于网络的,中间的设计模式应用非常的好,c++的开源。

laputa
2007-02-10 21:25
很高兴看到你的评论。

最后指出楼主一个错误,tcp的应用有设计模式的,楼主可以看一下ace这个平台,就是基于网络的,中间的设计模式应用非常的好,c++的开源。

=====================================

或许你误解了我的意思,我的意思是TCP的实现源码里没有体现太多的模式(当然里面有很多灵活的结构设计和分层设计,但是过程化的思想还是贯穿了很多地方)。

我现在就在学习ACE,感觉确实一个不错的东西,但是有一点就是没有搞明白,为什么ACE这样的系统,感觉设计不错,但是在国内应用甚少,原因何在呢?

希望得到更多的讨论,谢谢!

Coolyu0916
2007-02-10 22:19
我一年前就开始学习ACE的,第一次看到就被它吸引了

其中的设计模式实在是非常的精妙

不过ACE也有其局限性

首先只是应用于网络的一个平台,缺少表现层的东西

wxwindow最近似乎发展的不错,也提供了线程与网络等功能

所以ACE的单方面的功能就显得没有wxWindow好了

而且不知道你写过ACE的程序么,ACE5.4版本有内存泄漏

以后的版本我就没有用了

Coolyu0916
2007-02-11 00:19
还有一点原因

开源的东西通常应用成本比较高

需要学习,缺乏文档

没有经过严格的测试(相对企业而言)

永远不会有培训(能达到Jboss这样的真是凤毛麟角)

所以大家还是用MFC比较好

因为有MSDN,用的人也多

有了问题好解决

banq不也说自己孤单么??

开源的东西必然的

不过关键在于坚持做

laputa
2007-02-11 00:27
还没用ACE做过应用,只是写过几个测试程序。

ACE确实没有表现层,这个是由它的定位所决定的,ACE并不想做这方面的东西,它是特定领域的一个框架。只是提供一个网络开发的框架而已。

wxwindow不了解,有时间了解一下。

我想框架最直接的坏处就是庞大,短时间内无法入手或者掌握。其实这里面有一个悖论。按理说我们写框架,都是为了方便使用者更高效的开发,而对于初学者,刚开始的时候却根本相反,我想大家刚开始学习MFC之类的就知道了。说是高效,必须有一个前提,那就是你必须先掌握这个框架,而掌握这个框架,你又必须学习很多很多东西。这里论坛里面常谈到软件蓝领,说白了就是只用关心业务逻辑方面的上层实现,而下层就由框架帮你来完成,其实这个是一个美好的愿望而已,首先是如果没有很好的理解框架,掌握框架,你是很难做好上层的开发,正所谓浮沙筑高台。其次很多人(当然不是绝对)对于底层的事物都会有好奇心的,天天在使用的东西,却不知道是怎么一回事,我想很多人都不会放心的。

laputa
2007-02-11 08:57
嗯,这是一个问题。开源的问题,其实ACE在这方面算做得不错。

主要还是那点,看似是为你提高了效率,增强了扩展,柔韧等,但是是有条件的,那就是你可以很好的驽驾它的时候,才会有这种功效。这就是框架不断多起来,平台不断多起来,而程序员似乎越来越难当,新技术不断的增加,却不断遇到阻抗的问题。

Coolyu0916
2007-02-11 12:17
其实只是学习的困难程度比较大罢了

如果框架的bug真的很少,那么应用成本并不高

比如你作为项目经理,只需要你明白整个框架就可以了

然后你可以定义出接口,决定使用ace中哪一级,哪一种的模式

其他的人只需要在你的基础上写实现就好了

应用成本也不是很高。

不过相对你,在考虑整个项目,开发的难度,成本,人员、效率一些问题上就要有一些全面的考虑了,你的成本就要高了,由于只有你真的懂整个项目,所以整个项目的风险也提高了,其他人在设计阶段可以参与的就非常少。

用商业软件会减少这个风险,我想用C++的很少说自己不知道MFC,stl吧。

至于新的技术我觉得没有那么可怕,看看《设计模式》这本书是那一年出版的,如果我没有记错是1989年,到现在为止觉得它过时了么??焦虑感来自于对新名词的恐惧。语言层面我觉得c++是最难的,c++到了一定程度,学习别的语言真的非常简单,比如我现在用java,c#,vb。语言这一关花费的成本真的很少。但是学java的会迷惑在Struts、Spring、EJB、Hibernate等一系列框架中,但是想想这些真的重要么??这些不过是在应用中使用的框架,是为了减轻的你的开发难度,或者说是公司要求的。也许今天你在这家公司用struts,但是明天跳槽了用了Spring,为了项目而学习是中国程序员最可悲的事情。同时也造成了创造力的丧失。

希望banq能够不介意我下面说得话

开源有的时候是一种思路,比如junit,开创了测试这种思路,你看看他的源代码有多少,比jdonframework要少上不止一个数量级,但是影响力恐怕要大上好几个数量级。jdonframework好像是在struts的基础上的上层应用吧,已经丧失了一个framework的特性,如果struts变成商业的怎么办??与其这样还不如重新开始真的定义一个自己的底层访问接口,可以使用struts的,也可以使用spring,或者提供给使用者自己来实现,专注的在某一层做好自己的事情。

以上的有些东西说得不一定对,可能由于我在java领域的肤浅(我也是最近才开始看java的)。说错了请大家不要见怪:)。

laputa
2007-02-11 12:25
关于使用开源方面说的没错。

java我是不懂,不敢评论。

兄弟有没有在ACE上做应用?有什么学习心得?

Coolyu0916
2007-02-12 08:31
心得谈不上

感觉基本它把想要的模式都设计好了

你需要做的就是选择你在那个层次上进行开发

我用的很简单,就是用了反应堆而已。

laputa
2007-02-12 10:33
反应堆我也用过,不过就是没有应用在项目上

有时候想应用它来开发一些项目,苦于没想到什么合适的项目来搞。

ACE的基本资料在framework层介绍挺多,不过在C++ facade层介绍比较少。我想如果真要把它应用到项目中,从C++ facade层开发学习是必须的,要不碰到问题就会非常麻烦,常在论坛里看到遇到问题的,很难调试,找起来很难,应该就是没有对下层了解的太多的原因。当然如果有适合的项目,边做边学,可能会更好了。

Coolyu0916
2007-02-12 11:15
你看看《C++网络编程》第一卷前几章就写的是facade

很多系统是假想的,我用的时候正好对linux感兴趣

所以就用gcc给公司写了一个监控系统

主要是对实时交易系统以及网络情况进行状态监控,并可以对一些机器进行简单的命令操作。

马维达写的那些教程有些太上层了。

猜你喜欢