代码为什么越写越乱?

简介: 这个问题往大的说是业务治理问题,往小了说是代码分拆。且看作者怎么写出好代码。

更多文章请参见:我的blog

1. 问题域定义

这个问题往大的说是业务治理问题,往小了说是代码分拆。
我的建议是自顶向下的思考,自顶向下的思考方式一方面全局的看一个问题,能给出一个问题最优解,另一方面因为只有这样才有成长,才能在下次遇到类似问题时解决问题。

考虑清楚为什么会形成超大的类?
可以通过哪些方法对业务进行拆分,以达到拆分的效果?
拆分完成之后怎么判断拆分的是否合理?

2. 问题分析

2.1 怎么形成的超大类

刚开始编写这个文件的时候,我相信作者肯定是已经想过了这个类要负责什么,哪些业务应该在这个类中,这个类与上下游的关系是什么样的。但是最初在第一次业务变更时有一点不太应该在本类中加进来的业务代码,但跟本类有这强联系的代码就直接加。之后总有类似的事情发生,总有不是强相关,但又有关系的代码加入进来。导致代码随着业务不断地变化与调整,而逐渐的陷入混乱

所以,不必担心业务代码不会增长,它的增长是不受控制的。就像物理学中的熵增定律一样,在一个封闭系统中,如果没有外部做功,它就会逐渐陷入混乱。

2.2 用什么进行业务治理?

业务代码的增长,随后陷入混乱是必然的,这件事是不是让人感到这个问题就无解了。因为不管改多少遍都会陷入混乱,在一个无法解决的问题上人们总是会感觉到无力,从而丧失解决从根本上解决问题的力量。

不要使用上帝类,在DDD中有上帝类的概念。上帝类就是在一个类中解决所有的问题,可以看到MVC模式中的Service就是上帝类的完美代表。所以,不要只用一种模式解决所有的问题。这里给出的都是思考的过程以及方式来解决问题。所以可能会感觉到泛泛之谈。

这里主要思想是DDD,但是经过了一些变形:明确服务边界,定义服务内容,阐述服务关系。具体到代码拆分上:

**从业务上划分包**:包中的业务是对于特定的业务实体的操作。
**定义包的边界**:包中的实体发生变化,应该以事件的方式通知其他关心的业务。而不是由本包解决所有的外部问题
**明确包与包之间的关系**:包中只负责本包该处理的业务,不负责其他业务实体的业务。例如:在下单之后,应该以事件的方式通知仓库,支付,物流等等去做该做的事情。而不是自己去做。

2.3 判断拆分的是否合理?

最简单的规则就是单一职责,拆分后的内容是否符合单一职责。然后就是扩展到SOLID规则。

3. 解决域展示

实际解决过也是一个不断演化的过程,接受代码会随着时间不断的变化才会接受这种解决方式。

第一阶段:facade模式

将facade类作为能力透出类,而拆分出的实际工作类作为业务功能类。例如:策略部署其实可以分为策略定义和策略的使用,就可以使用facade类向外暴露接口能力,然后策略定义一个类,测录使用一个类。

第二阶段:划分领域对象

进一步就是就是将拆分出的两个实现类再拆分为:工具类,服务类,外部事件处理类,领域事件类。从名字就可以知道它这些类的意义。

4. 总结

业务治理是长期工作,需要理解问题产生的原因才可以真正的解决问题。

目录
相关文章
|
2月前
|
设计模式 IDE Java
如何将代码写的更加优雅?
如何将代码写的更加优雅?
32 0
|
8月前
|
设计模式 存储 Java
写出漂亮代码的45个小技巧(上)
大家好,我是三友~~ 不知道大家有没有经历过维护一个已经离职的人的代码的痛苦,一个方法写老长,还有很多的if else ,根本无法阅读,更不知道代码背后的含义,最重要的是没有人可以问,此时只能心里默默地问候这个留坑的兄弟。。
写出漂亮代码的45个小技巧(上)
最近特火的爱心代码来了
最近因为一部《点燃我温暖你》的电视剧而爆火的爱心代码不会还有人不会制作吧。
最近特火的爱心代码来了
|
SQL 人工智能 前端开发
无代码的未来
随着无代码技术越来越成熟,很多web应用已经可以基于无代码平台进行开发。本文分析了4个最流行的无代码平台,并梳理了无代码行业今后可能的发展方向。
393 0
无代码的未来
|
前端开发 C++
这几行代码,真的骚!
这几行代码,真的骚!
这几行代码,真的骚!
|
设计模式 IDE Java
最好的代码是没有代码
对于大多数软件开发者来说,要让他们承认这一点是很痛苦的,因为他们爱他们的代码。你写的每一行新代码都需要经过调试,需要具备可阅读性和可维护性。
最好的代码是没有代码
这一团糟的代码,真的是我写的?!
阿里妹导读:你有没有遇到过这种情况:过几周或者几个月之后,再看到自己写的代码,感觉一团糟,不禁怀疑人生?我们每天都与代码打交道,但当被问道什么是好的代码时,很多人可能会先愣一下,然后给出的回答要么比较空泛,要么比较散,没办法简单明了地概括出来。今天,我们就来说什么是好的代码?
28848 0

热门文章

最新文章

  • 1
    流量控制系统,用正则表达式提取汉字
    25
  • 2
    Redis09-----List类型,有序,元素可以重复,插入和删除快,查询速度一般,一般保存一些有顺序的数据,如朋友圈点赞列表,评论列表等,LPUSH user 1 2 3可以一个一个推
    26
  • 3
    Redis08命令-Hash类型,也叫散列,其中value是一个无序字典,类似于java的HashMap结构,Hash结构可以将对象中的每个字段独立存储,可以针对每字段做CRUD
    25
  • 4
    Redis07命令-String类型字符串,不管是哪种格式,底层都是字节数组形式存储的,最大空间不超过512m,SET添加,MSET批量添加,INCRBY age 2可以,MSET,INCRSETEX
    27
  • 5
    S外部函数可以访问函数内部的变量的闭包-闭包最简单的用不了,闭包是内层函数+外层函数的变量,简称为函数套函数,外部函数可以访问函数内部的变量,存在函数套函数
    23
  • 6
    Redis06-Redis常用的命令,模糊的搜索查询往往会对服务器产生很大的压力,MSET k1 v1 k2 v2 k3 v3 添加,DEL是删除的意思,EXISTS age 可以用来查询是否有存在1
    30
  • 7
    Redis05数据结构介绍,数据结构介绍,官方网站中看到
    21
  • 8
    JS字符串数据类型转换,字符串如何转成变量,+号只要有一个是字符串,就会把另外一个转成字符串,- * / 都会把数据转成数字类型,数字型控制台是蓝色,字符型控制台是黑色,
    19
  • 9
    JS数组操作---删除,arr.pop()方法从数组中删除最后一个元素,并返回该元素的值,arr.shift() 删除第一个值,arr.splice()方法,删除指定元素,arr.splice,从第一
    19
  • 10
    定义好变量,${age}模版字符串,对象可以放null,检验数据类型console.log(typeof str)
    19