项目实战典型案例6——没有复用思想

简介: 项目实战典型案例6——没有复用思想

这里写目录标题

一:背景介绍

本篇博客是对项目开发中出现的没有复用思想的反例进行的总结并进行的改进。目的是将经历转变为自己的经验。通过博客的方式分享给大家,大家一起共同进步和提高。

反例



反例一解读:

这两个归根到底都是查询在线人员,并且返回的数据类型和结构都是一致的。我们完全有条件可以只写一个接口来实现这两个类似的功能。

反例二解读:

这里使用了mybatis动态SQL进行处理,但是对于course_id与class_id完全可以抽出来,作为公共的进行使用。

思路&方案

模拟代码的环境为:spring boot、 spring mvc 、mybatis、mysql

反例一的优化思路和方案

对于反例一的优化思路:两个查询在线人员的的接口我们可以使用一个接口进行实现,两个接口的区别主要是在于入参不一致,这里我们可以通过使用mybatis的动态SQL进行实现。这样我们由之前的两个接口的(两个controller、两个IService、两个ServiceImpl、两个mapper、两个sql)转变成了一个(controller、Iservice、ServiceImpl、mapper、sql)。

反例一优化的模拟代码

Controller层

 /*
     * @description:查询课程内容
     * @author: wangwei
     * @date: 2023/3/7 16:00
     * @param: [courseContent]
     * @return: java.util.List<com.wangwei.mvc.entity.CourseContentEntity>
     **/
    @PostMapping("/queryCourseContent")
    public List<CourseContentEntity> queryCourseContent(@RequestBody CourseContentEntity courseContent){
        return iCourseContentService.queryCourseContent(courseContent);
    }

IService层

List<CourseContentEntity> queryCourseContent(CourseContentEntity courseContent);

ServiceImpl层

  @Resource
    CourseContentMapper courseContentMapper;
    /*
     * @description:查询课程内容
     * @author: wangwei
     * @date: 2023/3/7 15:57
     * @param: [courseContent]
     * @return: java.util.List<com.wangwei.mvc.entity.CourseContentEntity>
     **/
    @Override
    public List<CourseContentEntity> queryCourseContent(CourseContentEntity courseContent) {
        return courseContentMapper.queryCourseContentRecord(courseContent);
    }

mapper层

//通用查询语句
    List<CourseContentEntity> queryCourseContentRecord(CourseContentEntity courseContentEntity);

mapper.xml

<select id="queryCourseContentRecord" resultMap="courseContentMap">
        SELECT id,course_assembly_id,assembly_content,create_time,created_id,created_by,update_time,updated_id,updated_by
        FROM  tar_course_content_info
        WhERE
        is_delete=0
        <if test="id != null"> and id = #{id} </if>
        <if test="courseAssemblyId != null">and course_assembly_id = #{courseAssemblyId}</if>
        <if test="assemblyContent != null">and assembly_content = #{assemblyContent}</if>
        <if test="createdBy != null">and created_by = #{createdBy}</if>
        <if test="updatedBy != null">and updated_by = #{updatedBy}</if>
        <if test="remark != null">and remark = #{remark}</if>
    </select>

测试

1.先查询所有的课程内容,不传入任何的参数



2.查询创建人为张有博的课程内容,传入参数createBy=“张有博”




优化之前的缺点与优化之后的优点

优化之前:

  1. 由于没有进行复用导致代码大量重复,工作量是之前的2倍。对于后序的代码开发大大的增加了工作量。
  2. 会照成对于单表的crud过多,例如没有采用复用的思想以及动态sql将会导致后序对于单表的查询过多,造成难以维护,维护量大。
    优化之后:
  3. 代码量小,复用性强,可以满足90%以上对于这张表的查询。
  4. 维护维护成本低,只需要维护这一个查询接口

反例二的优化思路和方案

反例二的优化思路:将的course_id与class_id抽出作为公共数据使用。这样代码体现出代码的复用思想,以及维护量也小的多。

反例二优化的模拟代码

测试




优化之前的缺点与优化之后的优点

优化之前的缺点:代码冗余没有复用思想,比较不好维护。

优化之后的优点:将公共代码进行了复用,体现了复用思想,提高对于代码复用,代码维护。

四:总结

1.在设计之初应该想到如何设计接口如何设计,如何提高效率,如何到达复用强,维护成本低,扩展性强。是面向对象的设计还是面向过程的设计,最后选择一种复合当前项目的设计思想,并按照这个设计思想进行设计和开发。

目录
相关文章
|
7月前
|
存储 缓存 监控
《优化接口设计的思路》系列:第二篇—接口用户上下文的设计与实现
大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。 作为一名从业已达六年的老码农,我的工作主要是开发后端Java业务系统,包括各种管理后台和小程序等。在这些项目中,我设计过单/多租户体系系统,对接过许多开放平台,也搞过消息中心这类较为复杂的应用,但幸运的是,我至今还没有遇到过线上系统由于代码崩溃导致资损的情况。这其中的原因有三点:一是业务系统本身并不复杂;二是我一直遵循某大厂代码规约,在开发过程中尽可能按规约编写代码;三是经过多年的开发经验积累,我成为了一名熟练工,掌握了一些实用的技巧。
57 0
|
6天前
|
敏捷开发 架构师 Java
【领域驱动设计专题】一文带领你透视DDD领域驱动模型的本质和设计原理分析指南(基本概念篇)
【领域驱动设计专题】一文带领你透视DDD领域驱动模型的本质和设计原理分析指南(基本概念篇)
74 0
|
6天前
|
消息中间件 并行计算 Go
skynet设计原理
skynet设计原理
|
10月前
|
SQL 前端开发 Java
【项目实战典型案例】06.没有复用思想
【项目实战典型案例】06.没有复用思想
|
10月前
项目实战6—没有复用思想的反例
项目实战6—没有复用思想的反例
39 0
|
10月前
|
前端开发
项目实战典型案例22——原型图的面向对象思路
项目实战典型案例22——原型图的面向对象思路
52 1
|
10月前
|
前端开发
项目实战22—原型图的复用思想
项目实战22—原型图的复用思想
52 0
【项目实战典型案例】22.原型图的面向对象
【项目实战典型案例】22.原型图的面向对象
【项目实战典型案例】22.原型图的面向对象
|
前端开发 架构师 JavaScript
谈谈架构的本质和架构分类
谈谈架构的本质和架构分类
|
设计模式 缓存 前端开发
MVC架构思想简介
MVC架构思想简介