对与设计模式始终都没有什么感觉

2023-01-08 14:08:25 +08:00
 Aaron7Amelia

现在有书籍或者博客会用各种比喻来说各种设计模式。但是我看了后始终都没有什么感觉。最早先的时候,我还特意的死记硬背,想把 23 种设计模式记住。写代码的时候,硬着头皮往某个模式套。但在没有感觉的前提下,死记硬背实在太难受,然后过了一段时间就又全都忘记了。

不知道大家是如何学习或者应用设计模式的

7994 次点击
所在节点    程序员
60 条回复
hsfzxjy
2023-01-08 20:36:43 +08:00
设计模式只是对特定编程语言缺陷的补充,不用奉为教条。
MeiJM
2023-01-08 20:53:00 +08:00
如果是 java 的可以看看 spring 里面用到了很多设计模式 有些特性就是设计模式的封装 例如事件监听 但是也有很多过度设计 例如权限的结构就很乱
wzcloud
2023-01-08 20:54:49 +08:00
多看看优秀的开源框架,就体会到设计模式的好处了。
mauve
2023-01-08 20:58:47 +08:00
移动端开发必须要用,又没有刷新网页或者加机器这种操作,App 卡死就是死了,没救
fkdog
2023-01-08 21:06:29 +08:00
设计模式细分大概有 17 种,实际上大部分本质都是封装 /继承 /多态的使用罢了,本质实际上都是一样的。
如果你能通过利用面向对象的这几个特性来达到降低耦合、便于扩展和维护,那背不背其实都无所谓
fkdog
2023-01-08 21:09:40 +08:00
不要背,背了也没用。
很多人刷 leetcode 、学 jdk 、spring 框架源码、设计模式,都是边学边忘。
学习的最好方式就是实践。
如果你只是为了应付面试,那么就在准备面试的时候再去突击这些东西。
如果你是为了把这些东西利用到平时代码里,那么可以边学边做。
makelove
2023-01-08 21:18:13 +08:00
@hsfzxjy 当年精读过最初四人帮的那本模式书,有些模式还是挺有高级感的,并不是针对语言缺陷(或者可以说只有极小部分可能和语言不太动态有关)
xuanbg
2023-01-08 23:37:06 +08:00
设计模式其实就是针对特定的问题的最优解。说白了就是“套路”。
charlie21
2023-01-09 00:05:24 +08:00
设计模式其实是责任划分方式
inframe
2023-01-09 00:31:42 +08:00
软件工程这块就是千层饼,一层套一层

对设计模式我的理解是

软件开发过程中 [软件模块内部] 常见共性结构问题的解决方法,组织代码的公共套路,就像看到一元二次方程先算解的Δ=b²-4ac 一样,
就算不用设计模式大概率也能写代码,但优化到最后就是类似的某一个模板即设计模式了

设计模式的千层饼的维度高一阶就是架构模式了,最近看了本《凤凰架构,作者周志明》感觉这些问题就很类似
Rocketer
2023-01-09 01:15:53 +08:00
29 楼正解。

设计模式就是写代码的时候假设我就只负责这一小块,我怎么写才能让别人调用方便,且别人增加和修改需求的时候尽量不需要我也跟着修改。

常思考这个问题,最终你会发现你已经实现了某个(些)设计模式。可能与课本上不完全一致,但方向是对的,此时再按教科书的方式修改一下你的代码,你就彻底记住了。
netabare
2023-01-09 06:10:17 +08:00
说到设计模式的话……想到了小学时候的平方差公式,不知道这个比喻恰当不恰当。

大概是,在课本上会讲到,但是其实也不是多么复杂的知识,也许很多人在学到这个知识点之前,就已经自己摸索出来了。

但是反过来说,也不会有人整天写书本、课程或者是开会来教授「平方差公式背后隐藏了什么精神」之类的东西吧?

我对设计模式的理解大抵上也差不多……首先这东西在某些特定的场景是有用的,但是并不是什么绝对真理一样的东西,反过来说,不同人也可以通过自己的实践和学习形成或多或少的属于自己的感悟。

但是如果有人整天在吹「 Java 编程思想」、「 PHP 设计模式」之类的东西……还是离得远远的吧。

顺便提一下,有一些设计模式的存在,是为了解决在语言中缺少的语法结构而出现的。

比如说 Visitor 模式之于 Pattern Matching 。在 Kotlin 这种命令式语言里面不存在 PM ,所以只能用 Visitor 来模拟。

比如说 Strategy 模式之于 Lambda 和 HOF ,所以这种模式在 Java8 之后就没什么价值了。

比起死记硬背设计模式,不如尝试理解一下这些模式是怎么来的。

这背后涉及到的,Language Design Engineering ,还有 Functional Programming 里面的抽象和组合的概念,也许可以获得更多有趣的收获。
NGXDLK
2023-01-09 09:09:10 +08:00
这东西不是死记硬背,你可以先把设计模式过一遍,脑子里留个印象,真正要用的时候能有个方向。随着实践的次数增多,慢慢就理解了。
openmm
2023-01-09 09:35:05 +08:00
@fkdog 哈哈哈哈,我的理解和你一样
darling19961030
2023-01-09 09:44:44 +08:00
各种设计思想、理论、方法都是针对具体问题的分析或者总结,并没有形成一套完整的面向对象设计体系。javaee 在 spring 这种 mvc 模式下,大多是事务脚本式代码,面向过程,分析过程类似 wbs 这种拆分步骤。楼上提到责任划分,我认为这是封装带来的好处,隔离复杂度,责任明确,而设计原则,是指导怎么设计这些静态的类,比如单一职责,设计模式,是指导怎么动态组织这些类。
tramm
2023-01-09 10:18:35 +08:00
需要时自然就懂了, 不懂说明还不需要.
lllllliu
2023-01-09 10:25:26 +08:00
可以增加 KPI (狗头)
ren2881971
2023-01-09 10:32:00 +08:00
个人感觉是因为语言的不健全才引入设计模式啊。。
7911364440
2023-01-09 10:38:41 +08:00
第一次感受到设计模式的好处是看自己当时的技术经理写的代码,对比了下自己写出来的类似的代码,拓展性和代码复用性简直强太多了。
所以 2L 是正解,多看看优秀的代码能学到很多东西。
Chinsung
2023-01-09 11:17:43 +08:00
设计模式理解的方式一方面是看源码,不是看他设计模式怎么实现的,看他解决了什么问题抽象了什么
不要试图去找本书学会,真正悟到的一瞬间是你发现当下写的代码感觉很复杂,然后开始回忆之前看过的的某种模式可以简化这个逻辑,这才是你真正悟到设计模式的时候,设计模式本身也就是某种情况的某种套路写法

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/907356

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX