【讨论】“转账功能”引发的“谜团”
2011-06-22 20:30
197 查看
今天拿出了一个憋在心中很久的问题来和领域驱动群的群友讨论,经过几小时讨论,总体上来说还是不能解决我心中的疑惑,所以直接拿出来和博友们来讨论一翻,希望以博客园大家的见识来为我释怀。为了让大家对所讨论的问题达成共识,就拿一个比较经典的ATM转账功能实现来展开讨论。如果我直接说大家都转过账,这未免太绝对了,但我相信在生活中,每一个人都听过这个词,废话少说直接进正题。
讨论的中心:如何从用例(功能)来精炼领域模型。
大家先不要急着回答我的问题,先对比以下落来的3位同学的对“转账功能”的具体实现。
1.甲君实现“转账”的代码
评论:甲君这种实现方式,咋看上去并无问题,或许很多朋友也都是这样去实现转账功能的,包括我在内。
2.再看看乙君对“转账功能”的实现的。
评论:相信看到乙君的实现,各位肯定会喊当然是这种比较好啦,应该没人会说这种方式比第一种差吧,但反问各位这种做法为何好?好在哪里?为何能驱动出这个模型来?或许你们都会答,第二种明显维护的时候更省力什么的。。。我只能说从重构的角度来说,第一种有必要改进成第二种,但从功能实现的角度,抱歉,我无法单纯从转账这个用例精化出这种模型来。
3.看看丙君的“转账实现”
评论:相信有不少人看到丙君的实现第一反应是,这种比前两种貌似都要好,因为从代码量来说它是最少的,所以大家第一反应都会觉得这种更好,而我又反问你们,单纯从一个转账功能就能驱动出如何简洁的模型?究竟巧妙在哪里?每个看过三种实现方式的人都会觉得这种实现方式职责更加分离了,更容易维护了,更。。。就是说不出如何驱动出来的。
其实,我也觉得自己表达不清,所以题目打了两个字“谜团”,只能尽量去描述心中的疑惑:
已知条件:实现转账功能
问题结果:得出一个Account领域模型
结语:单从一个这么狭窄的已知条件去驱动出第二种方法的领域模型,各位你们凭什么得出这个结果?得出Redraw()和Deposit()方法?而第三种方法,又凭什么去把赋予Account对象一个转账行为,凭什么说转账是一个行为,请大家严谨地分析一下。
讨论结果:
经过各位的讨论,大致得出以下比较认同的第4种方案,见下图。
然而虽然说这种方案是大家比较认同的,但我本人觉得绿色框框的部分代码是为了替代转入(Deposit)和转出(WithDraw)功能而定义的行为,从业务概念理解上,很合理,也应该这么做,但始终有种换汤不换药的感。我会把最新的讨论结果更新上来,大家放心讨论和关注此文结果。
讨论的中心:如何从用例(功能)来精炼领域模型。
大家先不要急着回答我的问题,先对比以下落来的3位同学的对“转账功能”的具体实现。
1.甲君实现“转账”的代码
评论:甲君这种实现方式,咋看上去并无问题,或许很多朋友也都是这样去实现转账功能的,包括我在内。
2.再看看乙君对“转账功能”的实现的。
评论:相信看到乙君的实现,各位肯定会喊当然是这种比较好啦,应该没人会说这种方式比第一种差吧,但反问各位这种做法为何好?好在哪里?为何能驱动出这个模型来?或许你们都会答,第二种明显维护的时候更省力什么的。。。我只能说从重构的角度来说,第一种有必要改进成第二种,但从功能实现的角度,抱歉,我无法单纯从转账这个用例精化出这种模型来。
3.看看丙君的“转账实现”
评论:相信有不少人看到丙君的实现第一反应是,这种比前两种貌似都要好,因为从代码量来说它是最少的,所以大家第一反应都会觉得这种更好,而我又反问你们,单纯从一个转账功能就能驱动出如何简洁的模型?究竟巧妙在哪里?每个看过三种实现方式的人都会觉得这种实现方式职责更加分离了,更容易维护了,更。。。就是说不出如何驱动出来的。
其实,我也觉得自己表达不清,所以题目打了两个字“谜团”,只能尽量去描述心中的疑惑:
已知条件:实现转账功能
问题结果:得出一个Account领域模型
结语:单从一个这么狭窄的已知条件去驱动出第二种方法的领域模型,各位你们凭什么得出这个结果?得出Redraw()和Deposit()方法?而第三种方法,又凭什么去把赋予Account对象一个转账行为,凭什么说转账是一个行为,请大家严谨地分析一下。
讨论结果:
经过各位的讨论,大致得出以下比较认同的第4种方案,见下图。
然而虽然说这种方案是大家比较认同的,但我本人觉得绿色框框的部分代码是为了替代转入(Deposit)和转出(WithDraw)功能而定义的行为,从业务概念理解上,很合理,也应该这么做,但始终有种换汤不换药的感。我会把最新的讨论结果更新上来,大家放心讨论和关注此文结果。
相关文章推荐
- 讨论A1200防盗功能开发
- php实现单笔转账到支付宝功能
- VS2013自带的Browser Link功能引发浏览localhost网站时不停的轮询
- WinForm:一个登陆窗体引发的问题系列(六):Textbox的记忆功能
- 视频网站裁员过冬引发商业模式讨论
- 【讨论二】服务层(Service)的功能参数列表的粒度
- 功能测试转需求分析讨论
- 校内网开心网数据同步引发的讨论(转)
- 由预处理引发名字空间(namespace)几点讨论
- “12306.cn网站挂了”好文章收藏,引发的技术架构问题讨论。
- 使用MVC模式实现用户转账功能(区分dao层与service层)
- 由雷军先生的话引发的产品经理讨论
- 由java的extend的优劣引发的讨论技巧
- Oracle EBS R12 SLA(子分类帐) TCA(交易社区) 金税 等新技术和新功能的研究和讨论
- 扎克伯格引发讨论:创始人是否应该担任CEO?
- 功能讨论区——有建议就反馈!
- 由RAID引发的讨论 与lu0老大的聊天记录
- Java基于JDBC实现事务,银行转账及货物进出库功能示例
- Canonical 已经开始讨论关于 Convergence 与 Ubuntu 14.10 的功能
- 一道C语言题目引发的讨论