编程的原则改善代码的101方法
2021-05-12 13:41:53 6 举报
AI智能生成
编程原则是改善代码质量、提高可维护性和降低错误率的关键。这些原则包括:单一职责原则,即一个函数或类只负责一项任务;开放封闭原则,即对扩展开放,对修改封闭;里氏替换原则,即子类可以替换父类而不改变程序行为;接口隔离原则,即客户端不应该依赖它不需要的接口;依赖倒置原则,即高层模块不应依赖于底层模块,两者都应该依赖于抽象;迪米特法则,即只与你的朋友交流;合成复用原则,即尽量使用组合而不是继承来实现复用;最小知识原则,即一个对象应该对其他对象有最少的了解。遵循这些原则可以提高代码的可读性、可维护性和可扩展性。
作者其他创作
大纲/内容
视角 程序员的视角
内聚性
模块要纯粹
内聚等级
巧合强度
逻辑强度
时间强度
流程强度
通信强度
信息强度
功能强度
以功能划分模块 更高内聚 更好用
耦合度
耦合登记
内容耦合
公共耦合
外部耦合
控制耦合
特征耦合
通过参数传递数据 尽量不通过方法 改变类的自身属性
正交性
彼此独立 不相互影响
可逆性
做好防腐层 防止变异扩散
代码中的坏味道
及时重构
技术负债
技术负债要及时偿还 否则会因为读取次数多而持续浪费时间
习惯 程序员的日常
程序员的三大美德
懒惰
自动化自己的工作
尽量写文档 少解释
急躁
提前想好可能出问题的点 并且提前处理
傲慢
自己的工作 自己维护
童子军军规
不能让代码比自己来之前更差 应该好一点
性能调优的箴言
先好 再说快
80%的慢速 是20%构成的
无我编程
多请教 多成长
一步一步走
一次只在一个上下文中工作
日拱一卒 功不唐捐
TMTOWTDI
简单的事情简单做 复杂的事情也能做
做法不止一个
手法 程序员的工具箱
曳光弹
先编写骨架 然后再丰满
更快的反馈 更好的聚焦 更快的调试 确保可以演示
契约式设计
确保彼此理解一致
减少相互依赖
更好的Mock数据
防御性编程
多思考 非代码的内容
例如 异常情况 移植性 健壮性
内部测试
换位思考 用户的角度 测试自己的代码
橡皮鸭调试法
程序员缺少的是一个好问题
语境
先说上下文 更好的保证沟通同频
法则 编程的反模式
布鲁克斯法则
编程 不是简单的加法 堆人数 不一定生效
康威定律
先模拟架构的正确性 然后可以修正组织
破窗效应
不好的代码 会破坏周围的好代码
熵增效应
代码会自然朝着混乱的方向发展 需要多做重构
80-10-10原则
根据数据 对症下药 找到问题点
约书亚树原则
合理命名 才能更好的沟通 好名字胜过多解释
第二系统综合征
因为自以为了解 所以开始扩散功能
重复发明车轮
多关注 车辆之外的事情 多了解现在好的技术 更好的借力
给牦牛剃毛
写代码 边记录 边写 防止跑偏的太厉害
本书导读
原则的分类
前提 编程永恒的真理
准则 编码的指导方针
思想 编程的意识形态
视角 程序员的视角
习惯 程序员的日常
手法 程序员的工具箱
法则 编程的反模式
介绍方式
@名称
@是什么
@为什么
@怎么做
@扩展
@关联信息
@出处
@相关图书
编程术语在本书中的用法
软件
编程的产物统称为 软件
代码
编程中编写的东西称为 代码
编程
编写代码这一行统称为 编程
程序员
编程的人统称为 程序员
函数
可供调用的代码 成为函数
模块
整合了函数 变量的责任单元统称为 模块
软件架构
软件的整体结构成为 软件架构
注意事项
重复只因重要
无论是代码 还是逻辑 包括哲学 都是重复因为重要 所以 每个人都不厌其烦的重复
自己思考使用的代码范例
没有代码范例 因为只考虑思想
若原则之间的主张相悖则取其平衡点
我们追求的应该是更优解 而不是最优解
前提 编程永恒的真理
编程没有银弹
编程本身具有
复杂性
编程本身是对现实世界的映射 所以复杂
同步性
编程是需要解决问题的 社会在发展 编程也需要改变
可变性
客户和软件 属于双方相互迭代的过程
不可见性
软件是对现实世界的抽象 所以会有不可见性
代码即设计文档
代码是设计文档 最后的运行 其实是产出产品
代码既然是设计文档 就应该体现 做什么,为什么,怎么做等信息
代码必然被更改
代码的书写是基于我们现有认知进行的 我们认知的迭代 必然会影响代码的迭代
准则 编码的指导方针
kiss原则
代码保持整洁
保持每个方法的干净 整洁
dry
不要重复代码 不要随意开放权限
yagni you arenot going to need it
不要为可能会用到就编写代码
代码是迭代过来的 不是设计过来的 保持合理的克制
pie program intently and expressively
意图编程 更好的强调可读性
极限则是文学编程
解释性内容和代码写到一起
整个代码都有说明
代码中包含普通代码不会有的信息 比如 为什么
slap single level abstraction principle
统一抽象级别 同一个方法 说的内容 应该在同一个抽象层次
保证代码的格式统一 提高阅读性
ocp open close principle
对修改关闭 对扩展开放
合理 屏蔽变异点
名字很重要
名字 需要能经过 环回检测 名字可以推测出 做法 做法可以推测出名字
思想 编程的意识形态
编程理论
沟通
程序员日常代码 读代码占用70% 改代码占用20% 新代码占用10% 所以 为了读代码的效率 代码的可读性应该第一位的
简洁
消除代码的复杂性 根据代码的书写 合理重构 归类
让代码看起来 简单明了 方便后续修改扩展
和沟通发生冲突 沟通应该排第一位
灵活性
写出灵活和简洁的代码 尽量屏蔽变异点的影响
效应局部化
根据业务描述 能直接定位到问题的方式
每个小的方法 都应该只负责一处业务
重复最小化
对代码进行分割 保证这个业务够小
每个方法 都应该关注自己层次的内容 而不是所有层次
所以 代码需要尽可能的层次分开 方便复用和修改
逻辑与数据一体化
代码和逻辑 应该放到一起 方便改变的时候 统一处理
同时阅读的时候 能更快的理解
对称性
应该有相同层次的抽象 很整齐 对称
声明式表达
更好的表达意图 表达自己做什么 而不是怎么做
更稳定 也更能屏蔽细节
变动率
同一个模块 应该只有一个修改理由 所以尽可能的把相同变化频率的内容放到一起 方便统一管理
例如 国家税收和业务提成
软件架构基本技法
抽象
抽象是为了通用 因为主题一致 细节不同 抽象才能更好的适用不同的场景
封装
封装 是为了把数据和方法放到一起 更好的管理
可读性高 因为都是有关系的才在一起
修改方便 因为数据和逻辑在一起
高内聚 更好的重复使用
信息隐藏
把不相关的信息 不暴露 更好的管理数据
封装是为了 打包 放到一起
信息隐藏 是为了好管 组织外部去直接访问
打包
打包和封装一样 封装是封装数据和逻辑
打包是打包对应的模块 相关类的模块放到一起
关注点分离
根据变异点 提取进行抽象处理 屏蔽对主类的影响
充足性,完整性,原始性
指模块 要满足 充足性 也就是说 符合模块自己的功能定位
完整性 是指模块的功能 相对自洽 能够完成最小闭环
原始性 是指模块的功能 很原始 没有业务的定制化
策略和实现的分离
策略 指调度逻辑 也就是指挥逻辑 根据情况的不一样 经常会变动
实现逻辑 指独立干活的逻辑 相对独立 不受约束
接口和实现的分离
接口定义了 用户可以使用的权限
实现 实现了接口 用户不可以自己访问实现部分
单一引用点
一个变量 只赋值一次 减少因为赋值混乱造成的bug
引用透明性 调用结果只依赖于参数,调用不影响其他功能的运行 纯函数的调用
分治
大问题处理不了,先分解 不断的分解到 自己能处理的程度
软件架构的非功能需求
易变性
可维护
可扩展
重组
可移植性
互操作性
使用 约定的方式 进行交互.
效率性
时间效率 更快的响应
资源效应 更合理的利用资源
可靠性
容错 兼容错误情况 重新恢复
健壮性 对于非法情况 进行抵抗 恢复使用
可测试性
有效 高效的测试,测试质量 就是产品质量
可复用性
以组件方式 开发 开发公用组件和调度器
以模块方式进行开发 开发业务功能模块 方便调度器使用
七个设计原理 代码审查使用
简单性原理
bug 一般出现在复杂代码的地方
同构原理
所有的流程都遵守规范 这样才能更快的发现问题
对称与案例
对称代码 更好阅读 更好理解代码
层次原理
更好的理解重点
线性原理
直线流程 也就是没有判断分支的流程 会有更好的代码质量
清晰原理
简单 不用长代码 一眼看清楚代码 不容易隐藏bug
安全原理
需要多考虑 异常情况 而不是正常情况
unix思想
模块化思想
高内聚模块 更好的方便使用
清晰原则
代码可读性要好 意图要清晰
组合原则
更好的配合其他代码的合作 才能发挥更大的作用
分离原则
策略 依赖软件前提的部分 业务逻辑和用户接口 属于策略 不稳定 调度
机制 不依赖软件前提的自我独立部分 相对文档 领域
简单原则
代码要简短
简约原则
不写大代码
透明性原则
一眼理解代码 并且知道软件内部状态
有助于调试 方便日志输出
健壮性原则
代码审查 外部检验
表达性原则
把复杂性 交给数据 比如 一些辅助属性的记录 更好的表达自己需要的内容
逻辑 尽可能的简单
最小意外原则
符合使用者的基本认知
降低学习成本
沉默原则
指输出重要信息
修复原则
修复失败 立即停止 并且警报
经济原则
珍惜程序员时间 提高设备性能
生成原则
尽量使用代码生成器
优化原则
先做到能用 可用
最后做到好用 不要过早优化
多样性原则
允许有多重选择 一直追求更好的
可扩展性原则
设计留有余地
软件必须扩展
unix哲学
小就是美
软件应该短小 不超过5行
工作唯一
代码类 要纯粹 定义要明确 不要随意增加内容
尽早创建原型
早使用 早反馈
可移植性优于效率
可移植性 制约了 后续的从1-100的效率
文本数据
更好的使用文本数据 更好的移植 和 分享 查看
兼容性好 简单
充分利用软件的杠杆效应
利用软件 把手动作业自动化
活用shell脚本
多用shell脚本 做软件之间的连接 更好的服务我们日常的开发
避开交互式用户接口
更多使用命令模式 调用接口 减少使用成本
用户不需要知道命令的具体执行内容
过滤器化
软件就是过滤器 做数据转换工作的
unix哲学准则
允许用户自定义
内核小而轻巧 更稳定
使用小写字母
沉默是金
保护森林
并行思考
部件联动
完成90%目标
劣就是优 最大公约数的类型 能活下来
层次化思维
0 条评论
下一页