设计模式的误区,Java程序员对设计模式的诋毁及滥用

clonne 发布于 2012/07/07 18:20
阅读 2K+
收藏 4

首先,设计模式是一种程序设计的方法,指的是某一领域/类型的程序的设计方法。

所有的设计模式都是在前人/以往软件的基础上总结的,这一点需要非常注意。

Java程序员对设计模式第一个诋毁的就是:用设计模式。他们会在一个软件中说用工厂模式、用代理模式、用xx模式。然而实际上,设计模式不是让你来用的,设计模式不是实体,不是规范,要记住设计模式不是规范、规则、教条,从来就没有“用这个设计模式”这样的说法。

设计模式是体现,要知道设计模式首先是软件中一种设计的体现,所以才叫设计模式。而“用这个设计模式”的的说法则是本末倒置,完全是对设计模式的诋毁和滥用,或者说是误人子弟。在任何一个软件都都能体现出设计模式,大家见到的23个常见的设计模式,是通过几十年的软件开发经验积累出来的一套设计方法的总结,设计模式不是规范、不是贵规则、不是教条、不是物品,不是说“用这个设计模式”你就真的设计模式了,其实是你的软件的整体设计体现出哪些设计模式,而不是本末倒置。

为什么我说本末倒置,因为Java程序员特别爱对工厂模式、xx模式直接强制的表达为类,而且直接粗暴的取名为xxxFactory,然后整个软件里面充斥着大量的xxxFactory、xxxWrap等这些莫名其妙的类名,我可以直接肯定的说这不但是本末倒置,更是对设计模式、Java、程序开发整个领域的诋毁。为什么我这么说,因为首先设计模式是体现,而且是对以往软件的总结,在设计模式之前可不会有xxxFactory、xxxWrap这些名称,但是设计模式依然是设计模式,软件依然体现出来。而现在设计模式摆上明处了,就直接取xxxFactory这样的名了,这根本是滥用。

为什么我会对一个类的取名这么反感,因为我看到了设计模式的悲哀、Java的悲哀,还有Java程序员的愚蠢。设计模式并不是提出之后才有的,设计模式一开始就存在,设计模式是方法,是总结,是体现。而且,更重要的一点,设计模式是隐形的,然而现在的Java程序员特别喜欢把设计模式放到明处,好像不这样就不舒服一样。

就像数据结构一样,数据结构也是隐形的,模块a用什么数据结构,和模块b没有任何关系,这两个模块通过接口交流,但是完全不需要知道对方用什么数据结构这些乱七八糟的东西,数据结构从来都是隐藏在接口后面。

然而现在的Java程序员愚蠢到要把该隐藏的摆到明处,还特别骄傲。我可以肯定的说,设计模式被Java的程序员滥用了,本末倒置了,完全错了。第一,设计模式是体现,别说Java,就是汇编、机器码,依然有设计模式,因为设计模式不是库、不是规范、不是教条,是体现,是方法。然而我却总是看到《Java设计模式》这类哗众取宠的东西,好像Java中的设计模式就高贵一样,你们这是会Java惹上骂名。

可以说,我是喜欢Java的,但是我不喜欢那些自以为是的用着Java的程序员,我没有Java的经验,只用Java写过一个Web服务器,但是我可以肯定的说,我比那些滥用、诋毁设计模式的人更有资格说自己是Java程序员。

总结:

1.设计模式是方法

2.设计模式是对几十年软件开发经验的总结

3.设计模式是隐形的

4.设计模式是通过软件设计中体现出来,而不是用

加载中
0
中山野鬼
中山野鬼

哈。不知道有多少JAVA程序员能读懂。。。。这算是JAVA的悲哀。有几个JAVA程序员算合格的程序员,无非不愿思考的键盘打击者。

设计模式,其实就是前人对一类问题的解决方法的归纳,但既然是归纳,落到具体问题时,只能借鉴,不能照抄。

最烦张口闭口一堆术语说问题的。说术语本没错,用来解决问题也没错,把术语当解决方案就扯淡了。很多北京,上海的互联网小朋友,也是这种毛病,几个字母组合就颠来倒去的说。。。。

曾经特烦 什么 WEB 2.0 时代。。。。喷这个词的很多,能说清楚WEB 1.0 ,2.0之间本质区别的少的可怜,至少我也说不清楚,索性当我对这个彻底白痴。。

中山野鬼
中山野鬼
回复 @OrionBox : 能这样的已经很好了。更多是你问他ABC是什么,他会说,ABC就是ABC,ABC就是用来解决这个问题。。再问,不是他疯了,就是他认为我不可理喻哈。。。
OrionBox
OrionBox
这个设计模式你要背的,这个术语你要记住。HR会问你,你记得。说的出,工资才高。。。这就是咱系副院长
0
周翼翼
周翼翼
设计模式试图解决一个什么问题, 谁能告诉我?
jun4rui
jun4rui
设计模式要解决的,就是日常开发中,面对客户or业务不断提出的修改要求,你无力(或者非常吃力)的进行修改的问题。
六只
六只
重在复用,易于扩展。绝对不会减少代码量,也不是强制使用,不用同样可以解决问题,好与更好的问题。
0
姑妄听之
姑妄听之
呵呵,不能说你这文章一点可取之处都没有。但是绝对的是矫枉过正了。或者说,是犯了和你要批判的人一样的错误。具体说个例子。你这通篇都批判硬套模式的做法,但是却没有给出任何一个硬套模式造成的恶性后果。说来说去,所谓最大的问题,不过是有些类名字刺伤了你的眼而已,纯属带有强烈偏向性的个人主观喜好。用这个作为论据,来批判滥用模式的错误。实在是没有什么说服力。
clonne
clonne
因为名称从某一种意义上,是思想的体现
0
中山野鬼
中山野鬼

引用来自“周翼翼”的答案

设计模式试图解决一个什么问题, 谁能告诉我?

试图对当前问题,找到曾经类似问题的参考解决方案。使得对共性部分能暂且放一放,着重分析个性部分。

一个新系统的构架不可能凭空出现,基于可借鉴的架构做范本(不是TMD的模板,直接套!),可以提高效率,同时少走弯路。

0
周翼翼
周翼翼

引用来自“中山野鬼”的答案

引用来自“周翼翼”的答案

设计模式试图解决一个什么问题, 谁能告诉我?

试图对当前问题,找到曾经类似问题的参考解决方案。使得对共性部分能暂且放一放,着重分析个性部分。

一个新系统的构架不可能凭空出现,基于可借鉴的架构做范本(不是TMD的模板,直接套!),可以提高效率,同时少走弯路。

领域?
0
ChenQi
ChenQi

引用来自“chrisg”的答案

呵呵,不能说你这文章一点可取之处都没有。但是绝对的是矫枉过正了。或者说,是犯了和你要批判的人一样的错误。具体说个例子。你这通篇都批判硬套模式的做法,但是却没有给出任何一个硬套模式造成的恶性后果。说来说去,所谓最大的问题,不过是有些类名字刺伤了你的眼而已,纯属带有强烈偏向性的个人主观喜好。用这个作为论据,来批判滥用模式的错误。实在是没有什么说服力。
同意。通篇的议论意义不大,并且没有说服力,还不如直接拿出个实例来分析。
山林中的疯子
同意,设计模式既然是思想,那么会有思想的具体体现,和类名有啥关系
0
中山野鬼
中山野鬼

引用来自“周翼翼”的答案

引用来自“中山野鬼”的答案

引用来自“周翼翼”的答案

设计模式试图解决一个什么问题, 谁能告诉我?

试图对当前问题,找到曾经类似问题的参考解决方案。使得对共性部分能暂且放一放,着重分析个性部分。

一个新系统的构架不可能凭空出现,基于可借鉴的架构做范本(不是TMD的模板,直接套!),可以提高效率,同时少走弯路。

领域?
各种开发领域均有。无非面向对象类来类去的更明显些。由于面向对象的一个特点,希望类的继承,可以更好的提高代码的复用性,结果呢???模板或模式化情况严重,特别是看似牛B哄哄的,用某些设计模式熟练的人,换个问题给他做,简直是灾难。。。还怔怔有词的说,这才是编程。 为了复用以前的类,框架,等等,就不停的调整,增加辅助代码和模块,最后搞个四不像,总算完成任务了,随之而来的是臃肿的代码,和复杂的一堆概念。很多C++的项目就这个下场,无非有些人维护这些复杂,臃肿的莫名其妙和问题本身无关(是由基础设计模式错误导致的)的代码很有成就,从而继续肯定原有基础设计框架的正确性。
不防喷一句,正确NM啊?我要解决问题,同时能为后续一系列问题做方案储备,而不是让你来拿个设计模式和问题叠加出更多问题。

这里我也另外找喷一句,做C++的,你没到有能力从基础库堆出系统,这个高度,就少和我唧唧歪歪的说什么系统好还是坏。。别那无知当勇气,去维护哪些乱七八糟的“设计模式库或类”。C++是语言,不是库,或类。
山林中的疯子
这里我发表下自己的意见,不喜勿喷: 计算机语言从发展到现在,所经历的已经很多,但是相对的计算机语言分支,和计算机系统一样不少,至今还没有任何一项技术可以相对的通用,并且由于业务需求的不同变得臃肿也是可以理解的。
0
aiasfina
aiasfina

嘛..个人认为对于一般的码农来说,设计模式更多的是方向而非方法。在一步一步的优化和重构中,你看到了,那就已经用到了,然后就是进一步明确地使用xxx设计模式。

至于第三点,我个人觉得设计模式在初期是隐形的。至少Gamma他们除了“创造”了一批精通设计模式的Java程序员之外,还划分和命名了设计模式。当它有了名字,人们可以发现和讨论它,那就不是隐形的了。

0
周翼翼
周翼翼

引用来自“中山野鬼”的答案

引用来自“周翼翼”的答案

引用来自“中山野鬼”的答案

引用来自“周翼翼”的答案

设计模式试图解决一个什么问题, 谁能告诉我?

试图对当前问题,找到曾经类似问题的参考解决方案。使得对共性部分能暂且放一放,着重分析个性部分。

一个新系统的构架不可能凭空出现,基于可借鉴的架构做范本(不是TMD的模板,直接套!),可以提高效率,同时少走弯路。

领域?
各种开发领域均有。无非面向对象类来类去的更明显些。由于面向对象的一个特点,希望类的继承,可以更好的提高代码的复用性,结果呢???模板或模式化情况严重,特别是看似牛B哄哄的,用某些设计模式熟练的人,换个问题给他做,简直是灾难。。。还怔怔有词的说,这才是编程。 为了复用以前的类,框架,等等,就不停的调整,增加辅助代码和模块,最后搞个四不像,总算完成任务了,随之而来的是臃肿的代码,和复杂的一堆概念。很多C++的项目就这个下场,无非有些人维护这些复杂,臃肿的莫名其妙和问题本身无关(是由基础设计模式错误导致的)的代码很有成就,从而继续肯定原有基础设计框架的正确性。
不防喷一句,正确NM啊?我要解决问题,同时能为后续一系列问题做方案储备,而不是让你来拿个设计模式和问题叠加出更多问题。

这里我也另外找喷一句,做C++的,你没到有能力从基础库堆出系统,这个高度,就少和我唧唧歪歪的说什么系统好还是坏。。别那无知当勇气,去维护哪些乱七八糟的“设计模式库或类”。C++是语言,不是库,或类。
老衲大概要做c++或java去了, 一场悲剧,正准备上演....
0
宏哥
宏哥

引用来自“周翼翼”的答案

设计模式试图解决一个什么问题, 谁能告诉我?

这个问题我应该能回答你:

如果你不想解决任何问题,并且你需要一个或者多个问题的时候, 设计模式就能帮你解决这个问题

看明白了没有, 我么有看明白

返回顶部
顶部