设计模式究竟有几个原则 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
jqknono
V2EX    程序员

设计模式究竟有几个原则

  •  1
     
  •   jqknono 2024-05-16 13:25:26 +08:00 2498 次点击
    这是一个创建于 513 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最早总结的设计模式只有 5 个, 即SOLID:

    • 单一职责原则 (Single Responsibility Principle, SRP):一个类应该只有一个引起变化的原因,即一个类应该只有一个责任。
    • 开闭原则 (Open/Closed Principle, OCP):软件实体(类、模块、函数等)应该对扩展开放,对修改关闭,即应该通过扩展来实现变化,而不是通过修改已有的代码。
    • 里氏替换原则 (Liskov Substitution Principle, LSP):子类型必须能够替换其基类型,即派生类必须能够替换其基类而不影响程序的正确性。
    • 接口隔离原则 (Interface Segregation Principle, ISP):不应该强迫客户端依赖于它们不使用的接口。应该将大接口拆分成更小的、更具体的接口,以便客户端只需知道它们需要使用的方法。
    • 依赖倒置原则 (Dependency Inversion Principle, DIP):高层模块不应该依赖于低层模块,二者都应该依赖于抽象。抽象不应该依赖于具体实现细节,具体实现细节应该依赖于抽象。

    后来增加了两个规则, 这些后加的规则相较来说更具体, 更有指导性. 我们从原则解释中可以看到SOLID描述应该怎么做, 后加的规则描述优先/最好怎么做.

    • 合成/聚合复用原则 (Composition/Aggregation Reuse Principle, CARP):应该优先使用对象组合(合成)和聚合,而不是继承来达到代码复用的目的。
    • 迪米特法则 (Law of Demeter, LoD):一个对象应该对其他对象有尽可能少的了解,即一个对象应该对其它对象的内部结构和实现细节知道得越少越好。

    除了上述提到的常见设计原则外,还有一些其他的设计原则,虽然不如前面提到的那些广为人知,但同样对软件设计和架构有重要的指导作用。 后续提出的这些规则, 有点画蛇添足, 至少我认为它们不反直觉, 不需要深入思考.

    • 最少知识原则 (Principle of Least Knowledge, PoLK):也被称为迪米特法则的扩展,主张一个对象应该尽可能少地了解其他对象的信息。这个原则的产生可以追溯到 1987 年由帕特里夏莱塞尔( Patricia Lago )和科威特伯克( Koos Visser )提出的“最少通信法则”。
    • 稳定依赖原则 (Stable Dependencies Principle, SDP):该原则认为软件设计应该确保稳定的组件不依赖于不稳定的组件,即稳定性较高的组件应该更少地依赖于稳定性较低的组件。这个原则的思想来源于对软件系统中组件之间关系的深入研究。
    • 稳定抽象原则 (Stable Abstraction Principle, SAP):与稳定依赖原则相呼应,该原则指导着将抽象性与稳定性相匹配,即稳定的组件应该是抽象的,而不稳定的组件应该是具体的。这个原则有助于确保软件系统的稳定性和灵活性。
    14 条回复    2024-05-17 17:08:05 +08:00
    yidinghe
        1
    yidinghe  
       2024-05-16 13:30:31 +08:00   1
    设计模式是什么,说白了就是一些套路。套路是会不断增加的。
    me1onsoda
        2
    me1onsoda  
       2024-05-16 13:37:28 +08:00
    唯一原则,KISS, keep it simple stupid
    iosyyy
        3
    iosyyy  
       2024-05-16 13:45:04 +08:00
    无限 你自己也可以加一条本身设计模式只是一种实用方法的总结
    zgsi
        4
    zgsi  
       2024-05-16 14:15:54 +08:00
    As long as it works
    lux182
        5
    lux182  
       2024-05-16 14:34:57 +08:00
    单一职责 理解这个就好了
    wanguorui123
        6
    wanguorui123  
       2024-05-16 15:17:07 +08:00
    关注点分离原则
    ChangJingli
        7
    ChangJingli  
       2024-05-16 16:05:05 +08:00   1
    kerwincsc
        8
    kerwincsc  
       2024-05-16 16:08:56 +08:00
    以前有很多原则, 现在只有一个: 混沌原则
    F7TsdQL45E0jmoiG
        9
    F7TsdQL45E0jmoiG  
       2024-05-16 17:05:34 +08:00
    抽象、复用
    darkengine
        10
    darkengine  
       2024-05-16 17:42:08 +08:00
    个人理解: 合成/聚合复用原则 和 迪米特法则 都是从 开闭原则 衍生出来的
    jqknono
        11
    jqknono  
    OP
       2024-05-16 20:54:33 +08:00 via Android
    @darkengine 握手,我也是同样的理解。我甚至觉得开闭原则是元原则,看上去 SLID 都有和开闭交叉的地方。
    uni
        12
    uni  
       2024-05-17 10:12:06 +08:00
    只有一个原则,那就是放弃设计模式,拥抱函数式编程(
    jqknono
        13
    jqknono  
    OP
       2024-05-17 10:17:29 +08:00
    @uni 细说
    uni
        14
    uni  
       2024-05-17 17:08:05 +08:00
    @jqknono #13 只是我个人的体会了,可以去学一下 Haskell ,然后自己在用其它语言写代码的时候多花点时间想一下自己想要的东西在 Haskell 里面要怎么写,然后就会发现设计模式的那些想法全都是在隔靴搔痒,你说的那些设计模式的精髓部分在函数式里面全都是很自然而然的写法(比如说,多用组合而不是继承,如果是一个已经习惯于函数式编程的人,根本就不知道什么是继承,自然而然就会用组合了,还有什么单一原则其实就是无副作用,这些在函数式编程里面都是非常自然的东西)
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2657 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 13:58 PVG 21:58 LAX 06:58 JFK 09:58
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86