代码为什么越写越乱?

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

更多文章请参见:我的blog

1. 问题域定义

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

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

2. 问题分析

2.1 怎么形成的超大类

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

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

2.2 用什么进行业务治理?

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

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

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

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

2.3 判断拆分的是否合理?

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

3. 解决域展示

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

第一阶段:facade模式

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

第二阶段:划分领域对象

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

4. 总结

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

目录
相关文章
|
前端开发 JavaScript
CSS实现禁用状态,样式设置以及不可点击事件的行为
CSS实现禁用状态,样式设置以及不可点击事件的行为
3796 0
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的农产品商城管理系统
基于Java+Springboot+Vue开发的农产品商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。 通过学习基于Java的农产品商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
371 5
基于Java+Springboot+Vue开发的农产品商城管理系统
|
存储 JavaScript 前端开发
不要滥用Pinia和Redux了!多组件之间交互可以手写一个调度器!
【8月更文挑战第24天】不要滥用Pinia和Redux了!多组件之间交互可以手写一个调度器!
270 2
不要滥用Pinia和Redux了!多组件之间交互可以手写一个调度器!
C++(十八)Smart Pointer 智能指针简介
智能指针是C++中用于管理动态分配内存的一种机制,通过自动释放不再使用的内存来防止内存泄漏。`auto_ptr`是早期的一种实现,但已被`shared_ptr`和`weak_ptr`取代。这些智能指针基于RAII(Resource Acquisition Is Initialization)原则,即资源获取即初始化。RAII确保对象在其生命周期结束时自动释放资源。通过重载`*`和`->`运算符,可以方便地访问和操作智能指针所指向的对象。
|
数据采集 Java API
java怎么设置代理ip:简单步骤,实现高效网络请求
本文介绍了在Java中设置代理IP的方法,包括使用系统属性设置HTTP和HTTPS代理、在URL连接中设置代理、设置身份验证代理,以及使用第三方库如Apache HttpClient进行更复杂的代理配置。这些方法有助于提高网络请求的安全性和灵活性。
541 0
|
Python
PyQt---------信号与槽函数的关系
PyQt---------信号与槽函数的关系
469 1
|
开发工具 git
Fatal Not possible to fast-forward, aborting
git是一个很好用的版本管理工具,然而,有时候一些冲突还是让人很郁闷的。 遇到过两次merge报错,是在不同的情形下出现的。
1695 0
|
消息中间件 存储 监控
消息队列在分布式系统中如何保证数据的一致性和顺序?
消息队列在分布式系统中如何保证数据的一致性和顺序?
|
算法 数据可视化 计算机视觉
使用Python实现图像处理中的边缘检测算法
图像处理中的边缘检测是计算机视觉和图像识别领域的重要技术之一。本文将介绍如何利用Python语言实现常见的边缘检测算法,包括Sobel、Canny等,并结合实例演示其在图像处理中的应用。
539 16
|
算法 C++ 计算机视觉
详细解读Canny检测算法与实现
详细解读Canny检测算法与实现
1174 0