前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何避免写出烂的业务代码(1)

如何避免写出烂的业务代码(1)

作者头像
方丈的寺院
发布2019-08-05 17:28:39
6500
发布2019-08-05 17:28:39
举报
文章被收录于专栏:方丈的寺院方丈的寺院

摘要

习惯了MVC模式,习惯了敏捷开发,习惯了了小步快跑,还适合谈论领域驱动开发吗。领域开发是否就是慢节奏的开发, 本文结合自己的开发经历,和大家聊聊这个话题。

一.业务代码是如何写烂的

java web开发通常都是mvc模式,从早期的ssh主键到Spring+ Mybatis。所以通常一个工程的项目结构图就是

  • controller
  • service
  • manager
  • dao

问题1: bean的职责不清

对应的bean就是PO/DO(Persistence Object/Data Object):与数据库表结构一一对应,通过 DAO 层向上传输数据源对象DTO(Data Transfer Object):数据传输对象,Service 和 Manager 向外传输的对象。BO(Business Object): 业务对象。可以由 Service 层输出的封装业务逻辑的对象。一般不需要,Query:数据查询对象,各层接收上层的查询请求。VO(View Object): contoller层对外提供的

一般至少有PO/DTO/VO 三层结构,但是对于有些项目结构,业务比较简单,就是CRUD,有些开发人员就只有两层,controller到dao层就完了,然后bean的定义也特别混乱,随意创建,导致bean漫天飞,通常除了自己明白其中的含义,其他人都不明白,复用性极差。

问题2:面向过程的设计此外 bean中都是属性,除了equals方法就都没有了。虽然有接口和实现,但是按照这样一套写出来的代码基本上和面向过程写的代码没有什么区别。这种开发方式bean类只有属性,没有行为。这样就会导致某一个实体的变更会散落在各个service中,而不是这个领域实体中。

问题3:不考虑业务模型现在都是敏捷开发,导致开发人员也变得浮躁了,不分析或者草率分析需求,拿到就是干,随着业务迭代,开发人员增加,每个人各写一套,关于一个名词的定义都能有好几套写法,sql查询可能会分散到好多repo中,相同的sql可能会在不同的地方写上好几遍。关键是发现之前的模型定义错了,数据库的ER图设计有问题,仍然不会去更改,因为总是有新的需求会来,然后拼了命的做需求,留下一堆烂代码无法维护,最后连自己都不想看。

二. 领域模型是如何发挥作用的

比如说一个平台,一开始只有一种用户身份,后来平台做大了,开始做交易了,区分出了商家了,和买家了。产品提了个需求开发一个商家入驻流程,吭哧吭哧开发完了。一段时间后,开始需要有中间推销商了,一部分买家可以变成中间推销商了,那这时候产品跟你说,不用搞入驻流程,直接赋予原来的买家额外属性,来区分是否可以推销商品。这时候你能同意吗?

当然不行了,因为这个业务需求本质是就是交易,有买家,有卖家,有中间商。他们属于交易维度的不同实体,是同一个层次的,而用户则是不同的层次。一开始产品只会有需求说判断是中间商就可以,没有其他的了。等你在用户实体上加了一堆属性后,过了一段时间后,产品就会来跟你说,不好意思,哥们,卖家想管理中间商,需要中间商提供一些资质,你再帮我加几个属性。然后你的用户实体的模型开始无限扩张的模式了。对于产品来说,他是无所谓的,快速上线验证,验证了不行,换另外一条路,但是作为开发就被坑的天天加班了。

所以领域模型可以帮你解决,通常一些对于一些通用的领域,你可能很好找到对应模型设计,比如说订单,商品,抽奖,优惠券。但是这也需要你去阅读相关的产品文档,领域设计,当然如果你有一个靠谱的产品,你可能会轻松很多。而有一些不是通用领域的,所以需要你与你行业领域专家去深入聊,才能设计的出来领域模型,另外一点就是通常在一开始,会有些领域模型设计的有问题,需要不断的思考,纠正。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-06-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 方丈的寺院 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 摘要
  • 一.业务代码是如何写烂的
相关产品与服务
项目管理
CODING 项目管理(CODING Project Management,CODING-PM)工具包含迭代管理、需求管理、任务管理、缺陷管理、文件/wiki 等功能,适用于研发团队进行项目管理或敏捷开发实践。结合敏捷研发理念,帮助您对产品进行迭代规划,让每个迭代中的需求、任务、缺陷无障碍沟通流转, 让项目开发过程风险可控,达到可持续性快速迭代。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档