软件开发原则

这篇具有很好参考价值的文章主要介绍了软件开发原则。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

软件开发原则

原则 介绍
单一职责原则 一个类或模块应该只负责一项任务或功能
开闭原则 软件实体(类、模块、函数等)应该对扩展开放,对修改关闭
里氏替换原则 子类应该能够替换其父类并且不会破坏程序的正确性
接口隔离原则 客户端不应该强制依赖它不需要的接口,即应该将接口拆分成更小的部分
依赖倒置原则 高层模块不应该依赖于底层模块,它们都应该依赖于抽象接口
迪米特法则 一个类应该对自己需要耦合或调用的类知道得最少(提供最简化调用接口)
聚合复用原则 尽量使用对象组合,而不是继承来达到复用的目的

以我个人的开源项目举例,来介绍几个基本软件开发原则的基本使用

【SpringBoot集成OnlyOffice实现文档预览】

单一职责原则

模块的单一职责

该开源项目可以作为一个jar引入,其承担的职责就是对onlyoffice集成,实现对office文件的预览和编辑。在领域驱动设计中,每个领域对象和聚合根通常应该遵循单一职责原则,确保它们只负责一个明确定义的领域职责。这有助于保持领域模型的清晰性,同时也符合单一职责原则的要求。

类的单一职责

我定义了如下几个接口类,其中每个类只负责了单一的职能

存储服务接口

package org.lboot.onlyoffice.loader;

import org.lboot.onlyoffice.domain.Document;

import java.io.InputStream;

/**
 * @author kindear
 * office 文档存储服务
 * 该服务与第三方或者本地文件系统集成
 */
public interface OfficeStoreLoader {
    /**
     * 根据文件 key 获取文件信息
     * @param fileKey
     * @return
     */
    Document readFile(String fileKey);

    /**
     * 修改文件
     * @param fileKey
     * @param stream
     * @return
     */
    boolean writeFile(String fileKey, InputStream stream);

}

鉴权服务接口

package org.lboot.onlyoffice.loader;

/**
 * @author kindear
 * Office 鉴权信息加载
 */
public interface OfficeAuthLoader {
    /**
     * 获取当前登录用户ID
     * @return
     */
    default String getUserId(){
        return "0";
    }

    /**
     * 获取当前登录用户名称
     * @return
     */
    default String getUserName(){
        return "guest";
    }
}

配置接口

package org.lboot.onlyoffice.loader;

/**
 * @author kindear
 * OnlyOffice配置加载
 */
public interface OfficeConfigLoader {
    /**
     * 获取客制化LOGO地址
     * @return
     */
    @Deprecated
    default String getCustomLogo(){
        return "";
    }

    /**
     * 获取默认语言
     * 默认 zh-CN 中文
     * @return
     */
    default String getLang(){
        return "zh-CN";
    }

    /**
     * 获取回调地址
     * @return
     */
    default String getCallbackUrl(){
        return "";
    }

}

开闭原则

对扩展开放,对修改关闭

将我的项目作为依赖引入后,自然而然符合对修改关闭这个特点,

集成的业务系统又可以基于上面所定义的接口,来拓展实现功能,满足对拓展开放

具体可以查看【拓展】

里氏替换原则

子类可以扩展父类的功能,但不能改变父类原有的功能

我在代码设计中加入了基于spring上下文的事件监听机制,该子类继承自父类ApplicationEvent,该实现没有改变父类可以被spring框架管理监听的特性,又拓展了新的字段属性,使得该子类可以在被spring管理监听的基础上,携带了更多参数。

package org.lboot.onlyoffice.event;

import lombok.Getter;
import org.springframework.context.ApplicationEvent;

import java.time.Clock;

/**
 * @author kindear
 * office 文档编辑构建事件 传入文件ID 和 用户ID
 */
@Getter
public class OfficeEditBuildEvent extends ApplicationEvent {
    String userId;

    String fileKey;

    public OfficeEditBuildEvent(Object source, String userId, String fileKey) {
        super(source);
        this.userId = userId;
        this.fileKey = fileKey;
    }

    public OfficeEditBuildEvent(Object source, Clock clock) {
        super(source, clock);
    }
}

接口依赖原则

接口仅仅提供客户端需要的行为,即所需的方法,客户端不需要的行为则隐藏起来,应当为客户端提供尽可能小的单独的接口,而不要提供大的总接口

在完成配置项后,不需要用户关注底层的编辑回调,文件装载,文件信息获取如何实现,该依赖为用户提供了最简单的调用接口OfficeCtl,所有引入该依赖的,都只需要该类即可。

package org.lboot.onlyoffice.service;

import org.lboot.onlyoffice.domain.DocEditor;
import org.lboot.onlyoffice.domain.Document;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletResponse;
import java.util.Map;

/**
 * @author kindear
 * onlyoffice 服务实现类
 */
public interface OfficeCtl {
    /**
     * 根据文件后缀 获取office 中类型
     * @param extName
     * @return 文件类型
     */
     String getDocumentType(String extName);

    /**
     * 构建远程文档访问 Document
     * @param remoteUrl
     * @return
     */
     Document buildRemoteDocument(String remoteUrl);

    /**
     * 构建文档预览 DocEditor
     * @param document
     * @return
     */
     DocEditor buildPreviewDocEditor(Document document);

    /**
     * 构建文档编辑 DocEditor
     * @param document
     * @return
     */
     DocEditor buildEditDocEditor(Document document);

    /**
     * 预览远程文件
     * @return file-temp
     */
    @Deprecated
    ModelAndView previewRemoteFile(String remoteUrl, HttpServletResponse servletResponse);

    /**
     * 预览远程文件
     * @param remoteUrl
     * @return
     */
     ModelAndView previewRemoteFile(String remoteUrl);

    /**
     * 移动端预览远程文件
     * @param remoteUrl
     * @return
     */
     ModelAndView previewRemoteFileOnMobile(String remoteUrl);

    /**
     * 嵌入式预览远程文件
     * @param remoteUrl
     * @return
     */
     ModelAndView previewRemoteFileOnEmbedded(String remoteUrl);

    /**
     * 根据文件key 预览文件
     * @param fileKey
     * @return 预览试图
     */
     ModelAndView previewFile(String fileKey);

    /**
     * 文件预览
     * @param editor
     * @return
     */
    ModelAndView previewFile(DocEditor editor);

    /**
     * 文件预览 制定预览标题
     * @param editor
     * @param title
     * @return
     */
    ModelAndView previewFile(DocEditor editor, String title);


    /**
     * 编辑远程文件
     * @param remoteUrl
     * @return
     */
    ModelAndView editRemoteFile(String remoteUrl);



    /**
     * 文件编辑
     * @param fileKey
     * @return
     */
    ModelAndView editFile(String fileKey);

    /**
     * 文件编辑
     * @param document
     * @return
     */
    ModelAndView editFile(Document document);

    /**
     * 文件编辑
     * @param editor
     * @return
     */
    ModelAndView editFile(DocEditor editor);



    /**
     * 编辑回调
     * @param params
     * @return
     */
    Object editCallback(Map<String,Object> params);

    /**
     * 将远程访问文件转化为 Pdf
     * @param remoteUrl
     * @return pdf 下载地址
     */
    String covertToPdf(String remoteUrl);

    /**
     * 将文件转化未 pdf
     * @param document
     * @return
     */
    String covertToPdf(Document document);


    /**
     * 文件生成缩略图
     * @param remoteUrl
     * @return
     */
    String generateThumbnail(String remoteUrl);

    /**
     * 文件生成缩略图
     * @param document
     * @return
     */
    String generateThumbnail(Document document);

}

依赖倒置原则

高层模块不应该依赖于底层模块,它们都应该依赖于抽象接口

OfficeCtl接口的实现举例,注入的接口全都是抽象接口,无论是基于默认的服务实现还是拓展实现,都可以注入。

@Slf4j
@Service
@AllArgsConstructor
public class OfficeCtlImpl implements OfficeCtl {
    OnlyOfficeProperties officeProps;

    OfficeConfigLoader configLoader;

    OfficeAuthLoader authLoader;

    OfficeStoreLoader storeLoader;

    @Resource
    ApplicationContext context;
    
    //...
}

迪米特法则

一个类应该对自己需要耦合或调用的类知道得最少(提供最简化调用接口)

例如读取本地存储系统文件并预览的接口

 	@SneakyThrows
  	@Override
    public ModelAndView previewFile(String fileKey) {
        Document document = storeLoader.readFile(fileKey);
        DocEditor docEditor = buildPreviewDocEditor(document);
        return previewFile(docEditor);
    }

我们只需要关注调用storeLoader.readFile(fileKey);可以获取对应的信息,对于该接口中如何获取文件并读取信息的实现不需要关注。

合成复用原则

OfficeCtl的实现类即是几种服务的合成复用的案例文章来源地址https://www.toymoban.com/news/detail-693963.html

到了这里,关于软件开发原则的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 嵌入式:ARM常用开发编译软件介绍

    ADS(ARM Developer Suite),是在1993年由Metrowerks公司开发是ARM处理器下最主要的开发工具。 他的前身是SDT,SDT是ARM公司几年前的开发环境软件,目前SDT早已经不再升级。ADS包括了四个模块分别是:SIMULATOR;C 编译器;实时调试器;应用函数库。ADS对汇编、C/C++、java支持的均很好,

    2024年02月06日
    浏览(38)
  • 软件开发中常用数据结构介绍:C语言队列

    工作之余来写写C语言相关知识,以免忘记。今天就来聊聊 C语言实现循环队列 ,我是分享人M哥,目前从事车载控制器的软件开发及测试工作。 学习过程中如有任何疑问,可底下评论! 如果觉得文章内容在工作学习中有帮助到你,麻烦 点赞收藏评论+关注 走一波!感谢各位的

    2024年02月11日
    浏览(36)
  • 微信小程序-----账号注册以及开发软件的下载与代码结构介绍

    目录 前言 微信小程序 1.微信小程序简单介绍 2.小程序与普通网页开发的区别 注册小程序开发帐号  微信小程序开发者工具下载 项目结构 1.小程序项目整体结构  2.小程序页面的组成部分 小程序组成部分 1. JSON 配置文件的作用 2. app.json 文件  3. project.config.json 文件  4. sitem

    2024年01月17日
    浏览(49)
  • FPGA_ZYNQ (PS端)开发流程(Xilinx软件工具介绍)

            针对不同的应用领域,Xilinx 公司设计开发了各种逻辑资源规模和集成各 种外设功能的Zynq SOC器件,包括专为成本优化的Zynq-7000平台,面向高性 能实时计算应用领域的 Zynq UltraScale+ MPSoC,面向射频通信的 ZynqUltraScale+ RFSoC,以及具备高度可扩展特性的自适应加速平台

    2024年01月16日
    浏览(52)
  • 华为云中对象存储服务软件开发工具包(OBS SDK) C语言介绍

          华为云的OBS介绍 :摘自华为云官网:https://support.huaweicloud.com/obs/index.html       华为云的对象存储服务(Object Storage Service, OBS)是一个基于对象的海量存储服务 ,为客户提供海量、安全、高可靠、低成本的数据存储能力。       OBS系统和 单个桶都没有总数据容量和对象

    2024年02月09日
    浏览(56)
  • 【笔记】ARM M3-M4权威指南第二章《嵌入式软件开发介绍》

    2.1 ARM微控制器是由哪些构成的 2.2 开始时需要准备什么 2.2.1 开发组件,C 编译器组件产品如下 2.2.2 开发板 2.2.3 调试适配板(Keil – ULINK;IAR-- I-Jet;STM Value Line Discover;JTAG/SW仿真器/在线仿真器(ICE);开源板 – ARM的CMSIC-DAP和Coocox的CoLink) 2.2.4 软件设备驱动 2.2.5 示例(Samp

    2024年04月13日
    浏览(37)
  • 基于MATLAB开发AUTOSAR软件应用层Code mapping专题-part 3 Paramter标签页介绍

    这页是参数设置的界面,那首先要知道什么是参数,参数就是算法中的系数这些可以更改的变量,接下来就是要学习如何创建参数,如下图: 打开模型资源管理器 选择model Workspace标签,点击上边工具栏里的创建参数的按钮(红色箭头指向的按钮),添加一个新的参数K,值设置

    2024年02月11日
    浏览(29)
  • 基于MATLAB开发AUTOSAR软件应用层Code mapping专题-part 4 Data store标签页介绍

    这篇文章我们继续讲解code-mapping的Data stores页,这个页的内容对应的SIMULINK中的模块是Data store memory。 我们首先在模型中创建一个Data store memory模块,如图:   Data store memory模块的作用相当于一个全局变量,我们可以在模型的功能逻辑里将一个信号存进去,在另外的一个控制逻

    2024年02月11日
    浏览(65)
  • 基于MATLAB开发AUTOSAR软件应用层Code mapping专题-part 5 Signal/States标签页介绍

    这一篇我们说下signals和State这两个怎么搞做映射,那首先我们要知道什么是Signal和state,我们看下模型,   在原来的模型里我增加了标红的圆圈处delay模块,这个delay模块就是一个state模块,表示离散的一个状态,这个是个模型的基本概念,后续我有个专栏交接simulink建模,那

    2024年02月11日
    浏览(31)
  • 单片机 嵌入式开发软件介绍对比与推荐(Keil、IAR、VSCode、Clion、STM32CubeIDE)

    单片机 嵌入式开发软件介绍对比与推荐(Keil、IAR、VSCode、Clion、STM32CubeIDE) KEI官网:www.keil.com         Keil与MDK(Microcontroller Development Kit)是同一个软件开发工具套件的不同名称。         Keil是一家德国公司,而MDK是他们开发的一款集成开发环境(IDE),通常称为Keil

    2024年02月06日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包