差不多两年都没写过博客了,好学的习惯差不多都落下了,两年里几乎也把学到的很多东西都应用了,但不学习好像就有点停步不前的感觉了,以后给自己定个目标每周写一遍博客。
写博客好处:
一是加深自己的印象(能够写出来的东西比光光自己理解的东西要理解的深的多),
二是督促自己学习,
三是也是希望让其他人对我有个认识知道我会什么,
四是也是希望自己的分享能够帮助到一些人,
两年前因为自己的编码习惯和一些沟通相关的事情不是很好被广州一家大厂的引擎组嫌弃,于是就不断看设计模式,代码的重构等等
最近又因为种种事情被人际关系和沟通烦的要死,也在看人性的弱点,非暴力沟通。
希望自己还是能够往上走一下,也算是缓解自己的焦虑,最近也要结婚买房,毕竟没房子孩子上学也没那么方便,就先分享之前看的关于代码重构的一本书改善既有代码的设计
1.重构原则
1.何为重构(what):对软件内部结构的一种调整,目的是在不改变软件可观察的前提下,提高其可理解性,降低其修改成本
2.为何重构(why):改进软件设计,使软件更容易理解,帮助找到bug,提高编程速度
3.怎么重构(how):
重复的事不过三,三则重构
添加功能时重构
修复错误时重构
复审代码时重构
4.何时不该重构:重构是为了写出更好的代码,提高以后的扩展性,可读性
但是如果已经是项目后期了 都不会新增需求的情况下,重构是没必要的
5.怎么让别人理解重构:可以减少代码的出错概率,提升速度,提高可读性,提高扩展性
2.代码的坏味道
1.Duplicated Code (重复代码)
2.Long Method (过长函数)
3.Large Class (过大的类)
4.Long Parameter List (过长的参数列)
5.Divergent Change (发散式变化):一个类受多种变化的影响
6.Shotgun Surgery (霰弹式修改) :一种变化导致多个类的修改
7.Feature Envy (依恋情结 ):一个类的对象函数依赖太多其他类型的对象 应该移动到另一个地方去 另一个类或者独立的类里去
8.Data Clumps (数据泥团) :太多地方都出现了几项一样的数据 应该组成一个对象
9.Primitive Obsession (基本类型偏执): 明明应该以对象表现的 却觉得没必要用两个小的数据类型组成 对象 像:由起始值和结束值组成的range类
10.Data Class (幼稚的数据类):应该有足够好的封装 防止数据被莫名其妙修改 数据的修改查找在多于3次后应该分类
3.重新组织函数
1.Extract Method 提取函数:函数的复用,函数起到的注释作用,函数的重写更简单
2.Replace Temp with Query 用查询代替临时变量
3.Replace Conditional with Polymorphism 用多态替换条件
4.Substitute Algorithm 替换算法
5.函数对象取代函数
6.替换算法:也许有更简单的算法实现某个需求
4.在对象之间搬移特性
1.Move Method 移动函数:某个函数被另一个类更多的用到
2.Move Field 移动字段:某个字段被另一个类更多的用到
3.Extract Class 某个类做了应该由两个类做的事
4.Inline Class 将类内联化:某个类没有做太多事情,将这个类的所有特性搬到另一个类中,然后移除原类
5.Remove Middle Man 移除中间人:某个类做了太多的简单委托动作,让客户直接调用
6.Introduce Local Extension 引入本地扩展:你需要为服务类提供一些额外函数,但你无法修改这个类
5.简化函数调用
__1.Separate Query from Modifier (将查询函数和修改函数分离) 明确的将修改对象和查询对象分开来 可以清楚的看到在哪修改的 不然对象的引用太多会影响查看修改的逻辑
2.Remame Method (函数改名) 函数的名称未能揭示函数的用途
3.Add Parameter (添加参数) 为此函数添加一个对象参数,让该对象带进函数所需信息
4.Remove Parameter (移除参数) 函数本体不再需要某个参数
5.Replace Parameter with Explicit Methods 你有一个函数,其中完全取决于参数值而采取不同行为
6.Preserve Whole Object (保持对象完整) 你从对象取出多个值,将它们做为某一个函数调用的参数 缺点:引用类型的依赖度加高
7.Replace Parameter with Methods(用函数取代参数)
对象调用某个函数 并将所得结果作为参数 传递给另一个函数
而接收函数本身能直接调用前一个函数,让接收者直接调用前一个函数以去掉多余的参数传递
8.Introduce Parameter Object(引入参数对象)
某几个参数总是一起出现,就应该建立一个对象取代这些参数
9.Remove Setting Method (移除设值函数):某个字段 就应该在对象被创建时被设值,然后就不再改变
10.Hide Methid (隐藏函数) 有一个函数,从来没有被其他类用到
11.Replace Error Code with Exception(以异常取代错误码)
6.大型重构
1.Tease Apart Inheritance (梳理并分解继承体系):某个继承体系同时承担两项责任
解决:建立两个继承体系,通过委托关系让其中一个调用另一个
2.MVC:很重要可以说是现在的基本框架了
3.Extract Hierarchy (提炼继承体系):
你有一个类做了太多工作,其中一部分工作是以大量条件表达式完成的
解决:1.建立继承体系,以一个子类表示一种特殊情况
2.用策略和状态模式处理