0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

别急着动手写代码:先想清楚这几点,后面少改八百回

工程师高培 来源:工程师高培 作者:工程师高培 2026-03-24 11:43 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

软件开发从来不是一次写完就结束的事情。需求会变,技术会升级,团队会流动。一套代码能跑多久、改起来顺不顺手、新同事接手快不快,这些往往比“第一次写出来”更重要。高质量软件设计与设计模式,谈一谈从原则到实践的几条路径,设计模式不是银弹,但理解背后的原则,能帮我们少走一些弯路。

一、什么算“高质量”的软件

很多人把“能运行”等同于“好”。其实软件质量分内外两层:外部质量是用户看到的功能正确、响应快、不崩溃;内部质量是代码可读、可维护、容易改。外部质量靠测试验证,内部质量靠设计保障。

判断内部质量有几个简单标准:新同事看代码能不能快速理解?改一个功能会不会牵连一堆地方?加新需求时是“加新代码”还是“改老代码”?如果答案不乐观,说明设计需要调整。

二、几个基础的设计原则

依赖反转:高层模块不应该依赖低层模块,两者都应该依赖抽象。比如业务逻辑层不应该直接依赖具体的数据库访问类,而是依赖一个数据访问接口。这样换数据库时,业务代码不用改。

开放-封闭:对扩展开放,对修改封闭。需求来了,尽量加新类新方法,而不是改老代码。这就要求设计时预留扩展点,比如用接口、抽象类把可变部分隔离开。

里氏替换:子类应该能替换父类,程序行为不变。如果正方形继承自矩形,而矩形的宽高可以分别修改,正方形就做不到,这种继承关系就有问题。

单一职责:一个类只做一件事。看类名就能猜出它的功能,如果描述不清或者有“和”字,很可能职责过多。拆开之后,每个模块更清晰,改其中一个不影响其他。

不要重复自己:同样的逻辑只写一次。重复不仅浪费,更是隐患——改一个地方忘了改其他地方,bug就来了。抽取公共方法、用模板方法、继承、组合,都是消除重复的手段。

三、设计模式:常见场景的解法

适配器模式:当系统需要对接一个外部接口,而接口的格式、调用方式与内部不一致时,加一层适配器做转换。比如对接第三方支付接口,每家参数不同,适配器封装差异,业务层只调用统一方法。

策略模式:一个功能有多种算法,需要动态选择。比如工资发放,正式员工、兼职员工、外包员工的计薪方式不同。策略模式把算法封装成独立的类,运行时切换,避免if-else堆砌。

工厂模式:当对象的创建过程复杂、或者需要根据配置选择不同实现时,用工厂来创建。简单工厂、工厂方法、抽象工厂,本质都是把“怎么创建”和“谁来使用”分开。

单例模式:一个类只需要一个实例,比如配置管理、线程池。实现时注意线程安全,懒加载还是饿汉,取决于场景。但单例容易隐藏耦合,用多了会让代码之间偷偷依赖,反而破坏设计。

模板方法模式:父类定义算法骨架,子类实现具体步骤。比如数据导出,流程是:查数据、转格式、写文件。父类写好流程,子类实现“怎么查”“转成什么格式”,既复用代码又留出变化点。

装饰者模式:不修改原类,动态给对象添加功能。比如数据源读写,业务增长后需要加缓存、加日志、加读写分离。装饰者一层层包上去,每个功能独立,需要哪些组合哪些。

四、重构:让代码慢慢变好

软件退化是常态。需求不断加,改的人换了一茬又一茬,代码慢慢就乱了。重构不是推翻重来,是小步快跑,每次改一点,始终让系统处于可运行状态。

常用的重构手法:抽方法解决大函数,抽类解决大对象,抽父类提高复用,用设计模式降低耦合,建立分层结构。关键是每一步都要验证,不能积累到受不了再动手。

五、小步快跑:降低风险的方式

很多项目不敢改设计,是因为担心改坏了。小步快跑的思路是:每次只做一小步,每一步都有明确的目标和验证方法,确保当前版本比上一版本更好。

比如加一个新需求,先写测试,再改代码;或者先重构让代码易于扩展,再写新功能。两种做法交替,既能推进功能,又能改善结构。这和先设计后编码并不矛盾,只是把设计分成了多次迭代。

六、防止软件退化的几个习惯

一是写清楚注释,不仅写“做了什么”,更要写“为什么这么做”。二是保持代码整洁,发现“坏味道”就顺手改一下,不要等到积重难返。三是团队统一编码规范,减少理解成本。四是定期进行代码评审,不仅找bug,也看设计是否合理。

软件设计不是一次性的艺术,而是持续演进的过程。工程师高培认为设计模式是工具箱里的工具,原则是选工具的准则,重构是保持工具箱整洁的方法。三者结合,才能让代码在变化中保持优雅。

wKgZPGnCCCyAUkEDAAF3YCkztlU630.png

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 代码
    +关注

    关注

    30

    文章

    4985

    浏览量

    74631
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    【米尔全志T153开发板评测】手写数字识别

    【米尔全志T153开发板评测】手写数字识别 本文介绍了米尔全志 T153 开发板结合 MNIST 数据集和 ONNX 模型实现手写数字识别的项目设计,包括准备工作、环境搭建、MNIST 数据集
    发表于 05-19 20:53

    零基础手写大模型资料2026

    零基础纯代码手写大模型:从数学原理到工程实践的技术解析 在深度学习框架高度封装的今天,理解大模型底层原理的开发者愈发稀缺。本文将剥离复杂框架的依赖,从数学基础出发,解析如何用基础代码实现一个具备
    发表于 05-01 17:44

    UPS电源的质保是只保主机还是保电池?别被误导,弄清这几点不吃亏

    ,UPS电源的质保究竟只保主机,还是连同电池一起保?今天我们就来把这件事彻底说清楚。主机与电池,质保待遇为何不一样?首先要明确一个基本概念:UPS电源由两大部分组
    的头像 发表于 04-23 09:54 248次阅读
    UPS电源的质保是只保主机还是保电池?别被误导,弄清<b class='flag-5'>这几点</b>不吃亏

    新能源充电桩4G插卡模块怎么选?认准这几点不踩坑

    随着新能源汽车普及,充电桩部署范围不断扩大,4G插卡模块(工业4G路由器)作为充电桩联网核心,直接决定设备稳定性、运维效率和用户体验,选型不当易出现断网、数据丢失、运维繁琐等问题,掌握这几个核心
    的头像 发表于 03-11 14:01 286次阅读
    新能源充电桩4G插卡模块怎么选?认准<b class='flag-5'>这几点</b>不踩坑

    苹果原装无线充电器发热怎么回事

    你的iPhone在无线充电板上“暖手”,是不是总让你心里一紧,担心电池健康或安全问题?先别急着焦虑,这种轻度至中度的发热,其实是无线充电技术原理下的“正常现象”。
    的头像 发表于 02-09 08:15 763次阅读
    苹果原装无线充电器发热怎么回事

    【正点原子STM32N647开发板试用】--手写识别

    本篇讲述触摸屏手写识别数字及大小写字母。一.实现原理 触摸显示屏在有触摸时显示并记录触摸轨迹,触摸松开后,进行手写识别。 二.代码准备 1.屏显功能 RGB屏显示功能资源文件在Drivers
    发表于 02-01 18:26

    别再迷糊了!Linux交叉编译到底是个啥?一文讲清楚

    很多工程师第一次听到“交叉编译”这4个字时,脑袋里往往会冒出两个字: 抽象 。 明明写代码写得好好的,为啥还要搞一个“交叉”?编译不就是把源代码变成可执行程序吗,难道还会绕几个弯? 别急,今天我们
    的头像 发表于 12-03 16:28 1435次阅读
    别再迷糊了!Linux交叉编译到底是个啥?一文讲<b class='flag-5'>清楚</b>

    如何选择靠谱的在线式充电机?广州邮科这几点值得关注!

    各位机房运维的朋友,是不是经常为蓄电池维护发愁?每次都要等到深夜断电操作,既影响业务又折腾人。别急,今天咱们就来聊聊在线式充电机这个"运维神器",并以行业老牌广州邮科的产品为例,说说选购时需要注意哪些要点。
    的头像 发表于 11-11 10:16 343次阅读
    如何选择靠谱的在线式充电机?广州邮科<b class='flag-5'>这几点</b>值得关注!

    代码开发云平台是什么?零编程零成本搭建

    联网云平台作为连接物理设备与数字世界的核心枢纽,其功能设计围绕设备管理、数据流转、应用开发、业务赋能四大维度展开。 一、核心能力 低代码/零代码:通过可视化拖拽组件、预置模板、图形化逻辑编排代替手写
    的头像 发表于 07-31 15:25 968次阅读

    用过天硕工业级SSD固态硬盘后,这几点让我很安心

    以下几点让我安心。 1. 宽温适应性出色 G40支持-40℃至85℃宽温工作,设备在零下40℃的极寒环境下也能顺利冷启动,夏季高温时长时间运行也没有降速或死机。 2. 性能稳定 G40顺序读取速度达3600MB/s,写入速度2600MB/s,支持4TB容量,即便是高频读写环境,
    的头像 发表于 07-09 17:53 1009次阅读

    基于LockAI视觉识别模块:手写数字识别

    手写数字识别是一种经典的模式识别和图像处理问题,旨在通过计算机自动识别用户手写的数字。 本文将教会你如何使用基于RV1106的 LockAI视觉识别模块进行手写数字识别。 源代码:ht
    发表于 06-30 16:45

    基于LockAI视觉识别模块:手写数字识别

    手写数字识别是一种经典的模式识别和图像处理问题,旨在通过计算机自动识别用户手写的数字。本文将教会你如何使用基于RV1106的LockAI视觉识别模块进行手写数字识别。
    的头像 发表于 06-30 15:44 1367次阅读
    基于LockAI视觉识别模块:<b class='flag-5'>手写</b>数字识别

    stm32N657上部署cubeAI生成代码,编译出错的原因?怎么解决?

    你好,要怎么在stm32N657上部署cubeAI生成代码呢,编译出错,我使用cubeAI生成的手写数字模型的代码,编译报错 要怎么配置呢,我看其他AI demo都是分了两个文件,这里要怎么烧录进去使用呢?
    发表于 06-20 06:31

    【高云GW5AT-LV60 开发套件试用体验】基于开发板进行深度学习实践,并尽量实现皮肤病理图片的识别

    一些,还容易转换为verilog在fpga上面实现,后者也试了一下,但是还没有转换为verilog代码。不过听说有个工具HLS,最近也没怎么用过,后面有时间的话再折腾。 先上相关的python代码
    发表于 06-11 22:35

    【经验分享】玩转FPGA串口通信:从“幻觉调试”到代码解析

    FPGA开发,思路先行!玩FPGA板子,读代码是基本功!尤其对从C语言转战FPGA的“宝贝们”来说,适应流水线(pipeline)编程可能需要点时间。上篇点灯代码解读了基础,而如果能亲手写出串口通讯
    的头像 发表于 06-05 08:05 1322次阅读
    【经验分享】玩转FPGA串口通信:从“幻觉调试”到<b class='flag-5'>代码</b>解析