土耳其语重构指南异味系列第4篇Refused Bequest、Parallel Inheritance Hierarchies——继承相关异味终极指南【免费下载链接】refactoring-guide-in-turkishTürkçe refactoring kılavuzu项目地址: https://gitcode.com/gh_mirrors/re/refactoring-guide-in-turkish欢迎来到「土耳其语重构指南」refactoring-guide-in-turkish异味系列第 4 篇。这份完全用土耳其语编写的开源重构指南用通俗语言系统讲解了各类**代码异味Code Smells**与对应的重构技术。本篇聚焦两个和继承绑定的经典异味Refused Bequest被拒绝的遗产和Parallel Inheritance Hierarchies平行继承层次。学会识别它们你就知道什么时候该果断拆掉继承关系。一、Refused Bequest子类拒绝父类说明继承用错了1.1 问题子类只想要父类的一小部分Refused Bequest 指的是子类继承了父类却只使用其中极少数方法或字段其余成员对它毫无意义甚至只能用空实现来应付。指南里用了一个非常形象的比喻原文在 README.md 的 Refused Bequest 章节约第 317 行如果一个东西长得像鸭子、叫起来也像鸭子但需要装电池——那它大概率是玩具鸭而不是真鸭子。这正是**里氏替换原则Liskov Substitution Principle**的通俗版用继承建立是一种is-a关系时子类必须能无缝替换父类。玩具鸭当然不是鸭子硬塞进鸭子继承体系只会制造异味。1.2 成因复用的诱惑指南指出这类异味通常来自两个动机想复用代码看到父类有现成实现直接继承省事想用继承 设计模式显得架构高级但真正要建继承关系的两个类可能完全不同。1.3 解决两条路先判断继承到底合不合理判断结果处理方向对应重构技术继承本就不合理放弃继承改为组合/委托把类拉到平行的位置Replace Inheritance with Delegation继承合理但父类混入了专属内容把真正共用的部分抽成新基类重建层次Extract Superclass简单说共用的留下不共用的拆出去。1.4 修复后的收益指南的总结特别有画面感重构之后你再也不必纳闷为什么Chair椅子类会继承自Animal动物类。 代码的可读性和组织度都会明显提升。二、Parallel Inheritance Hierarchies并排生长的两棵继承树2.1 问题一棵树长出了影子树当一个类层次旁边还挂着一个和它一一对应、平行演化的类层次时就是 Parallel Inheritance Hierarchies。指南给出的例子README.md 约第 405 行第一棵树Vehicle→Car、Truck第二棵树XmlFormatter→CarXmlFormatter、TruckXmlFormatter两棵树像平行线一样同时分叉。以后每加一种车比如Van就得在两棵树里各加一个类——改一处的代价变成了改两处。2.2 成因没读懂代码或经验不足指南把原因归结为两点代码底子太差设计没有被完全理解就随手在旁边配平了一层类开发者经验不足不知道有单层次 委托、策略模式等更内聚的写法。2.3 解决合并层次或引入中间层次指南强调这个异味有多种解法每一种背后都对应一个设计模式但底层用到的重构技术很固定Move Method移动方法Move Field移动字段常见的重构思路包括让新的层次同时继承两棵树的顶层类Car直接实现怎么输出 XML或者把两棵树的顶层类合并出一个新层次再或者把格式化职责抽成独立对象交给 Car / Truck 自己决定怎么调用组合替代继承。核心原则只有一个让一次变更只落在一个地方。2.4 什么时候可以容忍⭐这是指南中非常值得新手注意的一段反向建议平行继承层次虽然提高了变更成本但在适度使用时反而呈现出更可读的代码结构。只要平行层次没有分叉得过于庞大就可以容忍。也就是说重构不是教条。为了消灭异味而引入更复杂的模式可能得不偿失。先问一句它现在让代码更难改了吗没有就先留着。三、两个异味的快速识别清单 异味核心症状第一直觉动作主要重构技术Refused Bequest子类用不上父类大部分成员问是真鸭子还是玩具鸭Replace Inheritance with Delegation、Extract SuperclassParallel Inheritance Hierarchies新增一个子类要同时改两处把行为收进一棵树Move Method、Move Field自检三步法打开子类数一数父类成员真正被用到的有几个比例低于一半就警惕检查项目里是否存在XXFormatter / XXAdapter / XXHandler这类和主层次一一对应的影子层次模拟新增一个子类的操作看需要同时修改几个文件——超过 1 个就是异味信号。四、延伸阅读与项目资料想继续深入可以直接阅读项目内的核心资料均为纯文本无需额外依赖完整异味与重构技术正文README.md土耳其语含全部 21 种异味和 10 种重构技术详解Refused Bequest 在KODDAN KÖTÜ KOKULAR GELİYOR章节Parallel Inheritance Hierarchies 紧随其后C# 重构示例代码Samples/dotnet/RefactoringTechniques/RefactoringTechniques/Refactorings/目录含ExtractMethod.cs、ExtractVariable.cs、InlineMethod.cs、InlineTemp.cs等坏设计 vs 好设计对照实现解决方案入口Samples/dotnet/RefactoringTechniques/RefactoringTechniques.sln。 系列回顾前面 3 篇我们按序拆解了 Long Method、Large Class、Primitive Obsession 等高频异味本篇处理的是最容易被新手误用、也最容易在后期设计里悄悄分叉的继承类异味。下一篇我们将从 Divergent Change 和 Shotgun Surgery 继续看看改一处、动全身背后的结构性问题。【免费下载链接】refactoring-guide-in-turkishTürkçe refactoring kılavuzu项目地址: https://gitcode.com/gh_mirrors/re/refactoring-guide-in-turkish创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考