解耦解的早,改需求没烦恼
来源:互联网 发布:puppy linux xiazai 编辑:程序博客网 时间:2024/06/11 08:29
摘要
世上本没有解耦,需求改的多了也便有了解耦。 —— 产品经理
本例将通过一个计时控件,聊聊如何解耦~
本TimerView
仅作为demo
,不保证其健壮性,请勿在实际项目中使用。
特点
UI容器
与计时逻辑
分离UI容器
与具体UI布局
分离
源码
https://github.com/fashare2015/TimerView
Let’s Go
话说,小明在做一个电商项目,有个倒计时需求。
需求1.0
要求”时、分、秒”数字显示。
这个简单,小明很快自定义了一个TimerView
:
public class TimerView { TextView tvHour, tvMinute, tvSecond; TextView divider1, divider2; ...}
需求2.0
界面太丑啦,加点颜色和背景吧~
这个也简单,小明很快加了一些自定义属性:
public class TimerView { TextView tvHour, tvMinute, tvSecond; TextView divider1, divider2; // 添加 自定义属性 int tvHourBgRes, tvMinuteBgRes, tvSecondBgRes; int tvHourColor, tvMinuteColor, tvSecondColor; ...}
需求3.0
这时,产品经理又跑了过来,你看我发现了啥~
发现一套火焰数字.jpg,好炫酷的说,帮忙改上去吧~
小明内心:你TM有病啊!!!
你发现了么,这下小明把自己带到沟里了。新需求要求显示火焰数字图片
(ImageView)。
然而,由于TimerView
由TextView
构成,再怎么自定义属性也实现不了新需求(ImageView)了。
说的就是你呀:https://github.com/iwgang/CountdownView
分析
为啥会这样呢?因为一开始就设计紧耦合了。 TimerView
依赖了具体子类TextView
,功能也就被局限在TextView
了。
那我们只需这么调整一下,把TextView
改成更抽象的View
。
这样一来tvHour
既可以是TextView
,也可以是ImageView
,或者某个ViewGroup
,功能得以拓展:
public class TimerView { //TextView tvHour, tvMinute, tvSecond; View tvHour, tvMinute, tvSecond; //TextView divider1, divider2; View divider1, divider2; // 自定义属性也不用了,因为无法确定 tvHour 这些究竟是啥子类。 //int tvHourBgRes, tvMinuteBgRes, tvSecondBgRes; //int tvHourColor, tvMinuteColor, tvSecondColor; ...}
这也体现了软件设计的一大原则:要依赖抽象(View)而不要依赖具体(TextView)。
依赖注入
还有一个问题:tvHour
究竟是啥呢,这个得由用户决定。
通常我们会提供一系列setXXX()
方法给用户进行设置。这个套路叫做依赖注入。
依赖注入是解耦的一种常见的方式。通常,当你有无法确定的一些东西,都应该抛给用户决定。
举个例子,View
被点击时,设计者不知道你想干嘛,于是设计了View.setOnClickListener()
。这是典型的依赖注入。
好了,ImageView
可以支持了,然而对于界面更新ImageView
和TextView
肯定是不一样的。
该怎么更新又无法确定了,我们可以再次用依赖注入
的方式解耦,把难题抛给用户。
因此,我设计了类似Adapter
的东西,都在代码里,就不详细展开了。
需求4.0
嗨呀~还不够啊,产品经理的脑洞总是很大的。
产品经理:我看到一个 svg 诶~
小明:算我倒霉。不过,我早就重构解耦过了。改需求, 小case~
需求5.0
产品经理:小明,你还活着那?我发现机械表更好看诶~
小明: **, 我改就是了
感谢
https://github.com/lypeer/GoogleClock
https://github.com/gnehsuy/ClockView
- 解耦解的早,改需求没烦恼
- 改程序的烦恼。
- 需求工作的烦恼 - 转贴
- 客户需求变更带来的烦恼
- 糊涂虫没烦恼
- 需求又改了
- 改你MB需求!
- 需求又改了
- 改你MB需求!
- 非常简单的JS选项卡,没改样式
- 从一名开发者的角度看待产品需求的“烦恼”
- 趣图 | 改需求的时候,PM他……
- 一天三个枣 健康没烦恼
- 先放着 没时间改了
- 为什么程序员怕改需求?
- (转载) 改你MB需求 !
- 家用无线路由器哪个品牌好?分享值得推荐的无线路由器给你无线选得好,网络没烦恼
- 我的烦恼---来自studio2005的烦恼
- 虚拟化的首选:VMware vSphere
- 元思考
- 内网渗透之Hydra
- 纯C++编写Win32/X64通用Shellcode注入csrss进程
- 优化 Ext4 分区格式化后占用空间(通过降低inode数来节省磁盘空间)
- 解耦解的早,改需求没烦恼
- javacv开发详解之1:调用本机摄像头视频(建议使用javaCV1.3版本)
- 利用递归方法求5!。
- RSA算法和DH算法的区别
- UVA 11426 GCD - Extreme (II)(欧拉函数)
- Spring缓存注解@Cacheable、@CacheEvict、@CachePut使用
- POJ 1061 青蛙的约会(扩展欧几里得)
- QT5提示can not find -lGL的解决方法
- hdu2159