浅谈代码如何进行分层设计

产生背景

业务复杂、需求不断、人员变更快、问题多等诸多原因导致项目分层混乱,服务技术是基于PaaS开发的服务定义Jstorm Topo的一个分布式服务。

存在问题

  1. 服务初始化混乱,如有通过PostConstruct注解初始化,有通过Spout的open初始化,有通过Bolt的prepare方法初始化,有通过其他一些初始化方法初始化的;    
  2. 服务没有按需初始化,例如Spout、Bolt需要的依赖数据是不一样的,分布式服务,需要根据业务需求按需初始化;
  3. 开发新需求时,很难决定类建在何处更合适,在扩展旧的需求时,经常需要稍等重构很多的代码,重复代码极其多;
  4. 缓存使用混乱,无法统计项目使用的堆内、堆外内存,且随意创建缓存,导致服务运行期间产生大量OOM;
  5. 设计模式意识淡薄,例如在写文件时,代码套用在一起,用if-else去分流逻辑,慢慢积累下来,项目硬编码极其多,往往在做新需求时才发现现有框架已不支持,导致需求完成时间骤增;
  6. 线程乱用,随意创建线程,运行期间导致线程数量暴增,在大容量下导致IO问题,为定位问题造成了很大的困难。

为什么需要好的分层设计

  1. 节省内存资源,按需初始化缓存,缩短服务初始化时间;
  2. 需求扩展时更得心应手,让新手书写功能时,知道如何更好去写代码;
  3. 更好的管理业务,不能一写需求牵一发而动全身;
  4. 好的分层设计,可以减少代码重复度,更好的减少硬编码;
  5. 好的分层设计,可以让开发人员更好的理解业务;
  6. 好的分层设计,可以让项目分工更加明确,可读性大大提升。

什么是好的分层设计

  1. 方便后续代码进行维护扩展;
  2. 分层的效果需要整个团队都能接受;
  3. 各个层职责边界清晰。

怎样做好分层设计

大部分项目分层在主体上是分为三层架构,秉持着”高内聚低耦合”的思想去设计项目的分层。横向切割,根据业务职责划分。划分的目的是规划软件系统的逻辑结构便于开发维护。要做到根据领域建模,模型之间隔离。
请求处理层(Controller层)               VO
业务逻辑层(Service层)                   BO
数据持久层(Dao层)                        DO

请求处理层:三块能力 一个是通过模板引擎渲染; 二 是 对外提供的restful接口; 三 是对上游业务提供的RPC接口
数据持久层:承载了数据存储和访问的能力,它既与底层数据进行交换,又通过Proxy的代理和包装与远程服务数据进行联动。
业务逻辑层:职责是与数据持久层交互
但随着业务的发展,微服务的拆分,分布式服务架构的盛行,三层架构逐渐无法满足业务的需要。

分层中各数据模型的解释说明:
DO(Data Object):与数据库表结构一一对应,通过DAO层向上传输数据源对象
DTO(Data Transfer Object):远程调用对象,RPC服务提供的领域模型,需保证序列化
BO(Business Object):业务对象。由Service层输出的封装业务逻辑的对象
VO(View Object):显示层对象。通常是Web向模板渲染引擎层传输的对象
DAO(Data Access objects):数据传输对象,Service或者Manager向外传输的对象
AO(Access objects):应用对象。在Web层与Service层之间抽象的复用对模型,极为贴近展示层,复用度不高

细节分层

  • 查询分层
  • 枚举分层

猜你喜欢

转载自blog.csdn.net/u010313979/article/details/106968972
今日推荐