在做一个新项目,架构和功能很简单。大家讨论的时候对应用程序的模块划分都有自己的一些看法。需要的下面两个模块大家没有分歧,分别是core模块和web1模块、web2模块,因为最后对外会提供两个独立的web应用。这两个应用针对不同的业务,实现也稍有不同。
这个架构整体是一个模板模式的,有通用的实现,还有一些接口需要web1和web2各自实现,还会涉及一个工具类。主要的分歧有:
1>工具类要不要提取一个专门的commons模块
2>流程模板放在core里没有异议,那针对需要各自实现的接口要不要单独提取一个模块。
大家都表示最后怎么划分都支持,不会强烈坚持自己的观点,因为实际上对后续开发维护的影响不是很大。我决定用周末的时候把这个问题想明白,因为划分问题除了实用角度,更多是一个专业性的问题。
我之前写过一篇文章《你们项目的核心战略是什么》里有提到模块划分:按照之前项目标配是划分了commons模块的,但是在《关于Java两点需要更新的知识》里我也提到,知识是要常常反思并进行更新的。没有调研,不要盖棺定论。
思路是采用登高类比法进行业界调研得出结论登高类比法是先检索最为相似的场景以得出结论。如果检索结果不够时再扩大范围直到足以得出结论。比如设计一个IP分配方法,检索时先检索IP分配,在网上比较权威的大概只有DHCP动态主机配置了。但是我们需要的不是动态,可以退而检索资源分配。
工具类要不要提取一个专门的commons模块
自己不知道怎么做好的时候,就看好的是怎么做的。首先调研了一下spring。极简标配:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring.boot.version}</version>
</dependency>
项目引入了上面两个maven坐标,看对应的spring包都引入了什么:
这里包含了spring-core和spring-web,spring并没有spring-commons模块,大家常用的都是apache-commons或者hutool这种专业的工具包。那针对业务上通过的工具像spring这种大拿级别都是怎么来处理的呢?
来看spring-core的目录结构
工具在util下面。这里注意是util而不是utils单数。这个地方命名风格部分有规约:
阿里巴巴Java开发手册
【强制】包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用 单数形式,但是类名如果有复数含义,类名可以使用复数形式。
正例:
应用工具类包名为com.alibaba.open.util、类名为MessageUtils(此规则参考 spring 的框架结构)
【强制】杜绝完全不规范的缩写,避免望文不知义。
反例:
AbstractClass“缩写”命名成 AbsClass;condition“缩写”命名成 condi,此类随 意缩写严重降低了代码的可阅读性。
各自实现的接口要不要单独提取一个模块
模板架构我想了一下,比较合适的参考是mybatis-plus。这是一个mybatis的增强工具。使用这个工具,每个Mapper都需要继承BaseMapper。它的位置是:
其实我还调研了其他一些框架,结论就是放到core模块下。
总结
自己不知道怎么做好的时候,就看好的是怎么做的。