通用编程思想(写好代码的核心原则)笔记

核心定位

本笔记完全剥离 Java、Python、JavaScript 等语言的语法细节,聚焦跨语言通用的编程内功。如果把编程语言比作不同门派的招式,这些原则就是所有门派通用的内功心法 —— 内功通透,换招式只需简单适配,就能实现一通百通,完成从「能写代码」到「能写好代码」的核心跃迁。


第一部分 核心认知:写好代码的前提

1.1 写好代码的通用核心目标

我们可以把写代码比作建一套可长期居住、可改造、可多人共用的房子,5 大核心目标对应房子的核心属性,瞬间理解抽象概念:

核心目标本质定义生活化类比核心价值
可维护性代码逻辑清晰、结构合理,后续修改迭代成本低,他人能快速理解房子的水电管线走明线、标清楚走向,维修换件不用砸墙拆地板降低长期维护成本,避免「接手代码就想重写」
可扩展性新增功能无需大规模修改原有代码,符合「扩展开放、修改关闭」房子预留了插座、管道接口,加空调、净水器不用重新凿墙布线迭代效率翻倍,避免「加一个功能,改半个系统」
可读性命名规范、注释清晰、结构规整,无需逐行调试就能看懂代码意图房子户型图清晰,每个房间的功能一目了然,谁来都知道厨房在哪、卧室在哪降低团队协作成本,自己 3 个月后回头看也不会忘
鲁棒性能处理异常场景、非法输入,避免程序崩溃,运行稳定房子有抗震、防水、漏电保护,极端天气、违规操作也不会塌减少线上故障,提升系统稳定性
可复用性避免重复代码,通用逻辑、工具方法可重复调用,减少冗余房子用标准件门窗、螺丝,坏了直接换通用款,不用单独定制减少重复编码,一处修改全量生效,降低 bug 率

1.2 通用编程思想的核心价值

  1. 跨语言适配:思想是内功,语法是外衣。就像学会了开车的核心逻辑(交规、安全驾驶、油门刹车控制),换手动挡、自动挡、电车,只需熟悉操作细节,不用重新学开车。掌握通用思想,切换编程语言只需适配语法,无需重新学习核心逻辑。
  2. 提升开发效率:减少重复编码、调试时间,降低后续维护成本,尤其适配团队协作场景 —— 所有人遵循同一套心法,代码风格、结构统一,协作成本指数级下降。
  3. 规避常见 bug:80% 的线上 bug,都来自重复代码、高耦合、逻辑混乱、随意修改老代码。遵循通用原则,能从源头规避这些问题,减少逻辑漏洞。

1.3 写好代码的底层逻辑(跨语言完全一致)

  • 核心逻辑:用最简单、清晰的方式实现需求,拒绝「炫技式编码」,优先保证代码的实用性与可维护性。写代码不是杂技表演,不是弯道越多越厉害,而是修一条直达目的地的直路 —— 路越直、越宽,越不容易出事故,走的人也越轻松。
  • 核心关联:通用编程思想是基础语法、OOP、数据结构、算法思想的「落地准则」。语法是砖头,数据结构是钢筋,算法是承重设计,编程思想就是建筑规范 —— 没有规范,再好的材料也能盖出危楼。
  • 新手必避误区:写好代码≠复杂代码。新手最容易陷入「代码越复杂、越晦涩,水平越高」的误区,实际上,简洁、清晰、符合原则的代码,才是真正的优质代码。

第二部分 核心通用编程原则(重中之重)

这些原则是所有语言写好代码的「黄金准则」,贯穿编码全流程,与语言无关,是通用编程思想的核心。

2.1 DRY 原则(Don't Repeat Yourself)—— 拒绝重复代码

核心本质

一处修改,处处生效,相同的逻辑、相同的操作,必须统一封装复用,杜绝复制粘贴。

生活化类比

就像奶茶店的配方,所有门店都用总部统一的配方表,而不是每个门店自己抄一份。改糖度的时候,总部改一次,所有门店同步生效,不用挨个门店修改,避免出现「有的改了、有的没改,口味全乱了」的问题。

通用核心逻辑

重复代码是万恶之源:

  1. 维护成本爆炸:修改一个逻辑,要改所有重复的位置,极易遗漏;
  2. bug 率飙升:一处有 bug,所有重复位置都有 bug,修复难度翻倍;
  3. 可读性下降:大量重复代码,让文件变得冗长,核心逻辑被淹没。
通用落地方法
  1. 重复逻辑封装为函数 / 方法 / 工具类,供多处调用;
  2. 通用配置、固定数值 / 字符串统一定义为常量,避免硬编码;
  3. 相似逻辑提取共性,抽象为通用模块(如不同接口的参数校验,封装为通用校验方法)。
通用代码示例(伪代码,无语言限制)

反例(违反 DRY 原则)

plaintext

// 计算3个订单的折扣总价,逻辑完全重复,复制粘贴实现
总价A = 商品单价A * 数量A * 0.8
打印(总价A)

总价B = 商品单价B * 数量B * 0.8
打印(总价B)

总价C = 商品单价C * 数量C * 0.8
打印(总价C)

正例(符合 DRY 原则)

plaintext

// 1. 统一定义折扣常量,一处修改全量生效
固定折扣 = 0.8

// 2. 封装通用计算函数,复用核心逻辑
函数 计算折扣总价(商品单价, 购买数量):
    总价 = 商品单价 * 购买数量 * 固定折扣
    返回 总价

// 3. 调用无重复逻辑,新增订单只需加一行调用代码
打印(计算折扣总价(单价A, 数量A))
打印(计算折扣总价(单价B, 数量B))
打印(计算折扣总价(单价C, 数量C))
新手必避误区

为了「复用」强行封装,把完全不相关的逻辑硬塞到一个函数里,导致函数变成「万能杂货铺」。比如把「计算折扣」和「计算运费」塞到一个函数里,看似复用了,实则逻辑混乱,修改折扣逻辑可能影响运费计算,反而牺牲了可读性和可维护性。

通用准则:逻辑重复出现 3 次及以上,再考虑封装;1-2 次重复,无需强行封装。

2.2 高内聚、低耦合原则 —— 代码结构的核心准则

核心定义
  • 高内聚:一个模块 / 类 / 函数,只负责一个核心功能,内部逻辑紧密关联,职责单一,不做无关的事;
  • 低耦合:模块与模块、类与类、函数与函数之间的依赖尽可能少,仅通过规范的接口交互,不直接操作对方的内部细节。
生活化类比

把程序比作一家规范运营的公司:

  • 高内聚 = 每个部门只干一个核心活:人事部只负责人力招聘、考勤,财务部只负责算账发工资,不会出现「人事部既招人又做账」的情况,职责清晰,谁出问题找谁;
  • 低耦合 = 部门之间只通过正式的邮件、会议对接,不会出现「财务部的人直接跑到人事部的电脑里改考勤数据」的情况。人事部换了考勤系统,只要「给财务部发考勤数据」的接口不变,财务部完全不用改自己的流程。
通用核心逻辑
  • 高内聚:让代码职责清晰,问题定位精准,修改只影响当前模块,不会牵一发而动全身;
  • 低耦合:减少模块间的相互影响,一个模块修改、重构,不会导致依赖它的模块集体崩溃,便于扩展和维护。
通用落地方法
  1. 按功能拆分模块 / 类 / 函数,避免「大而全」的万能模块(比如一个类既处理数据,又处理界面,还处理网络请求);
  2. 模块间通过公共接口交互,不直接访问对方的私有成员、内部逻辑;
  3. 减少全局变量、全局状态的使用,避免模块间通过全局变量隐性耦合。
通用代码示例(伪代码,无语言限制)

反例(低内聚、高耦合)

plaintext

// 全局变量,所有模块都能修改,耦合爆炸
全局变量 当前登录用户 = 空

// 一个函数干了3件事:数据库操作、密码校验、状态管理,低内聚
函数 登录(用户名, 密码):
    // 直接操作数据库内部细节,和数据库层强耦合
    数据库连接 = 新建数据库连接()
    用户数据 = 数据库连接.查询("select * from 用户 where 用户名=?", 用户名)
    
    如果 用户数据.密码 == 密码:
        // 直接修改全局变量,和所有使用该变量的模块强耦合
        当前登录用户 = 用户数据
        返回 登录成功
    否则:
        返回 登录失败

问题:以后换数据库,要改登录函数;以后改用户状态存储方式,要改登录函数;改密码校验规则,还要改登录函数。一处修改,全链路受影响,极易出 bug。

正例(高内聚、低耦合)

plaintext

// 1. 独立的数据库访问模块:只干「用户数据查询」这一件事,高内聚
模块 用户数据库:
    函数 查询用户信息(用户名):
        数据库连接 = 新建数据库连接()
        返回 数据库连接.查询("select * from 用户 where 用户名=?", 用户名)
    // 只暴露查询接口,不暴露数据库连接细节

// 2. 独立的用户状态管理模块:只干「用户状态管理」这一件事,高内聚
模块 用户状态管理:
    私有变量 当前用户 = 空
    // 只暴露规范接口,不允许外部直接修改内部变量
    函数 设置当前登录用户(用户信息):
        当前用户 = 用户信息
    函数 获取当前登录用户():
        返回 当前用户

// 3. 登录业务模块:只干「登录逻辑校验」这一件事,高内聚
模块 登录业务:
    // 只依赖其他模块的接口,不依赖内部实现,低耦合
    函数 执行登录(用户名, 密码):
        用户数据 = 用户数据库.查询用户信息(用户名)
        如果 用户数据.密码 == 密码:
            用户状态管理.设置当前登录用户(用户数据)
            返回 登录成功
        否则:
            返回 登录失败

优势:以后换数据库,只改「用户数据库」模块,其他模块完全不用动;以后换状态存储方式,只改「用户状态管理」模块,其他模块完全不用动。模块之间互不干扰,修改、扩展零风险。

新手必避误区

把「低耦合」理解成「零耦合」,过度拆分模块。比如把一个简单的登录功能拆成 10 个模块,导致读代码要翻十几个文件,对接成本比干活成本还高。

正确认知:完全零耦合的代码是不存在的,模块之间必须有交互才有意义。我们要做的是「合理耦合」—— 只保留必要的依赖,依赖接口而非具体实现,而不是完全消除依赖。

2.3 模块化原则 —— 拆分功能,各司其职

核心本质

分而治之,把复杂的完整程序,拆分为多个独立的小模块,每个模块负责一个具体的功能,模块内部高内聚,模块之间低耦合。

生活化类比

就像搭乐高城堡,你不会一次性把整个城堡拼完,而是先拼城墙、塔楼、城门、内饰这些独立的模块,每个模块拼好之后,再按标准接口拼在一起。哪个模块拼错了,直接拆下来重拼,不用把整个城堡全拆了;想加个炮台,直接新拼一个炮台模块装上去就行,不用改原来的城堡。

通用核心逻辑

人类处理复杂问题的能力是有限的,把一个大的复杂问题,拆成多个小的、可独立解决的简单问题,就能大幅降低开发、调试、维护的难度,同时支持多人并行开发,每个人负责一个模块,互不干扰。

通用落地方法
  1. 按业务功能拆分(如用户模块、订单模块、支付模块);
  2. 按功能类型拆分(如数据处理模块、工具模块、接口请求模块);
  3. 大模块内部继续细分(如用户模块拆分为用户注册、用户登录、用户信息管理等子功能)。
与高内聚低耦合的关联

模块化是高内聚低耦合的具体落地手段,模块拆分合理,才能实现高内聚、低耦合;拆分不合理,必然会出现低内聚、高耦合的问题。

新手必避误区

拆分不按职责,按代码行数拆分。比如把一个完整的逻辑,硬拆成好几个函数,只是为了让每个函数的行数少一点,导致读代码要来回跳转,反而可读性大幅下降。就像把一篇完整的文章,按行数硬拆成好几段,每段都读不通。

2.4 开闭原则(Open/Closed Principle)—— 便于扩展,拒绝修改

核心定义

对扩展开放,对修改关闭

  • 对扩展开放:新增功能时,可通过新增代码实现,无需改动原有逻辑;
  • 对修改关闭:新增功能时,不能修改原有已经测试通过、稳定运行的代码。
生活化类比

就像手机的 Type-C 接口,完美符合开闭原则:

  • 对扩展开放:你可以接充电器、充电宝、耳机、U 盘、显示器,只要符合 Type-C 的接口规范,都能直接用,不用改手机本身的充电口;
  • 对修改关闭:手机出厂之后,充电口的规格就固定了,不会随便修改,一改所有配件都用不了了。
通用核心逻辑

原有稳定运行的代码,每修改一次,就有引入新 bug 的风险,甚至可能出现「改一个 bug,出十个新 bug」的情况。开闭原则的核心,就是通过扩展实现新功能,最大限度保证原有代码的稳定性,降低迭代带来的风险。

通用落地方法
  1. 依赖抽象(如接口、抽象类),而非具体实现,新增功能时,实现新的抽象子类 / 接口即可;
  2. 避免硬编码的 if-else 分支判断,通过多态、策略模式实现扩展;
  3. 核心稳定逻辑封装为不可修改的基础模块,扩展功能通过新增模块实现。
通用代码示例(伪代码,无语言限制)

反例(违反开闭原则)

plaintext

// 支付逻辑,每次加新的支付方式,都要修改这个函数,改动老代码
函数 执行支付(支付方式, 支付金额):
    如果 支付方式 == "微信支付":
        调用微信支付接口(支付金额)
    否则如果 支付方式 == "支付宝支付":
        调用支付宝支付接口(支付金额)
    // 新增银行卡支付,必须修改这里的代码,加else if
    否则如果 支付方式 == "银行卡支付":
        调用银行卡支付接口(支付金额)
    否则:
        返回 支付方式不支持

问题:每次新增支付方式,都要修改核心的支付函数,可能把原本正常的微信、支付宝支付改出 bug,函数会越来越长,维护成本越来越高。

正例(符合开闭原则)

plaintext

// 1. 定义抽象的支付接口规范(相当于Type-C接口标准)
接口 支付处理器:
    函数 执行支付(支付金额)

// 2. 不同支付方式,实现这个接口;新增支付方式,只加新代码,不改老代码
类 微信支付处理器 实现 支付处理器:
    函数 执行支付(支付金额):
        调用微信支付接口(支付金额)

类 支付宝支付处理器 实现 支付处理器:
    函数 执行支付(支付金额):
        调用支付宝支付接口(支付金额)

// 新增银行卡支付,只需要新增一个类,完全不用改原有代码
类 银行卡支付处理器 实现 支付处理器:
    函数 执行支付(支付金额):
        调用银行卡支付接口(支付金额)

// 3. 统一的支付执行逻辑,只依赖抽象接口,永远不用修改
函数 发起支付(支付处理器, 支付金额):
    支付处理器.执行支付(支付金额)

// 调用示例
发起支付(微信支付处理器(), 100)
发起支付(支付宝支付处理器(), 200)
发起支付(银行卡支付处理器(), 300)

优势:新增任何支付方式,都只需要新增一个实现了支付接口的类,完全不用修改原有稳定的代码,老功能不受影响,新功能零风险接入。

新手必避误区

把开闭原则理解成「任何代码都绝对不能改」。开闭原则的前提是「原有正确的、稳定的代码」,如果原有代码有 bug,必须修改;如果原有设计不合理,必须重构。不要为了遵守开闭原则,在烂代码上堆更多烂代码,最终变成无法维护的屎山。

2.5 补充通用原则(延伸扩展,提升代码质量)

原则名称核心本质生活化类比新手必避误区
单一职责原则一个类 / 函数,只有一个发生变化的原因,只承担一个职责(高内聚的延伸)一把螺丝刀只负责拧螺丝,不能既当螺丝刀又当锤子,出问题能精准定位把多个不相关的职责塞到一个类 / 函数里,比如一个用户类既管用户信息,又管订单查询,改一个功能影响另一个
最小惊讶原则代码的行为符合开发者的直觉,命名、逻辑、操作方式不反常识家里的开关按下去是开,抬起来是关,所有人都默认这个规则,反过来设计一定会让人惊讶、出错为了炫技写反常识的代码,比如命名为「删除用户」的函数,实际还会修改订单状态,让使用者踩坑
接口隔离原则不强制类 / 模块实现不需要的接口,拆分粗粒度接口为细粒度专用接口,减少冗余依赖餐厅菜单要拆分素食、荤食、饮品,不能给素食者一本全是肉菜的菜单,强迫他必须看不需要的内容把所有功能塞到一个大接口里,导致实现类必须写一堆空的、没用的方法,接口一变所有实现类都要改
依赖倒置原则高层模块不依赖低层模块,二者都依赖抽象;抽象不依赖具体实现,具体实现依赖抽象(面向接口编程)电脑主板依赖 PCIe、DDR4 这些接口标准,而不是具体的显卡、内存条品牌,符合标准的配件都能直接用,换配件不用换主板业务代码直接依赖具体实现,比如写死用 MySQL 数据库,以后换数据库,整个业务代码全要重写
简洁性原则如无必要,勿增实体,用最简单的逻辑实现需求,拒绝冗余代码、复杂嵌套解数学题,最优解是步骤最少、逻辑最清晰的,而不是绕八圈的复杂解法,步骤越多出错概率越高把「代码越少越好」等同于「简洁」,比如把十几行逻辑塞到一行里,看似代码少了,实则可读性为 0,调试难度极大

第三部分 通用编程思想的落地实践(跨语言适配)

核心:将上述原则落地到实际编码中,所有方法与具体语言无关,适配所有主流编程语言。

3.1 编码层面的落地实践

命名规范(通用铁律)
  • 核心要求:见名知意,遵循统一风格(驼峰式 / 下划线式),拒绝模糊命名。
  • 类比:给文件起名叫「2024 年工作总结.doc」,谁都知道内容是什么;叫「新建文档 1.doc」,过一个月自己都忘了内容。
  • 通用规则:
    1. 不用单字母命名(循环变量 i、j 等极简场景除外);
    2. 不用拼音、无意义缩写、中英文混合命名;
    3. 函数名用动宾结构,体现「做什么」(如 calculateDiscountTotalPrice,而非 deal、js);
    4. 变量名体现「是什么」(如 userName,而非 a、temp、data);
    5. 全程命名一致,同一个概念用同一个词(如用户全程叫 user,不要一会叫 usr、一会叫 customer)。
注释规范(通用铁律)
  • 核心要求:注释「为什么」,而不是「是什么」
  • 类比:地图的注释是「这段路施工,绕行」,而不是「这是一条路」—— 代码本身已经能说明「是什么」,注释要补充代码无法表达的信息。
  • 通用规则:
    1. 必须加注释:接口定义、复杂逻辑、边界处理、特殊兼容、坑点提醒;
    2. 禁止加注释:废话注释(如// 给a赋值1 对应 a=1)、错误注释(代码改了注释没改,比没注释还坑)、注释掉的废代码(用 Git 保存历史,不要留在代码里);
    3. 注释要简洁清晰,不冗余、不误导。
逻辑结构(通用铁律)
  1. 避免深层嵌套:if-else、循环嵌套不超过 3 层,用「卫语句 / 提前返回」扁平化优化。反例(深层嵌套)

    plaintext

    函数 计算用户折扣(用户等级, 消费金额):
        如果 用户等级 == 会员:
            如果 消费金额 > 1000:
                如果 是生日当月:
                    返回 0.7
                否则:
                    返回 0.8
            否则:
                返回 0.9
        否则:
            返回 1.0
    
    正例(卫语句优化,无嵌套)

    plaintext

    函数 计算用户折扣(用户等级, 消费金额):
        // 提前返回,消除嵌套
        如果 用户等级 != 会员:
            返回 1.0
        如果 消费金额 <= 1000:
            返回 0.9
        如果 是生日当月:
            返回 0.7
        返回 0.8
    
  2. 函数设计:单个函数只负责一个功能,代码行数通用建议不超过 50 行,超过则考虑拆分。
  3. 避免硬编码:所有固定数值、字符串、配置,统一定义为常量,不要直接写在代码里(如折扣率、超时时间、文件路径)。

3.2 模块与类设计的落地实践

  1. 模块拆分:按职责拆分,而非按文件类型拆分。比如不要把所有 HTML、JS、CSS 分别放在三个文件夹,而是按用户模块、订单模块拆分,每个模块包含自己的相关文件,改一个功能只需要进对应的模块文件夹。
  2. 类设计:遵循封装特性,属性私有化,只暴露必要的公共接口,不允许外部直接操作内部属性。就像汽车只给你方向盘、油门、刹车,不会把发动机内部零件暴露给你,你不用管发动机怎么转,只需要踩油门就行。
  3. 函数设计:分离工具函数与业务函数。工具函数是通用的、无业务逻辑的(如日期格式化、数据加密),可跨项目复用;业务函数和当前项目业务绑定(如计算订单佣金),只处理业务逻辑。二者分离,提升复用性,避免业务逻辑污染通用工具。

3.3 与其他通用知识点的结合落地

  1. 与 OOP 结合:用封装实现高内聚、隐藏内部细节;用继承实现可复用性、复用通用逻辑;用多态实现开闭原则、支持灵活扩展。
  2. 与数据结构结合:选择合适的数据结构简化逻辑、提升效率。比如快速查找用哈希表,不用数组循环遍历;先进先出用队列,不用数组自己写移位,避免重复造轮子,符合 DRY 原则。
  3. 与算法思想结合:用合理的算法避免冗余计算。比如有序数组查找用二分查找(O (logn)),不用全量遍历(O (n));用动态规划解决重复子问题,符合 DRY 原则。
  4. 与工程化结合:用 Git 做版本控制,每次修改只改一个功能,便于回滚;用单元测试保证每个模块功能正确,改代码有保障;用代码检查工具自动校验规范,辅助落实原则。

3.4 不同场景的通用落地技巧

  • 小型项目 / 工具开发:优先保证简洁性、可读性,无需过度设计。重点落实 DRY 原则、命名规范,不要为了符合开闭原则,给几百行的小工具加十几层接口,过度设计反而增加成本。
  • 中大型项目 / 团队协作:重点落实高内聚低耦合、模块化、开闭原则。统一编码规范、接口设计标准,避免每个人的代码风格完全不同,最终变成无法维护的大杂烩。
  • 高频迭代项目:重点落实开闭原则。每次新增功能用新增代码实现,不随意修改原有稳定代码,最大限度降低迭代带来的风险,减少测试成本。

第四部分 常见误区与避坑指南(通用)

4.1 原则理解误区

  1. 误区 1:过度追求复用,强行封装
    • 错误本质:把复用当成目的,而非手段,忽略了复用的前提是不牺牲可读性和清晰性。
    • 正确做法:逻辑重复出现 3 次及以上,再考虑封装;1-2 次重复,无需强行封装,避免为了复用写出「万能杂货铺」式的函数。
  2. 误区 2:低耦合 = 零耦合
    • 错误本质:认为模块之间完全没有依赖才是最好的,忽略了模块必须有交互才有意义。
    • 正确做法:追求「合理耦合」,只保留必要的依赖,依赖接口而非具体实现,而不是完全消除依赖。
  3. 误区 3:开闭原则 = 绝对不能改老代码
    • 错误本质:把开闭原则绝对化,哪怕老代码有 bug、设计不合理也不改,在烂代码上堆更多烂代码。
    • 正确做法:新增功能尽量用新增代码实现,bug 必须修改,设计不合理的要及时重构,开闭原则不禁止合理的修改和重构。
  4. 误区 4:简洁 = 代码越少越好
    • 错误本质:把代码行数当成简洁的标准,忽略了可读性和可维护性。
    • 正确做法:简洁是逻辑简洁,没有冗余,没有不必要的复杂操作。哪怕多写两行,只要逻辑清晰、好读好调试,就是简洁的代码;一行式的炫技代码,再短也是垃圾代码。

4.2 实践层面误区

  1. 命名误区:模糊命名、拼音命名、缩写命名、不一致命名。危害:别人看不懂,自己过段时间也看不懂,维护成本极高。
  2. 注释误区:废话注释、错误注释、保留注释掉的废代码。危害:错误注释比没注释还坑,废代码让代码变得脏乱差。
  3. 结构误区:深层嵌套、大而全的函数 / 模块。危害:逻辑分支太多,读不懂、调不通,改一个地方影响全链路。
  4. 耦合误区:直接访问私有成员、滥用全局变量、硬编码依赖具体实现。危害:模块之间绑定死了,改一个模块,所有依赖它的模块全要改,无法扩展。

4.3 通用避坑技巧

  1. 先设计,后编码:编码前先画模块图、流程图,明确每个模块、函数的职责、接口、输入输出,想清楚了再动手,不要上来就写代码,写一半发现设计错了全删重写。
  2. 编码后自查:写完代码自己先读一遍,对照核心原则检查:有没有重复代码?有没有深层嵌套?命名是否见名知意?自己读不懂的代码,别人肯定也读不懂。
  3. 借鉴优秀开源项目:看成熟开源项目的代码,学习人家的模块设计、命名规范、代码结构,比自己瞎琢磨提升快得多。
  4. 统一团队规范:团队协作前,先定好统一的编码规范、命名规范、模块拆分规则,所有人按同一套标准写代码,避免代码风格混乱。

第五部分 补充内容(跨语言适配与延伸)

5.1 主流语言的原则落地差异(核心一致,仅细节不同)

所有通用原则的核心逻辑,在所有编程语言中完全一致,仅语法实现、工具适配有差异:

  1. 语法差异
    • 函数封装:Python 用 def、Java 用类方法、JavaScript 用 function,语法不同,但封装复用的逻辑完全一致;
    • 接口抽象:Java 有 interface 关键字、C++ 有纯虚函数、Python/JavaScript 用鸭子类型,语法不同,但依赖抽象、开闭原则的落地逻辑完全一致;
    • 模块化:Java 用 package、Python 用 module、JavaScript 用 import/export,语法不同,但模块化拆分的逻辑完全一致。
  2. 工具适配:Java 用 CheckStyle、Python 用 Pylint、JavaScript 用 ESLint,工具不同,但核心目的都是辅助落实编码规范、检查重复代码、校验代码质量,完全服务于通用原则。
  3. 跨语言示例对照(DRY 原则)

    java

    // Java 实现DRY,核心逻辑:常量统一定义+逻辑封装
    public static final double DISCOUNT = 0.8;
    public static double calculateDiscountTotal(double price, int count) {
        return price * count * DISCOUNT;
    }
    

    python

    # Python 实现DRY,核心逻辑和Java完全一致,仅语法不同
    DISCOUNT = 0.8
    def calculate_discount_total(price, count):
        return price * count * DISCOUNT
    

    javascript

    // JavaScript 实现DRY,核心逻辑完全一致,仅语法不同
    const DISCOUNT = 0.8;
    function calculateDiscountTotal(price, count) {
        return price * count * DISCOUNT;
    }
    

5.2 通用编程思想的进阶提升

  1. 设计模式:经典的 23 种设计模式,是通用编程原则的具体落地模板。比如工厂模式是开闭原则的落地,单例模式是单一职责的落地,策略模式是开闭原则 + 低耦合的落地。学习设计模式,就是学习怎么把通用原则用到具体场景中。
  2. 代码重构:重构的核心,就是把不符合通用原则的烂代码,优化成符合原则的优质代码。学习重构技巧,能持续优化代码质量,避免代码变成屎山。
  3. 性能优化:性能优化必须在遵循通用原则的基础上进行,不能为了性能牺牲可维护性、可读性。先保证代码可维护、可读、稳定,再优化性能,而不是本末倒置。

5.3 练习方法(通用,跨语言)

  1. 基础练习:编写通用工具函数(如日期格式化、参数校验、数组去重),刻意练习命名规范、DRY 原则、单一职责,每个函数只干一件事,无重复代码。
  2. 进阶练习:重构自己以前写的旧代码,对照原则检查问题,一步步优化成符合原则的代码,这个过程对原则的理解会指数级加深。
  3. 实战练习:在项目开发中刻意落实原则,编码前设计,编码后自查,在实际场景中锤炼内功,而不是死记硬背原则。

5.4 附录

1. 通用编程原则中英对照表
中文原则英文全称英文缩写
拒绝重复代码原则Don't Repeat YourselfDRY
开闭原则Open/Closed PrincipleOCP
单一职责原则Single Responsibility PrincipleSRP
接口隔离原则Interface Segregation PrincipleISP
依赖倒置原则Dependency Inversion PrincipleDIP
最小惊讶原则Principle of Least AstonishmentPLA
高内聚低耦合原则High Cohesion Low CouplingHCLC
2. 核心原则落地 Checklist(编码后对照检查)

□ 命名是否见名知意,无模糊命名、拼音命名、不一致命名□ 有没有重复代码,相同逻辑是否统一封装复用□ 函数 / 模块是否职责单一,只干一件事,无大而全的万能模块□ if-else / 循环嵌套是否不超过 3 层,无深层嵌套□ 有没有硬编码,常量、配置是否统一定义□ 模块之间是否只通过公共接口交互,无直接访问私有成员□ 有没有滥用全局变量,是否有合理的状态管理□ 新增功能是否通过新增代码实现,未随意修改原有稳定代码□ 注释是否清晰,无废话注释、错误注释、废代码□ 代码逻辑是否清晰,无不必要的炫技、冗余复杂逻辑

3. 经典优质代码通用逻辑特征
  • 工具类:只包含通用、无业务逻辑的工具方法,每个方法职责单一,无副作用(输入相同,输出一定相同),可跨场景复用。
  • 业务模块:按业务职责拆分,每个模块只负责一个业务领域,内部高内聚,模块之间通过标准化接口交互,低耦合。
  • 接口设计:只暴露必要的接口,隐藏内部实现细节,接口规范稳定,新增功能通过实现新接口完成,不修改原有接口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值