# Agenda - [什么是职责分离](#/what) - [为什么要分离](#/why) - [怎么做?](#/methods) - [技术资料的获取](#/materials)
# 一、什么是职责分离 - 鼻子呼吸、嘴巴吃饭 - 让鼻子吃饭就会抛异常
# 二、为什么要分离 - 逻辑清晰:分模块、分层 - 可复用 - 健壮:单元测试、错误定位 - 集中性能优化
![](/img/separation-of-duty/Boundary-cell.jpg) 细胞(函数,基本单元)
![](/img/separation-of-duty/Boundary-tissue.jpg) 组织(类,完成功能)
![](/img/separation-of-duty/Boundary-organ.jpg) 器官(组件,提供某种服务)
![](/img/separation-of-duty/Boundary-system.jpg) 系统(应用、子系统,实现某个目的)
![](/img/separation-of-duty/doge.jpg) 生物体(解决方案,业务)
## 集中进行性能优化 - 独立模块的性能检测和逻辑优化 - 批量、并发
# 三、怎么做? - 核心逻辑和思想 - 发现问题和重构 - 技巧
### Bloaters (腌鲱鱼) - Large classes/ Long methods (违反单一职责、逻辑过于复杂) - God object (违反单一职责,耦合度大) - Overuse of static (耦合大,难以测试)
### Object-Orientation Abusers - Refused Bequest (拒绝继承): 子类只使用一部分父类功能 - Temporary Field (临时字段): 成员变量只在某个逻辑中有意义(常见于有多个数据需要传递的情况) - Alternative Classes with Different Interfaces (异曲同工的类): 不同的类做类似事情、只是接口不一样
### Change Preventers - Divergent Change (发散式变化): 想修改一个部分的逻辑,却发现许多逻辑需要修改(耦合高) - Shotgun Surgery (霰弹式修改): 想做改动时,需要同时修改多个地方(重复)
## 技巧 - 代码技巧 - 工作方式技巧
## 代码技巧 - 空行、抽取函数、抽取类、抽取包 - 简化逻辑(减少多次嵌套、复杂的判断分支) - 使用组合、而不是继承
## 工作方式技巧 - 画架构图 - 写单元测试 - 一方面增强稳定性,另一方面逼迫自己做逻辑分离 - TDD 测试驱动开发
### 新版健康 App 架构 ![新版本健康架构](/img/separation-of-duty/health-structure.png) - 单向数据流 - 职责分离、方便单元测试
# 四、技术资料的获取 - 搜索、网站 - 技术人 - 技术文章
## 搜索、网站 - Google, Google, Google,用英文搜索 - StackOverflow: 其实一般都是 Google 的第一个结果,如果一个问题在 StackOverflow 上搜到了,这个问题基本也就终结了。 - 知乎: 一些思想性的东西,可以在知乎上有比较深度的讨论
## 技术人 - 程序人生(programmer_life): 经常会写很多高质量的技术文章。虽然他本人应该是搞后端的,但很多文章写得都是通用思想,很多后端技术对前端代码也有非常好的借鉴作用 - MacTalk(sagacity-mac): 相对比较生活化,对一些工具、软技能等都有介绍 - 滴答滴答(AngelaTalk): 硅谷程序媛妹子,现在就职 Airbnb,搞支付,也是后端的牛人。 - JakeWharton:开源大神,之前在 SquareUp 参与 RxJava, Kotlin, ButterKnife 等开源项目的研发。关注他的博客、GitHub 和各类演讲,都收获颇多。
## 技术文章: - Medium:不光是技术,各方面的优质文字,国内很多文字都是从这上面翻译过去的。 - 简书: Medium 中国版 - 掘金: 比较高质量的技术文字。