PHP8.1.21版本已发布
vue8.1.21版本已发布
jquery8.1.21版本已发布

设计模式(design pattern)在Java中比较常见,在其他编程语言中也同等重要吗?

原创
2016-06-06 16:24:17 1434浏览

设计模式(
design pattern)在Java中用的比较多吗?为什么FP(Functional Programming)不太用呢?c++,python中设计模式也很重要吗?

回复内容:

在一个新的语言环境下研究设计模式的方法有两种。

第一种是,把《设计模式》一书的头两章看作全书精髓,把23个模式实例看成举例说明。在新环境中试图使用头两章的思路去发现和整理合适的设计模式。

第二种是,把《设计模式》头两章看成泛泛而谈的序言,把23个模式实例看成全书精髓。在新的语言环境中试图重新实现这23个模式并寻找它们在新环境下的用法。

第一种人写出了《企业应用架构模式》,《xUnit测试模式》,《企业集成模式》, 《重构》这样的书 (手机党,书名暂凭记忆写下, 有机会再校对)

第二种人写出了《动态语言比静态语言先进》,《从设计模式谈为何ruby完爆Java》,《让我告诉你如何用九行代码在python中实现设计模式》,《Java必须死》之类的网文。(好吧,名称纯属杜撰,不过你懂的) 在C#里也用得不算少,C++会用一部分,但不会像Java那样几乎到处都在用。

设计模式的发明,更多是为了解决语言缺陷用的手段。在FP里基本上没有对象的概念,很多设计模式自然也用不上。对于动态类型的语言,很多设计模式基本上是用不上的,而且python把一部分设计模式的理念融入了语法,就更不需要太对使用设计模式了

这是我在另一个问题里的回答,基本上表达了我对设计模式的态度:Python 里没有接口,如何写设计模式? - 刘启明的回答 设计模式就像张无忌学太极拳。
首先要好好学,但是学完后应该把它们全部忘了,只把其精神融入脑中。然后在实践的时候,千万不要去生搬硬套某模式,而是自己去设计。等项目做多了,代码写多了以后,会发现虽然你没有刻意用设计模式,但是你写出来的代码正好暗合某设计模式里的思想。 语言可以分 2 种
1. 相信程序员.
2. 不相信程序员

Java 是不相信程序员的, 所以设计模式盛行. 一切都要按照条条框框来.

Python 是相信程序员的, 连类的 public / private 成员, 都只是一种约定.
程序员强行从外部调用 private 方法, python 也会同意的.

Java 中典型的 setter / getter, 在优秀的 python 的代码中也根本看不到.
python 老爹也反对大家把代码写的这么复杂.

垠神曾经专门 "解密"过设计模式, 链接: 王垠:解密“设计模式”
核心的思想是,
没有设计模式的时候, 我也是这么写代码的.
所谓的模式, 就是经验的总结.
照搬模式东拼西凑,而不能看透事物的本质,其实是设计不出好东西的。
如果理解了模式, 也就没必要按照模式去写代码了.

我的理解, 设计模式, 学习是必须的. 至于实战的时候. 没必要关心用了啥设计模式.

关于 FP.
如果说, 设计模式, 更多的是一种经验总结.
那么, FP 则是一种逻辑思路, 需要语言有一些特性的支持才可以.
只有新版本的 Java 才支持 FP. 以前, 不是 Java 用 FP 少, 而是根本没法用.
  1. GoF的Design Pattern不是以Java为例子写的,里面的例子都是C++和small talk
  2. 在前言里面已经说了,Design Pattern是Language Specific的,只能解决特定语言的特定问题。
  3. FP有自己的一套东西,他们不管那个叫Design Pattern,不过和Design Pattern的作用是一样的。
  4. 虽然某个Pattern可能换个语言就没啥卵用了,但是这个Pattern所体现的基本原则通常是通用的,你不需要自己去实现只是因为写语法/标准库的人帮你干了。
FP有自己的设计模式,比如Monad

至于java里的设计模型所处理的问题,由于FP里函数是一等公民,所以很多问题不存在了,自然也就用不上那些模式了。
设计模式就是实现了这些面向对象原则,从而达到了代码复用、增加可维护性的目的。
设计模式只是一种工具,一种手段...最终是要写出解耦,复用,可维护的代码的...
工具不重要,目的才重要... 1. 设计模式是给定场景下的可重用的通用解决方案。它由一列的最佳实践来实现。
2. 任何语言都有自己的编程范式,用这种范式在一定场景下解决同样的问题肯定有可重用的方案。
3. java中的设计模式是OO编程范式的设计模式。
4. 即使同样是OO语言,ruby和java的最佳实践的设计模式就有显著区别。因为ruby语法灵活性且支持多范式。
5. FP范式在给定场景下一样有可重用的通用解决方案可以定义出来。例如Pipeline,Observer,Strategy等
6. 有广泛的观点说FP是没有设计模式的。OO里设计模式的存在都是为了弥补语言特性的缺陷。

我个人的观点就是:
如果用现在的OO类语言写代码,那么设计模式很重要。
如果写FP,那么你的实现本身就是为了实现设计模式。 关于这个问题其实已经有很多讨论了,见 Are Design Patterns Missing Language Features

推荐一个视频
pyvideo.org - Python Design Patterns 1
演讲者是我非常欣赏的 Brandon Rhodes,他在这个视频里列举了 GOF 中的各种设计模式在 Python 中的应用,哪些因为 Python 的语言特性直接消失了,哪些仍然有用。 In software engineering, a design pattern is a general reusable solution to a commonly occurring problem within a given context in software design

你感觉其他语言应不应该有?
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。