从混乱到混乱,业务逻辑搬家记

2017 年 8 月 23 日 码农翻身 刘欣
1
 业务逻辑同学


业务逻辑同学经常被大家戏称是业务中最不讲逻辑的东西, 这句话道出了他的本质。


这家伙不仅善变,而且特别喜欢和程序员作对,尤其喜欢制造混乱,让程序员惧怕他。


他最早栖息在像ASP 和 JSP这样的页面当中,整天和那些负责界面展示的HTML,CSS们厮混,在这里除了展示逻辑之外,你还能看访问数据库的代码, 他们坚定不移地以制造混乱为己任,齐心协力把页面搞得一团糟。



当程序员想去修改的时候就发现, 这种代码简直就是“意大利面条”, 极难阅读,极难维护。 更不用提什么代码的复用了。


每当程序员抱怨的时候, 业务逻辑说: “怪我咯? 还不是你们自己惹的祸!”


2
 第一次搬家


时间久了,大家都受不了, 只好想了新的办法, 分层!   强迫业务逻辑和展示逻辑分家 !



业务逻辑被迫搬了家,再也无法和展示层的HTML,CSS一起喝酒吃肉, 每次想聊个天还必须得通过特定接口, 把数据发给展示层才行。 比如业务逻辑层会发个View Object 给展示层,把自己的孤独和思念捎带过去。 再后来展示层完全从服务器端移到了浏览器端,业务逻辑想打个招呼就得跨越网络的千山万水了。


业务逻辑退而求其次, 和Java bean 打得火热,不过很快就发现和Java bean 实在没什么好聊的,太单纯,没有一点深度,除了getter/setter方法之外,啥都没有。


有人把此时的业务逻辑称为Service , 有人称为Manager ,业务逻辑更喜欢这个名字,因为显得更加威严,更像系统的老大。


无论叫什么,其实做的事情都是一样的: 根据隔壁房间或千里之外的展示层传过来的指示, 从数据库读取数据,形成java bean(有时候连java bean 都不需要) , 进行业务逻辑运算,再给展示层发送结果。



程序员把这种Java bean 形象地称为贫血模型, 因为它一点业务逻辑都没有, 业务逻辑在Service中放着呢。


这种简单的开发方式受到了广大程序员的欢迎,它概念简单,门槛极低,初学者很快就能掌握。


建个数据库表, 创建一个对应的java 类,使用Hibernate, MyBatis把它映射到数据库表和字段上, 接下来就可以在Service 中随心所欲地操作这些Java bean 实现业务逻辑了,完全不用什么“高深的”面向对象的分析和设计 。


一个项目划分成多个模块, 大家都按照这种模式开发, 再加上一些辅助的开发工具,能够自动化从数据库表生成各种类, 实在是直接而酸爽。


一大批使用贫血模型的应用程序如雨后春笋般地出现,慢慢地变成了趋势,好像用Java做面向对象的Web开发就是这个样子。 尤其是后来维护项目的程序员, 更是觉得天经地义。


(码农翻身老刘注: 按照Martin Flower在《企业应用架构模式》中的定义,这种方式叫做事务脚本,其本质是用面向对象的语言写面向过程的程序


这种模式对于简单的增删改查一点问题都没有,甚至还有优势 !


业务逻辑这家伙经常在诱惑程序员,来啊来啊,再多给我的Service/Manager加点逻辑。


随着系统越来越复杂, 这家伙得逞了, 大量的业务规则被添加到Service 当中,Service越来越臃肿, 开始变成巨无霸的类, 各种状态、判断、if else 交织在一起, 喜欢混乱的业务逻辑同学又激动起来,  又回到了“面条代码”的“美好”时代。

3
 第二次搬家


程序员们决定再次让业务逻辑搬家, 搬到一个清静的地方去。


有一天,有个叫做Eric Evans的大神提出了一个新方案: 把Service 层和领域层分开。



(码农翻身老刘注: 在Eric Evans的领域驱动开发中,最下面是基础设施层,而不仅仅是数据访问, 我这里为了和之前的图保持一致,只把数据访问列了出来)


业务逻辑同学很不爽地发现,自己不但和展示层彻底说byebye ,还被拆分到一个个的领域对象当中去了,些对象不仅仅是具有getter/setter的java bean , 而且拥有相关的业务逻辑、业务状态、业务规则。  现在各个领域对象要想聊天吹牛,也非得调用相应的业务接口才可以。


原来的Service 层也成功减肥,变得非常轻薄,不再包含业务规则和知识,只是为下层的领域对象协调任务,分配工作,指挥着他们完成业务任务,解决问题。


程序员们被美好的前景激励着, 努力地帮着业务逻辑再次搬家。 喜欢混乱的业务逻辑同学这次要绝望了, 以后的系统都这么搞,自己还有什么活路。


可是没想到这一次搬家难度很高, 尤其是从需求中分析合适的领域对象,实在不是一件轻松的事情,习惯了之前那种用数据库表驱动的开发方式,想转到领域模型驱动的开发方式, 让大家很不适应。


于是业务逻辑同学趁势鼓噪,算了吧,这种方法太难了,你有丰富的开发经验吗?、你有优秀的面向对象设计能力吗?你能把业务领域专家拉进来一起讨论设计吗? 不行吧? 还是退回去吧,贫血模型多好,又简单又熟悉。


这厮还真得逞了,鉴于大部分遗留系统都是贫血模型,大家没有勇气更没有时间去重构,只好将就着继续往混乱的Service舔砖加瓦,希望能熬到系统重写的那一天。


业务逻辑再次搬回到熟悉的地方,再次开始幸福的生活。


你看到的只是冰山一角, 更多精彩文章,请移步《码农翻身2016文章精华》或者《码农翻身2017上半年文章精华


有心得想和大家分享? 欢迎投稿 ! 我的联系方式:微信:liuxinlehan  QQ: 3340792577



码农翻身

用故事讲述技术

登录查看更多
0

相关内容

程序员可以指在程序设计与互联网某个专业领域中的专业人士或是从事软件撰写,程序开发、维护的专业人员。
【2020新书】实战R语言4,323页pdf
专知会员服务
100+阅读 · 2020年7月1日
【2020新书】使用高级C# 提升你的编程技能,412页pdf
专知会员服务
57+阅读 · 2020年6月26日
Python导论,476页pdf,现代Python计算
专知会员服务
260+阅读 · 2020年5月17日
干净的数据:数据清洗入门与实践,204页pdf
专知会员服务
161+阅读 · 2020年5月14日
【CVPR2020】视觉推理-可微自适应计算时间
专知会员服务
12+阅读 · 2020年4月28日
【SIGMOD2020-腾讯】Web规模本体可扩展构建
专知会员服务
29+阅读 · 2020年4月12日
【新书】Java企业微服务,Enterprise Java Microservices,272页pdf
浅谈 Kubernetes 在生产环境中的架构
DevOps时代
11+阅读 · 2019年5月8日
工作4年,我从阿里巴巴辞职到了国企
互联网架构师
3+阅读 · 2019年3月17日
说说我的老同事,前端大神程劭非
余晟以为
17+阅读 · 2019年1月14日
业务中台:如何在互联时代,快速响应用户需求?
互联网er的早读课
24+阅读 · 2018年12月26日
为什么分布式一定要有消息队列?
互联网架构师
4+阅读 · 2018年7月5日
一篇文章读懂阿里企业级数据库最佳实践
阿里巴巴数据库技术
5+阅读 · 2017年12月20日
有了场景和画像才懂用户
互联网er的早读课
6+阅读 · 2017年8月26日
Arxiv
10+阅读 · 2020年4月5日
Neural Image Captioning
Arxiv
5+阅读 · 2019年7月2日
Arxiv
4+阅读 · 2018年4月29日
Arxiv
4+阅读 · 2018年3月19日
VIP会员
相关VIP内容
【2020新书】实战R语言4,323页pdf
专知会员服务
100+阅读 · 2020年7月1日
【2020新书】使用高级C# 提升你的编程技能,412页pdf
专知会员服务
57+阅读 · 2020年6月26日
Python导论,476页pdf,现代Python计算
专知会员服务
260+阅读 · 2020年5月17日
干净的数据:数据清洗入门与实践,204页pdf
专知会员服务
161+阅读 · 2020年5月14日
【CVPR2020】视觉推理-可微自适应计算时间
专知会员服务
12+阅读 · 2020年4月28日
【SIGMOD2020-腾讯】Web规模本体可扩展构建
专知会员服务
29+阅读 · 2020年4月12日
【新书】Java企业微服务,Enterprise Java Microservices,272页pdf
相关资讯
浅谈 Kubernetes 在生产环境中的架构
DevOps时代
11+阅读 · 2019年5月8日
工作4年,我从阿里巴巴辞职到了国企
互联网架构师
3+阅读 · 2019年3月17日
说说我的老同事,前端大神程劭非
余晟以为
17+阅读 · 2019年1月14日
业务中台:如何在互联时代,快速响应用户需求?
互联网er的早读课
24+阅读 · 2018年12月26日
为什么分布式一定要有消息队列?
互联网架构师
4+阅读 · 2018年7月5日
一篇文章读懂阿里企业级数据库最佳实践
阿里巴巴数据库技术
5+阅读 · 2017年12月20日
有了场景和画像才懂用户
互联网er的早读课
6+阅读 · 2017年8月26日
Top
微信扫码咨询专知VIP会员