4.1.3 系统的模块化以及分层分类
使用上面的java注解,对代码中模块进行打标 。
业务模块化,并且做了分层与分类,那么系统中的代码需要根据业务中的分层分类进行进行分类打标,使其与业务分层分类保持一致 。
4.1.4 持续重构(Continue Refactor)我们这个世界够复杂了吧,如果让你设计一个IT系统来实现刻画这个世界的方方面面,我打赌一定没有人搞得定;但现实中的这个世界还是能够有条不紊的发展演进,没有需要出现“推倒重来”的现象,为什么呢, 我认为是我们的世界一直在用各种方式不停的重构 。
“物竞天择,适者生存”出自达尔文的进化论,达尔文在1859年出版的《物种起源》一书中系统地阐述了他的进化学说 。物竞天择,适者生存是指物种之间及生物内部之间相互竞争,物种与自然之间的抗争,能适应自然者被选择存留下来的一种丛林法则 。
对于软件系统也是这样,业务是在不停的发展, 我们的认知也是一直不断的更新,当“我们”通过可视化的能力树发现一些突兀时,那肯定是某个或者某些模块拆分不正确,或者模块提供的能力不合适,这时,我们就可以考虑对模块树进行重构了,要么是拆分模块,要么是调整模块的关系,要么是修改模块的职责 。
4.1.5 关于产品需求如果产品了解MTDD,那么就会提出更加符合产品化的需求了
如果研发对MTDD理解深入,那么当产品的需求不符合产品化,能力化时,就会与产品进行沟通,产品修改需求,以便更好的设计出产品化,系统能力化的需求 。
×不好的产品需求
- 对现有系统能力的扩展
- 增加新的系统能力
4.2 MTDD战术层(MTDP)MTDP的全称是Module Tree Drive Programing, 领域树驱动编程 。
4.2.1 模块注解@Module的定义
/** * * 模块注解,打在一个服务类上,Module注解是继承了Component注解,因此它注解的类可以被实例化到Spring中去 * 服务启动时会扫码所有Module类,将他们组装成树进行持久化 。*/@Target({ElementType.TYPE, ElementType.ANNOTATION_TYPE})@Retention(RetentionPolicy.RUNTIME)@Component@Documentedpublic @interface Module {/*** 该模块的key* 在设置模块的key的时候,在同一个服务里面(同一个根节点),如果两个类设置的key是一样,最后会被去重为一个模块,无论是单体服务还是分布式工程 。* moduleKey全局唯一,就算它们归属不同的根节点,也不能设置一样的moduleKey,* 不同根节点的模块,如果设置了同一个moduleKey,后部署的服务将无法能力树的变更情况进行持久化 。* @return*/String moduleKey();/*** 用于指定该模块的父模块,* 根节点的parentModule指定为 {@link Void}.class 。* 每个模块指定他们的夫模块,直到可达根节点,最后生成一颗树 。* 指定parentModule时一定要注意,不能循环依赖了,循环依赖的情况下,服务将抛出异常无法启动,* @return*/Class<?> parentModule();/*** 该模块名称* @return*/String moduleName();/*** 模块描述,一个该模块详细的描述* @return*/String moduleRemark() default "";/*** 能否被剪枝,你是可以设置模块能不能被剪枝,默认是不可以的(后续会根据数量对比情况进行调整默认值) 。* 我们应该将系统中必要的功能设置为无法裁减,将那些加强性的能力,智能化的能力,衍生化的能力,非基本的能力设置为可以裁减* @return*/boolean cutAble() default false;}
模块的具体例子:
@Module(moduleKey = "scm.wms", moduleName = "WMS", parentModule = NULL)public class WmsModule {//业务逻辑}@Module(moduleKey = "scm.wms.inner.test1", moduleName = "测试模块1", parentModule = WmsModule.class)public class InnerTestModule1 {//业务逻辑}@Module(moduleKey = "scm.wms.inner.test2", moduleName = "测试模块2", parentModule = WmsModule.class)public class InnerTestModule2 {//业务逻辑}
4.2.2 模块树每个模块都有父模块ParentModule,跟模块的父模块为NULL,模块树则是由所有模块组成的一个树状结构的树 。文章插图
图片
4.2.3 裁剪与恢复
推荐阅读
- 网络安全测试的七种主要类型
- 大规模图神经网络应用和最新范式的探索
- 14个让你惊艳的JavaScript Web API!
- 为什么从 MVC 到 DDD,架构的本质是什么?
- 关于数据库选型中的几个问题谈谈我的观点
- Go中“哨兵错误”说法的由来及使用建议
- 你了解ai绘画二次元男生图片怎么画的吗?
- 人工智能技术的新里程碑:文心一言如何改变人机交互方式
- ChatGPT提示词的万能公式,探索ChatGPT使用潜能
- “敌友之争”?你被AI骗过吗