# Agenda
- [什么是职责分离](#/what)
- [为什么要分离](#/why)
- [怎么做?](#/methods)
- [技术资料的获取](#/materials)
# 一、什么是职责分离
- 鼻子呼吸、嘴巴吃饭
- 让鼻子吃饭就会抛异常
# 二、为什么要分离
- 逻辑清晰:分模块、分层
- 可复用
- 健壮:单元测试、错误定位
- 集中性能优化

细胞(函数,基本单元)

组织(类,完成功能)

器官(组件,提供某种服务)

系统(应用、子系统,实现某个目的)

生物体(解决方案,业务)
## 集中进行性能优化
- 独立模块的性能检测和逻辑优化
- 批量、并发
# 三、怎么做?
- 核心逻辑和思想
- 发现问题和重构
- 技巧
### 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 架构

- 单向数据流
- 职责分离、方便单元测试
# 四、技术资料的获取
- 搜索、网站
- 技术人
- 技术文章
## 搜索、网站
- Google, Google, Google,用英文搜索
- StackOverflow: 其实一般都是 Google 的第一个结果,如果一个问题在 StackOverflow 上搜到了,这个问题基本也就终结了。
- 知乎: 一些思想性的东西,可以在知乎上有比较深度的讨论
## 技术人
- 程序人生(programmer_life): 经常会写很多高质量的技术文章。虽然他本人应该是搞后端的,但很多文章写得都是通用思想,很多后端技术对前端代码也有非常好的借鉴作用
- MacTalk(sagacity-mac): 相对比较生活化,对一些工具、软技能等都有介绍
- 滴答滴答(AngelaTalk): 硅谷程序媛妹子,现在就职 Airbnb,搞支付,也是后端的牛人。
- JakeWharton:开源大神,之前在 SquareUp 参与 RxJava, Kotlin, ButterKnife 等开源项目的研发。关注他的博客、GitHub 和各类演讲,都收获颇多。
## 技术文章:
- Medium:不光是技术,各方面的优质文字,国内很多文字都是从这上面翻译过去的。
- 简书: Medium 中国版
- 掘金: 比较高质量的技术文字。