[代码异味 #5] 散弹式修改 vs 发散式变化
散弹式修改是指一项变更分散在多个文件中的异味,而发散式变化则是它的镜像:一个文件因多个原因而修改。本文总结如何通过提交记录实测并区分这两种处理方式完全相反的异味。
阅读文章SEARCH THE GROUND
同时搜索标题、说明、分类与标签。
显示最新 15 篇文章。
散弹式修改是指一项变更分散在多个文件中的异味,而发散式变化则是它的镜像:一个文件因多个原因而修改。本文总结如何通过提交记录实测并区分这两种处理方式完全相反的异味。
阅读文章上帝对象是不断吸收周边职责和数据而膨胀的类,也是团队中修改最频繁、冲突最多的文件。本文整理了识别膨胀的信号、拆解顺序,以及拆分失败的两种方式。
阅读文章2019 年 Swift 5 和 iOS 12.2 发布后,应用体积缩小得益于 ABI 稳定性。本文梳理 Swift 运行时从每个应用转移到操作系统的过程,以及模块稳定性和 @frozen 的权衡。
阅读文章Ravioli 代码的函数全都只有五行,也各自只有一个职责,但没人能回答点击按钮后会发生什么。本文总结过度拆分的原因、跳转次数体现的成本,以及找回流程的方法。
阅读文章同步与异步关注由谁负责任务完成,阻塞与非阻塞关注是否立即返回控制权。由于两个轴彼此独立,2×2 的四种组合全部存在;本文结合 Swift 示例说明原因。
阅读文章文件句柄或锁这类只有保持唯一才有意义的资源不应被复制。本文介绍如何用 Swift 5.9 的 ~Copyable 将禁止复制写入类型,并整理 borrowing、consuming、inout 三种传递方式及其适用场景。
阅读文章Swift 5.9 的宏是插入编译器的代码生成插件。本篇总结了接收语法树并返回代码的原理、freestanding(#) 与 attached(@) 两种分支,以及自行创建宏所需付出的成本。
阅读文章struct 的大小并不是属性大小的简单总和。本文整理了 size、stride、alignment 与 padding 的实测,以及利用 extra inhabitant 的 Optional 和 64 位 existential container。
阅读文章即使层次划分得很整齐,新增一个字段仍要修改七个文件的代码,就是千层面代码。本文总结层数增加的原因、成本产生的位置,以及何时需要保留或移除层次。
阅读文章Claude Code 权限通过 allow、ask、deny 规则运行,并按 deny 优先的顺序评估。本文总结 /permissions 的用法、Bash 通配符语法、Shift+Tab 模式循环,以及配置文件的优先级。
阅读文章方法调用会编译为直接调用、vtable或objc_msgSend。本文整理final和private提升性能的机制、协议extension的陷阱,以及如何通过性能分析器验证。
阅读文章添加观察者的瞬间,运行时会将对象的类动态替换为子类。本文梳理 isa-swizzling 的工作方式、class 为什么会说谎,以及不经过 setter 时不会收到通知的条件。
阅读文章Claude Code 的计划模式(plan mode)要求先批准计划,再修改代码。本文整理如何通过 Shift+Tab·/plan 启用、3 种批准选项、使用 Ctrl+G 编辑计划,以及默认设置。
阅读文章测试计划通过 .xctestplan 文件管理要运行的测试及其条件。本文总结仅靠 Scheme 设置为何不够、目标选择、配置拆分、覆盖率、执行顺序、重复设置以及 xcodebuild 集成。
阅读文章结构化并发回答了谁负责异步工作的结束。本文整理子任务无法离开父作用域的原理、取消信号的传播方式,以及使用Task.detached时需要手动补回的保证。
阅读文章