V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jqknono
V2EX  ›  程序员

设计模式究竟有几个原则

  •  1
     
  •   jqknono · 15 天前 · 1560 次点击

    最早总结的设计模式只有 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  
       15 天前   ❤️ 1
    设计模式是什么,说白了就是一些套路。套路是会不断增加的。
    me1onsoda
        2
    me1onsoda  
       15 天前
    唯一原则,KISS, keep it simple stupid
    iosyyy
        3
    iosyyy  
       15 天前
    无限 你自己也可以加一条本身设计模式只是一种实用方法的总结
    zgsi
        4
    zgsi  
       15 天前
    As long as it works
    lux182
        5
    lux182  
       15 天前
    单一职责 理解这个就好了
    wanguorui123
        6
    wanguorui123  
       15 天前
    关注点分离原则
    kerwincsc
        8
    kerwincsc  
       15 天前
    以前有很多原则, 现在只有一个: 混沌原则
    morenacl
        9
    morenacl  
       15 天前
    抽象、复用
    darkengine
        10
    darkengine  
       15 天前
    个人理解: 合成/聚合复用原则 和 迪米特法则 都是从 开闭原则 衍生出来的
    jqknono
        11
    jqknono  
    OP
       15 天前 via Android
    @darkengine 握手,我也是同样的理解。我甚至觉得开闭原则是元原则,看上去 SLID 都有和开闭交叉的地方。
    uni
        12
    uni  
       14 天前
    只有一个原则,那就是放弃设计模式,拥抱函数式编程(
    jqknono
        13
    jqknono  
    OP
       14 天前
    @uni 细说
    uni
        14
    uni  
       14 天前
    @jqknono #13 只是我个人的体会了,可以去学一下 Haskell ,然后自己在用其它语言写代码的时候多花点时间想一下自己想要的东西在 Haskell 里面要怎么写,然后就会发现设计模式的那些想法全都是在隔靴搔痒,你说的那些设计模式的精髓部分在函数式里面全都是很自然而然的写法(比如说,多用组合而不是继承,如果是一个已经习惯于函数式编程的人,根本就不知道什么是继承,自然而然就会用组合了,还有什么单一原则其实就是无副作用,这些在函数式编程里面都是非常自然的东西)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1209 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 23:50 · PVG 07:50 · LAX 16:50 · JFK 19:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.