V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
cwlmxwb
V2EX  ›  程序员

大家对程序设计的 23 种设计模式怎么看

  •  
  •   cwlmxwb · 2016-06-06 22:25:54 +08:00 · 6760 次点击
    这是一个创建于 3121 天前的主题,其中的信息可能已经有所发展或是发生改变。
    59 条回复    2016-06-07 21:24:43 +08:00
    loading
        1
    loading  
       2016-06-06 22:29:13 +08:00 via Android
    我从来没看过…
    hinkal
        2
    hinkal  
       2016-06-06 22:34:14 +08:00   ❤️ 1
    怎么看指的是?软件编码是一门经验学科,没有什么太多客观规律。设计模式就是经验总结。
    xiusedelang
        3
    xiusedelang  
       2016-06-06 23:17:31 +08:00 via Android   ❤️ 1
    隔几个月翻出来看一遍,渐渐融入自己的日常中。
    techme
        4
    techme  
       2016-06-06 23:19:21 +08:00
    我就记得了一条,不能为了模式而用模式
    zealic
        5
    zealic  
       2016-06-06 23:21:36 +08:00   ❤️ 1
    世上本没有模式,用的人多了,也就成了模式
    jonechenug
        6
    jonechenug  
       2016-06-06 23:24:57 +08:00 via Android
    少了一点套路,多一点实际
    cwlmxwb
        7
    cwlmxwb  
    OP
       2016-06-06 23:27:18 +08:00 via iPhone
    @techme 这样的思想应该还是要走的吧。
    cwlmxwb
        8
    cwlmxwb  
    OP
       2016-06-06 23:28:05 +08:00 via iPhone
    @xiusedelang 每次阅读都有不一样的感觉吧
    zonghua
        9
    zonghua  
       2016-06-06 23:29:48 +08:00
    只会定义调用函数
    just4test
        10
    just4test  
       2016-06-06 23:30:43 +08:00
    第一次看发现只是把自己用过的几种方式起了个名字。
    ooonme
        11
    ooonme  
       2016-06-06 23:39:40 +08:00 via iPad
    函数式只能呵呵了
    xavierchow
        12
    xavierchow  
       2016-06-06 23:42:12 +08:00   ❤️ 3
    这些模式当然需要了解,但更重要的是理解背后的 OO 思想以及发现 bad smell 的能力。我个人更注重 SOLID principle( https://scotch.io/bar-talk/s-o-l-i-d-the-first-five-principles-of-object-oriented-design), 以前经常在发现 bad smell 后找思路的时候扫一眼 Gof 的 Design pattern, 但是不要照搬,更不要为了模式而模式。
    qwerasdf
        13
    qwerasdf  
       2016-06-06 23:47:38 +08:00
    不想从零写一个大软件就不用看
    xiusedelang
        14
    xiusedelang  
       2016-06-07 01:23:29 +08:00
    @cwlmxwb 是的,每次都有开朗贯通的感觉

    个人经验,设计模式一定要避免用力过猛。
    一般公司工作中因为都是基于各种框架开发,自己能用上模式的地方比较少,好学的新人可能会强行使用各种刚学会的模式。
    cwlmxwb
        15
    cwlmxwb  
    OP
       2016-06-07 04:56:38 +08:00 via iPhone
    @qwerasdf 既然选择了 c++,应该会遇到做大软件的时候
    mringg
        16
    mringg  
       2016-06-07 05:02:16 +08:00 via Android
    太多了,先学精三种吧
    haozhang
        17
    haozhang  
       2016-06-07 07:29:34 +08:00 via iPhone
    23 种类使用方式...
    ChefIsAwesome
        18
    ChefIsAwesome  
       2016-06-07 08:32:42 +08:00   ❤️ 1
    明明是面向对象语言的设计模式
    这几条原则倒是各个语言通用的:
    Encapsulate what varies.
    Favor composition over inheritance.
    Classes should be open for extension, but closed for modification.
    jeffersonpig
        19
    jeffersonpig  
       2016-06-07 08:34:57 +08:00
    不了解,没在意过 T.T
    stackboom
        20
    stackboom  
       2016-06-07 08:37:14 +08:00
    理解 SOLID ,大部分设计模式你都可以写出来。
    litpen
        21
    litpen  
       2016-06-07 08:39:17 +08:00 via Android
    在做项目的过程中没想过设计模式,做完后发现处处都有设计模式
    sivacohan
        22
    sivacohan  
       2016-06-07 08:54:22 +08:00 via Android
    设计模式可别瞎看。尤其是初学者。

    那玩意是对自己写了几年,十几年代码里面的一个总结
    。初学者看那玩意总会用力过猛。一切皆模式,一切皆对象,一切皆 xxx 。

    相信我没有银弹,先看别人的项目,发现你在没看书之前就已经使用了 5 种以上设计模式的时候,你再好好看这书。
    alexRH
        23
    alexRH  
       2016-06-07 09:11:52 +08:00
    这东西就像数学课本的课后习题,做了,你一样不会考试。
    wudanyang
        24
    wudanyang  
       2016-06-07 09:14:38 +08:00
    买了本书看
    shakoon
        25
    shakoon  
       2016-06-07 09:26:28 +08:00
    几个人的小项目粗放管理时可能感觉不到,当我自己开始管理百万元级的项目时,发现这些都是前辈血淋淋的经验啊,太赞了,以前走了好多弯路。所以我带应届生,都会时不时提醒他们注意一些他们觉得不以为然的地方。方法论真的很重要,不懂设计模式只会长期停留在初级码农级别。
    levn
        26
    levn  
       2016-06-07 09:39:58 +08:00
    设计模式概念是从建筑领域引入。所以么。
    bigpigeon
        27
    bigpigeon  
       2016-06-07 09:44:19 +08:00
    就好像知道自己在做什么这种感觉吧,就好像为什么人要有名字一样
    cwlmxwb
        28
    cwlmxwb  
    OP
       2016-06-07 09:47:35 +08:00 via iPhone
    @levn 所以 先去搬砖😂
    robertlyc
        29
    robertlyc  
       2016-06-07 09:49:08 +08:00
    荼毒
    cwlmxwb
        30
    cwlmxwb  
    OP
       2016-06-07 09:49:12 +08:00 via iPhone
    @ChefIsAwesome 就举了个 c++的例子嘛,我知道用在 Java python 都可以 只不过是个思想而已
    jackisnotspirate
        31
    jackisnotspirate  
       2016-06-07 09:51:17 +08:00
    设计模式大约 Java C++ 用的多吧。
    chrishine
        32
    chrishine  
       2016-06-07 10:01:07 +08:00 via Android
    23 种设计模式不过是剑招,学习剑招可以看 headfirst 系列,容易入门。
    gof 设计模式中的第一章第二章是总剑诀(第三章是剑招,如果没记错的话),所有人关于设计模式的批判与赞扬,鄙视与崇拜,都逃不出总剑诀所述。
    imcxy
        33
    imcxy  
       2016-06-07 10:01:44 +08:00
    你是怎么看的
    cwlmxwb
        34
    cwlmxwb  
    OP
       2016-06-07 10:27:32 +08:00 via iPhone
    @imcxy 适当的时候使用设计模式可以让写出来的代码容易维护,举个例子,工厂模式,如果在某些特定的时候需要使用而没有使用,那么很可能会违反软件设计的开闭原则,代码清晰度也可能很糟糕(随处可见的 new )
    murmur
        35
    murmur  
       2016-06-07 10:29:07 +08:00
    学 java 的把 spring 那套东西全用一遍再看设计模式就懂了
    cwlmxwb
        36
    cwlmxwb  
    OP
       2016-06-07 10:29:32 +08:00 via iPhone
    @robertlyc 言重了吧,前人的总结,运用的好的话可以事半功倍吧
    wujunze
        37
    wujunze  
       2016-06-07 10:31:08 +08:00
    少一点套路 多一点技术
    wujunze
        38
    wujunze  
       2016-06-07 10:34:02 +08:00
    @chrishine
    @shakoon
    @sivacohan 层主们 在哪里看的 23 种设计模式 麻烦丢个 URL 过来
    stcasshern
        39
    stcasshern  
       2016-06-07 10:41:32 +08:00
    感觉有必要,当前读别人代码觉得怎么这么多事儿啊,后来接触设计模式,觉得果然精妙,当然小工程其实也没那必要
    stcasshern
        40
    stcasshern  
       2016-06-07 10:42:08 +08:00
    @wujunze 推荐《大话设计模式》,简单易懂
    wujunze
        41
    wujunze  
       2016-06-07 10:46:38 +08:00
    @stcasshern 3Q 这本书讲了 23 种设计模式麽?
    icybee
        42
    icybee  
       2016-06-07 10:48:03 +08:00
    设计模式真的和语言无关么?
    cwlmxwb
        43
    cwlmxwb  
    OP
       2016-06-07 10:49:26 +08:00 via iPhone
    @icybee 主要针对 oop
    cwlmxwb
        44
    cwlmxwb  
    OP
       2016-06-07 10:50:01 +08:00 via iPhone
    @wujunze 搜索 c++设计模式 就有了
    slert
        45
    slert  
       2016-06-07 10:53:55 +08:00
    实际用到的机会虽然不多,但是对设计原则的掌握对写代码肯定是有帮助的。
    bramblex
        46
    bramblex  
       2016-06-07 11:27:17 +08:00
    @icybee

    当然跟语言有关,只有 oop 语言才适用 oop 的设计模式。

    换一门 functional 的语言, oop 的设计模式就都日狗了。

    不过由于主流语言绝大部分是 oop 的,所以其实总体来说,设计模式的适用范围还是挺广的。
    bramblex
        47
    bramblex  
       2016-06-07 11:30:12 +08:00
    @slert

    因为码农主要干的活都是拿别人现成的框架填业务逻辑。

    但是如果自己设计框架就不一样了,放眼望去,全都是设计模式。
    imcxy
        48
    imcxy  
       2016-06-07 11:38:57 +08:00
    说黑虎掏心你可能一下子懵逼,但是其实你会了几十年了。

    设计模式本身其实不是什么知识点。最大的作用其实只是一个知识总结。就是知道了:草黑虎掏心就是这玩意啊。

    一切源自于生活,生活有许多原则。卖个肥皂,直接上门一家家卖会喝西北风,找个超市老板一下子就卖出去了。这就是生活。
    kenshin
        49
    kenshin  
       2016-06-07 11:59:51 +08:00
    设计模式 = 理论(所以跟语言无关),需要具体实现(所以与语言有关)。
    MVC /MVP /MVVM 这些都是设计模式。所以,一般情况下,无论你是否使用,它都在那儿。
    拿 前端开发 举个例子:即便什么都不用,只用了 jQuery ,那么你相当于用了很多 设计模式,如:组合模式;适配器模式;外观模式;观察者模式;代理模式 等等。

    设计模式是为了解决实际问题的,不要为了设计模式而设计模式。 :)

    PS :建议初学者不要接触,等以后有了语言有了自己的认识 or 项目经验后再看,会豁然开朗。尤其当你接手了一个旧项目后,利用好某些设计模式让你少走很多弯路。
    acros
        50
    acros  
       2016-06-07 12:02:52 +08:00
    不知道 DP ,代码瞎写混乱 -> 了解 DP ,到处使用(尤其是单例···) -> 稍微知道点优缺点,谨慎使用 -> 项目更大了,多种 DP 混合使用,脑袋更不上,代码又乱了 -> 再翻四人帮书 -> 发现自己似乎更不懂 DP 了····
    Mutoo
        51
    Mutoo  
       2016-06-07 12:11:57 +08:00
    「哇,原来我一直在写的东西别人都取好名字了呀」
    qqmishi
        52
    qqmishi  
       2016-06-07 12:36:58 +08:00 via Android
    我记得在哪里看过一句,在不断的重构之中抽象总结出来的就叫模式
    21grams
        53
    21grams  
       2016-06-07 12:48:54 +08:00 via Android
    为什么是 23 种
    cwlmxwb
        54
    cwlmxwb  
    OP
       2016-06-07 13:00:20 +08:00 via iPhone
    @21grams 抽象出来的吧,前人归纳的这么一些
    changwei
        55
    changwei  
       2016-06-07 13:02:51 +08:00
    框架内部已经实现了模式,我只是用框架的人而已,所以也可以认为我间接的使用了 N 种设计模式。
    cwlmxwb
        56
    cwlmxwb  
    OP
       2016-06-07 13:04:44 +08:00 via iPhone
    @changwei 要是公司要自己写框架,那么设计模式必须了解吧
    2owe
        57
    2owe  
       2016-06-07 13:36:14 +08:00
    设计模式是前人提炼出来的一套开发思想,可以带给自己思考,这是坠吼滴!

    除了 HeadFirst 系列,同事推荐郑晖的这本《冒号课堂》, https://www.amazon.cn/gp/product/B00A76JAD0/
    unoyx
        58
    unoyx  
       2016-06-07 17:55:12 +08:00
    SOLID 是最重要的,《设计模式》、《 Game Programming Patterns 》这些都是为了在项目中使用 C++、 Jave 这类语言时,为了打到提高内聚、降低耦合等目标而实行的一些具体技巧。
    zhgg0
        59
    zhgg0  
       2016-06-07 21:24:43 +08:00
    看后发现很多方法其实都用过了,遂不看
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   965 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 19:15 · PVG 03:15 · LAX 11:15 · JFK 14:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.