《在合适的地方使用设计模式》

        本文章属于专栏- 概述 - 《设计模式(极简c++版)》-CSDN博客        


        计算系统,是物理世界的一部分。各行各业的历史经验告诉我们,没有一劳永逸,一成不变的模式,而软件系统的设计模式也一样。要正确地使用一个规则,我们就需要正确地理解这个规则出现的背景,和当时要解决的问题。

        90年代,互联网还没有普及,用户量有限,机器资源有限,开发人员的培养成本高,所以通过设计模式,增加开发一致性,可扩展性和代码复用,降低开发、维护成本,是企业推崇的。而设计模式的目标是,将开发过程标准化,降低项目需要投入的开发、维护人员。基于这个背景,我们不难理解为什么一部分设计模式,以牺牲性能的代价,换取程序的扩展性。所以设计模式不是适合所有场景,一味地刻舟求剑,只会被市场抛弃。

        以现代的ToC的分布式系统为例,特别是机器成本远超人员成本的场景。一些常见的错误用法,如:

  • 使用中介模式,为了所谓的未来扩展,增加多个中介。没有组织隔离的效果,却增加数据传输的成本
  • 每次增加一个新功能,都添加一个装饰器,不仅导致代码越来越难维护,性能也越来越差,唯一的收益或许是代码“好像”很专业
  • 服务0->1阶段,将可以放在一起运行的代码逻辑,拆分到多个处理器中,导致CPU的局部性显著下降,不仅降低的程序运行性能,还增加了代码阅读成本
  • 用户流式处理时,为了还原,使用备忘录模式,将多个时刻的用户快照保存,导致超高的网络、存储成本

以上例子都是我见过的实际应用中,错误使用的例子。这些大部分都和一个固化的错误观念有关系:“有设计模式”永远比“没有设计模式好”,“面向对象”永远比“面向过程”好。

        各个业务场景不同,甚至相同业务在不同公司的开发风格也不一致,那实际应用中如何抉择呢,我的思考方法是:

  • 应用高频调用的CPU密集型逻辑,不使用影响性能的设计模式。
  • 应用低频调用的逻辑
    • 只在接口层和输出层,使用和组织隔离相关的设计模式
  • 应用低频调用的,可能频繁改动的业务链路的相关逻辑
    • 沉淀一套,个人使用得心应手的模式,最好将这套逻辑,剥离业务抽象出自己的框架。方便复用

        最后,如何在开发中,特别是项目0->1的时候,发现不用设计模式,想不到有什么明显的问题,就建议先不用,错误地使用远比不适用伤害更大。等业务发展到一定阶段,再来做语义的抽象,然后选择对应的设计模式。毕竟“过早的优化是万恶之源”。

相关推荐

  1. 合适地方使用设计模式

    2024-04-30 08:14:05       13 阅读
  2. Spring中使用设计模式

    2024-04-30 08:14:05       28 阅读
  3. 策略模式--SpringBoot中使用

    2024-04-30 08:14:05       32 阅读
  4. 策略模式springboot中使用

    2024-04-30 08:14:05       7 阅读
  5. 设计模式-策略模式-使用

    2024-04-30 08:14:05       14 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-30 08:14:05       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-30 08:14:05       20 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-30 08:14:05       20 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-30 08:14:05       20 阅读

热门阅读

  1. wow_iot模块说明

    2024-04-30 08:14:05       11 阅读
  2. Unity C#的底层原理概述

    2024-04-30 08:14:05       15 阅读
  3. 小米金融守护消费权益,共筑金融和谐新篇章

    2024-04-30 08:14:05       14 阅读
  4. Ajax 解决浏览器缓存问题原理和例子

    2024-04-30 08:14:05       12 阅读
  5. 指数分布、瑞利分布和Nakagami-m的联系

    2024-04-30 08:14:05       14 阅读
  6. 在Mac上使用国内源安装 homebrew

    2024-04-30 08:14:05       13 阅读
  7. elementUI之el-select选择器赋值为空后无法选中回显

    2024-04-30 08:14:05       10 阅读
  8. 介绍一个在数据分析中常用的函数:data.iloc[]

    2024-04-30 08:14:05       16 阅读
  9. Tomcat Bootstrap init()

    2024-04-30 08:14:05       12 阅读
  10. CAPM模型特点

    2024-04-30 08:14:05       11 阅读