一:背景介绍
在开发项目的过程中非常容易出现的一种现象就是用什么我就直接写什么,就像我们从数据库读或者存数据一样。我们想要什么数据就从数据库中获取什么样的数据。没有考虑是否浪费了资源的开销。代码是不是复用的问题。
以上两个图都是没有体现复用思想的例子。两个类似的业务场景写了两个接口、两个接口、两个实现类、两个sql,下面我们将上面的代码进行改造。
二:概念说明
复用思想
复用思维的核心理念是“不要重复造轮子”,即避免重复编写相同或类似的代码,而是寻找已有的解决方案并进行适当的修改和调整以满足新的需求。复用思维可以应用于不同层次和领域的软件开发,包括代码级别、模块级别、组件级别和架构级别。
「 代码级别 」复用思维可以通过创建函数、类和库来实现。开发人员可以编写通用的函数或类,将其封装成库,并在需要时引用它们,避免重复编写相同的代码。这样可以提高代码的可维护性和可重用性,并减少开发和测试的工作量。
「 模块级别 」复用思维可以通过将已有的模块或组件应用于新的项目中来实现。开发人员可以将已经开发和测试过的模块或组件作为独立的模块,并在新的项目中进行集成和配置。这样可以节省开发时间和成本,并提高项目的稳定性和可靠性。
「 组件级别 」复用思维可以通过使用现有的软件组件或框架来实现。开发人员可以使用第三方库、开源组件或商业框架来构建应用程序,而不是从头开始编写所有的代码。这样可以加快开发速度,降低开发风险,并提供更好的功能和性能。
「 架构级别 」复用思维可以通过定义和应用标准化的架构模式和设计原则来实现。开发人员可以使用已有的架构模式(如MVC、MVVM等)和设计原则(如单一职责原则、开闭原则等)来指导项目的架构设计和实现。这样可以提高系统的可扩展性、可维护性和可重用性。
接口
在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。简单理解为向外提供统一的行为。
三:思路&方案
两个接口都是都是实现查询在线人员的情况,区别在去两个接口的入参不同。这里我们可以通过使用mybatis的动态SQL进行实现。
四:过程
1.Controller层接口的复用
代码实现
Controller层
/* * @description:查询课程内容 * @author: 武梓龙 * @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层
public interface ICourseContentService { List<CourseContentEntity> queryCourseContent(CourseContentEntity courseContent); }
ServiceImpl层
/* * @description:查询课程内容 * @author: 武梓龙 * @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); <!--通用查询语句--> <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>
效果展示
2.Mapper层sql语句的复用
代码实现
效果展示
通过编写通用sql我们对于用一个表的查询(其他的增删改也是可以的)就只需要一个sql语句就可以了,通过传入的参数不同,我们得到的结果也会不同。以下是同一个sql语句传入两个参数和传输三个参数的结果。
五:总结
面向对象的三个特征是封装继承和多态,封装的目的就是让代码复用性强。便于后期的维护。所以在进行编码之前首先要考虑的就是我们写的代码有没有通用性和抽象性。是不是别人有类似的业务的时候能复用我们写的代码。编写的代码更加的有价值。