SpringMVC模块划分的思考

背景

现在的后端开发大多数都用Maven进行项目管理及自动构建。 而Maven的最佳实践是将项目进行模块划分,所谓分而治之。
那么问题来了,模块划分是按照功能(业务/子系统)来划分还是按照分层思想进行划分?
通常项目都会按照一个原则进行设计:高内聚 低耦合
我想先对两个划分方式进行优劣比较。

需求

要开发一个物联网设备云;支持MQTT协议,CoAP协议,Socket IO协议(Netty,smart-socket);对外提供OAuth2.0授权服务;支持对话式人工智能平台的智能家居技能;使用消息队列服务处理消息数据;支持设备管理等。

团队

该团队有4个人,协作开发。

按功能模块划分(垂直)

每一个模块都是一个完整的业务

  1. 耦合性低;
  2. 减少与其他模块之间的交互;
  3. 逻辑更加清晰;
  4. 只需依赖公共基础模块utilscommonfilterinterceptor等;

  1. 接触面太广;
  2. 避免不了对其他包的依赖;

按分层思想划分(水平)

多个模块整合成一个完整的业务

  1. 开发者更专注与业务逻辑;
  2. 方便代码重用,只需添加依赖即可,例如daoservice

  1. 耦合性高;
  2. 沟通成本高;
  3. 需要整个项目进行编译;
  4. 容易影像这个项目进度;

结论

  1. 考虑项目大小:多功能项目按功能划分,子系统/子模块中再按分层思想划分。
  2. 考虑部署方式:如果模块独立部署则模块为大,如果分层部署,则层为大;
  3. 考虑团队大小:如果是小团队,或者一个人,分层思想较好,一层一层的实现。

参考文档

Maven最佳实践:划分模块
OSChina讨论