8 次尝试,带你走进 iOS 精益编程--cocoaChina
2016-03-10 00:06
316 查看
作者:晓月 授权本站转载。
/article/3607582.html
开场
今天, 我们将从一个小功能开始, 先去不假思索的实现它
Product Repository: Filtering Operation
Code start
有一个产品库, 我们要对它做过滤操作.
第一个需求并不复杂.
需求1:在仓库中查找所有颜色为红色的产品
First Attempt: Hard Code
我们先用最简单的方式去实现它, 硬编码
紧接着,第二个需求来了
需求2:在仓库中查找所有颜色为绿色的产品
Second Attempt: Parameterizing
Copy-Paste是大部分程序员最容易犯的毛病,为此引入了大量的重复代码。
需求3:查找所有重量小于10的所有产品
Third Attempt: Parameterizing with Every Attribute You Can Think Of
大部分程序员依然会使用Copy-Paste解决这个问题,拒绝Copy-Paste的陋习,最具实效的一个反馈就是让这个快捷键失效,从而在每次尝试Copy-Paste时提醒自己做更好的设计。
通过参数配置应对变化的设计往往都是失败的设计
易于导致复杂的逻辑控制,引发额外的偶发复杂度
Forth Attempt: Abstracting over Criteria
为此需要抽象,使其遍历的算法与查找的标准能够独立地变化,互不影响。
与大师们交流,问究此处为何引入设计模式,得到的答案:直觉。忘记所有设计模式吧,管它是不是模式,如果设计是简单的,这就是模式。
另外还有一个明显的坏味道,ColorSpec和BelowWeightSpec都需要继承ProductSpec,都需要定义一个构造函数和一个私有的字段,并重写satisfy方法,这些都充斥着重复的结构。
是不是觉得目前的写法已经够用了? 莫急, 让我们来看看下个需求
需求4:查找所有颜色为红色,并且重量小于10的所有产品
Firth Attempt: Composite Criteria
按照既有的代码结构,往往易于设计出类似ColorAndBelowWeightSpec的实现。
包含and的命名往往是违背单一职责的信号灯
ColorAndBelowWeightSpec的实现与ColorSpec,BelowWeightSpec之间存在明显的重复
此刻,需要寻找更本质的抽象来表达设计,and/or/not语义可以完美解决这类问题。
Composite Spec: AndSpec, OrSpec, NotSpec
Atomic Spec:ColorSpec, BeblowWeightSpec
[self findProducts:_products bySpec:[AndSpec spec:[ColorSpec specWithColor:RED], [BelowWeightSpec specWithBelowWeight:10], nil]];
1
但这样的设计存在两个严重的坏问道:
AndSpec与OrSpec存在明显的代码重复,OO设计的第一个直觉就是通过抽取基类来消除重复。
可以引入DSL改善程序的可读性,让代码更具表达力。
我们先添加一些DSL:
可以使用Block改善设计,增强表达力。
还可以使用标准库
今天的编码就到此为止了, 这篇文章本是Horance所写, 笔者将用OC实现了一遍.如果咱们不是iOS Developer的话, 还是有其他attempt的, 如泛型.
作者介绍
刘光聪,程序员,敏捷教练,开源软件爱好者,目前供职于中兴通讯无线研究院,具有多年大型遗留系统的重构经验,对面向对象,函数式,大数据等领域具有浓厚的兴趣。
github: https://github.com/horance-liu
email: horance@outlook.com
邢尧, 资深开发工程师, iOS Developer, 开源软件爱好者, 追求真理比占有真理更加难能可贵
Github: https://github.com/uxyheaven
Blog: http://blog.csdn.bet/uxyheaven
相关文章推荐
- iOS APNS推送
- iOS 接入支付宝SDK 流程
- 关于iOS多线程
- 卡拉OK效果的实现-IOS音乐播放器
- iOS--Pch文件
- iOS 内存管理分析
- iOS开发真机调试的超简单步骤
- iOS framework不能在windows系统下提交到svn
- iOS实现(超级猜图)源码
- IOS传值方法- 属性反向传值(delegate)
- iOS中用按钮NSbutton实现视图的放大与缩小功能
- BIOS调查笔记
- iOS--开发之手势解锁
- IOS传值方法-属性正向传值
- iOS -TabBar
- iOS 动画Animation-2-2: 动画基础:核心动画
- iOS 应用生命周期
- iOS中资源分享
- iOS公司开发者账号申请
- 关于iOS开发中长按保存图片到相册