国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

軟件開發(fā)原則

這篇具有很好參考價值的文章主要介紹了軟件開發(fā)原則。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

軟件開發(fā)原則

原則 介紹
單一職責(zé)原則 一個類或模塊應(yīng)該只負責(zé)一項任務(wù)或功能
開閉原則 軟件實體(類、模塊、函數(shù)等)應(yīng)該對擴展開放,對修改關(guān)閉
里氏替換原則 子類應(yīng)該能夠替換其父類并且不會破壞程序的正確性
接口隔離原則 客戶端不應(yīng)該強制依賴它不需要的接口,即應(yīng)該將接口拆分成更小的部分
依賴倒置原則 高層模塊不應(yīng)該依賴于底層模塊,它們都應(yīng)該依賴于抽象接口
迪米特法則 一個類應(yīng)該對自己需要耦合或調(diào)用的類知道得最少(提供最簡化調(diào)用接口)
聚合復(fù)用原則 盡量使用對象組合,而不是繼承來達到復(fù)用的目的

以我個人的開源項目舉例,來介紹幾個基本軟件開發(fā)原則的基本使用

【SpringBoot集成OnlyOffice實現(xiàn)文檔預(yù)覽】

單一職責(zé)原則

模塊的單一職責(zé)

該開源項目可以作為一個jar引入,其承擔(dān)的職責(zé)就是對onlyoffice集成,實現(xiàn)對office文件的預(yù)覽和編輯。在領(lǐng)域驅(qū)動設(shè)計中,每個領(lǐng)域?qū)ο蠛途酆细ǔ?yīng)該遵循單一職責(zé)原則,確保它們只負責(zé)一個明確定義的領(lǐng)域職責(zé)。這有助于保持領(lǐng)域模型的清晰性,同時也符合單一職責(zé)原則的要求。

類的單一職責(zé)

我定義了如下幾個接口類,其中每個類只負責(zé)了單一的職能

存儲服務(wù)接口

package org.lboot.onlyoffice.loader;

import org.lboot.onlyoffice.domain.Document;

import java.io.InputStream;

/**
 * @author kindear
 * office 文檔存儲服務(wù)
 * 該服務(wù)與第三方或者本地文件系統(tǒng)集成
 */
public interface OfficeStoreLoader {
    /**
     * 根據(jù)文件 key 獲取文件信息
     * @param fileKey
     * @return
     */
    Document readFile(String fileKey);

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

}

鑒權(quán)服務(wù)接口

package org.lboot.onlyoffice.loader;

/**
 * @author kindear
 * Office 鑒權(quán)信息加載
 */
public interface OfficeAuthLoader {
    /**
     * 獲取當(dāng)前登錄用戶ID
     * @return
     */
    default String getUserId(){
        return "0";
    }

    /**
     * 獲取當(dāng)前登錄用戶名稱
     * @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";
    }

    /**
     * 獲取回調(diào)地址
     * @return
     */
    default String getCallbackUrl(){
        return "";
    }

}

開閉原則

對擴展開放,對修改關(guān)閉

將我的項目作為依賴引入后,自然而然符合對修改關(guān)閉這個特點,

集成的業(yè)務(wù)系統(tǒng)又可以基于上面所定義的接口,來拓展實現(xiàn)功能,滿足對拓展開放

具體可以查看【拓展】

里氏替換原則

子類可以擴展父類的功能,但不能改變父類原有的功能

我在代碼設(shè)計中加入了基于spring上下文的事件監(jiān)聽機制,該子類繼承自父類ApplicationEvent,該實現(xiàn)沒有改變父類可以被spring框架管理監(jiān)聽的特性,又拓展了新的字段屬性,使得該子類可以在被spring管理監(jiān)聽的基礎(chǔ)上,攜帶了更多參數(shù)。

package org.lboot.onlyoffice.event;

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

import java.time.Clock;

/**
 * @author kindear
 * office 文檔編輯構(gòu)建事件 傳入文件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);
    }
}

接口依賴原則

接口僅僅提供客戶端需要的行為,即所需的方法,客戶端不需要的行為則隱藏起來,應(yīng)當(dāng)為客戶端提供盡可能小的單獨的接口,而不要提供大的總接口

在完成配置項后,不需要用戶關(guān)注底層的編輯回調(diào),文件裝載,文件信息獲取如何實現(xiàn),該依賴為用戶提供了最簡單的調(diào)用接口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 服務(wù)實現(xiàn)類
 */
public interface OfficeCtl {
    /**
     * 根據(jù)文件后綴 獲取office 中類型
     * @param extName
     * @return 文件類型
     */
     String getDocumentType(String extName);

    /**
     * 構(gòu)建遠程文檔訪問 Document
     * @param remoteUrl
     * @return
     */
     Document buildRemoteDocument(String remoteUrl);

    /**
     * 構(gòu)建文檔預(yù)覽 DocEditor
     * @param document
     * @return
     */
     DocEditor buildPreviewDocEditor(Document document);

    /**
     * 構(gòu)建文檔編輯 DocEditor
     * @param document
     * @return
     */
     DocEditor buildEditDocEditor(Document document);

    /**
     * 預(yù)覽遠程文件
     * @return file-temp
     */
    @Deprecated
    ModelAndView previewRemoteFile(String remoteUrl, HttpServletResponse servletResponse);

    /**
     * 預(yù)覽遠程文件
     * @param remoteUrl
     * @return
     */
     ModelAndView previewRemoteFile(String remoteUrl);

    /**
     * 移動端預(yù)覽遠程文件
     * @param remoteUrl
     * @return
     */
     ModelAndView previewRemoteFileOnMobile(String remoteUrl);

    /**
     * 嵌入式預(yù)覽遠程文件
     * @param remoteUrl
     * @return
     */
     ModelAndView previewRemoteFileOnEmbedded(String remoteUrl);

    /**
     * 根據(jù)文件key 預(yù)覽文件
     * @param fileKey
     * @return 預(yù)覽試圖
     */
     ModelAndView previewFile(String fileKey);

    /**
     * 文件預(yù)覽
     * @param editor
     * @return
     */
    ModelAndView previewFile(DocEditor editor);

    /**
     * 文件預(yù)覽 制定預(yù)覽標(biāo)題
     * @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);



    /**
     * 編輯回調(diào)
     * @param params
     * @return
     */
    Object editCallback(Map<String,Object> params);

    /**
     * 將遠程訪問文件轉(zhuǎn)化為 Pdf
     * @param remoteUrl
     * @return pdf 下載地址
     */
    String covertToPdf(String remoteUrl);

    /**
     * 將文件轉(zhuǎn)化未 pdf
     * @param document
     * @return
     */
    String covertToPdf(Document document);


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

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

}

依賴倒置原則

高層模塊不應(yīng)該依賴于底層模塊,它們都應(yīng)該依賴于抽象接口

OfficeCtl接口的實現(xiàn)舉例,注入的接口全都是抽象接口,無論是基于默認的服務(wù)實現(xiàn)還是拓展實現(xiàn),都可以注入。

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

    OfficeConfigLoader configLoader;

    OfficeAuthLoader authLoader;

    OfficeStoreLoader storeLoader;

    @Resource
    ApplicationContext context;
    
    //...
}

迪米特法則

一個類應(yīng)該對自己需要耦合或調(diào)用的類知道得最少(提供最簡化調(diào)用接口)

例如讀取本地存儲系統(tǒng)文件并預(yù)覽的接口

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

我們只需要關(guān)注調(diào)用storeLoader.readFile(fileKey);可以獲取對應(yīng)的信息,對于該接口中如何獲取文件并讀取信息的實現(xiàn)不需要關(guān)注。

合成復(fù)用原則

OfficeCtl的實現(xiàn)類即是幾種服務(wù)的合成復(fù)用的案例文章來源地址http://www.zghlxwxcb.cn/news/detail-693963.html

到了這里,關(guān)于軟件開發(fā)原則的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 嵌入式:ARM常用開發(fā)編譯軟件介紹

    嵌入式:ARM常用開發(fā)編譯軟件介紹

    ADS(ARM Developer Suite),是在1993年由Metrowerks公司開發(fā)是ARM處理器下最主要的開發(fā)工具。 他的前身是SDT,SDT是ARM公司幾年前的開發(fā)環(huán)境軟件,目前SDT早已經(jīng)不再升級。ADS包括了四個模塊分別是:SIMULATOR;C 編譯器;實時調(diào)試器;應(yīng)用函數(shù)庫。ADS對匯編、C/C++、java支持的均很好,

    2024年02月06日
    瀏覽(107)
  • 軟件開發(fā)中常用數(shù)據(jù)結(jié)構(gòu)介紹:C語言隊列

    軟件開發(fā)中常用數(shù)據(jù)結(jié)構(gòu)介紹:C語言隊列

    工作之余來寫寫C語言相關(guān)知識,以免忘記。今天就來聊聊 C語言實現(xiàn)循環(huán)隊列 ,我是分享人M哥,目前從事車載控制器的軟件開發(fā)及測試工作。 學(xué)習(xí)過程中如有任何疑問,可底下評論! 如果覺得文章內(nèi)容在工作學(xué)習(xí)中有幫助到你,麻煩 點贊收藏評論+關(guān)注 走一波!感謝各位的

    2024年02月11日
    瀏覽(25)
  • FPGA_ZYNQ (PS端)開發(fā)流程(Xilinx軟件工具介紹)

    FPGA_ZYNQ (PS端)開發(fā)流程(Xilinx軟件工具介紹)

    ????????針對不同的應(yīng)用領(lǐng)域,Xilinx 公司設(shè)計開發(fā)了各種邏輯資源規(guī)模和集成各 種外設(shè)功能的Zynq SOC器件,包括專為成本優(yōu)化的Zynq-7000平臺,面向高性 能實時計算應(yīng)用領(lǐng)域的 Zynq UltraScale+ MPSoC,面向射頻通信的 ZynqUltraScale+ RFSoC,以及具備高度可擴展特性的自適應(yīng)加速平臺

    2024年01月16日
    瀏覽(19)
  • 微信小程序-----賬號注冊以及開發(fā)軟件的下載與代碼結(jié)構(gòu)介紹

    微信小程序-----賬號注冊以及開發(fā)軟件的下載與代碼結(jié)構(gòu)介紹

    目錄 前言 微信小程序 1.微信小程序簡單介紹 2.小程序與普通網(wǎng)頁開發(fā)的區(qū)別 注冊小程序開發(fā)帳號 ?微信小程序開發(fā)者工具下載 項目結(jié)構(gòu) 1.小程序項目整體結(jié)構(gòu) ?2.小程序頁面的組成部分 小程序組成部分 1. JSON 配置文件的作用 2. app.json 文件? 3. project.config.json 文件 ?4. sitem

    2024年01月17日
    瀏覽(117)
  • 華為云中對象存儲服務(wù)軟件開發(fā)工具包(OBS SDK) C語言介紹

    華為云中對象存儲服務(wù)軟件開發(fā)工具包(OBS SDK) C語言介紹

    ? ? ? 華為云的OBS介紹 :摘自華為云官網(wǎng):https://support.huaweicloud.com/obs/index.html ? ? ? 華為云的對象存儲服務(wù)(Object Storage Service, OBS)是一個基于對象的海量存儲服務(wù) ,為客戶提供海量、安全、高可靠、低成本的數(shù)據(jù)存儲能力。 ? ? ? OBS系統(tǒng)和 單個桶都沒有總數(shù)據(jù)容量和對象

    2024年02月09日
    瀏覽(24)
  • 【筆記】ARM M3-M4權(quán)威指南第二章《嵌入式軟件開發(fā)介紹》

    【筆記】ARM M3-M4權(quán)威指南第二章《嵌入式軟件開發(fā)介紹》

    2.1 ARM微控制器是由哪些構(gòu)成的 2.2 開始時需要準(zhǔn)備什么 2.2.1 開發(fā)組件,C 編譯器組件產(chǎn)品如下 2.2.2 開發(fā)板 2.2.3 調(diào)試適配板(Keil – ULINK;IAR-- I-Jet;STM Value Line Discover;JTAG/SW仿真器/在線仿真器(ICE);開源板 – ARM的CMSIC-DAP和Coocox的CoLink) 2.2.4 軟件設(shè)備驅(qū)動 2.2.5 示例(Samp

    2024年04月13日
    瀏覽(109)
  • 基于MATLAB開發(fā)AUTOSAR軟件應(yīng)用層Code mapping專題-part 3 Paramter標(biāo)簽頁介紹

    基于MATLAB開發(fā)AUTOSAR軟件應(yīng)用層Code mapping專題-part 3 Paramter標(biāo)簽頁介紹

    這頁是參數(shù)設(shè)置的界面,那首先要知道什么是參數(shù),參數(shù)就是算法中的系數(shù)這些可以更改的變量,接下來就是要學(xué)習(xí)如何創(chuàng)建參數(shù),如下圖: 打開模型資源管理器 選擇model Workspace標(biāo)簽,點擊上邊工具欄里的創(chuàng)建參數(shù)的按鈕(紅色箭頭指向的按鈕),添加一個新的參數(shù)K,值設(shè)置

    2024年02月11日
    瀏覽(87)
  • 基于MATLAB開發(fā)AUTOSAR軟件應(yīng)用層Code mapping專題-part 4 Data store標(biāo)簽頁介紹

    基于MATLAB開發(fā)AUTOSAR軟件應(yīng)用層Code mapping專題-part 4 Data store標(biāo)簽頁介紹

    這篇文章我們繼續(xù)講解code-mapping的Data stores頁,這個頁的內(nèi)容對應(yīng)的SIMULINK中的模塊是Data store memory。 我們首先在模型中創(chuàng)建一個Data store memory模塊,如圖: ? Data store memory模塊的作用相當(dāng)于一個全局變量,我們可以在模型的功能邏輯里將一個信號存進去,在另外的一個控制邏

    2024年02月11日
    瀏覽(28)
  • 基于MATLAB開發(fā)AUTOSAR軟件應(yīng)用層Code mapping專題-part 5 Signal/States標(biāo)簽頁介紹

    基于MATLAB開發(fā)AUTOSAR軟件應(yīng)用層Code mapping專題-part 5 Signal/States標(biāo)簽頁介紹

    這一篇我們說下signals和State這兩個怎么搞做映射,那首先我們要知道什么是Signal和state,我們看下模型, ? 在原來的模型里我增加了標(biāo)紅的圓圈處delay模塊,這個delay模塊就是一個state模塊,表示離散的一個狀態(tài),這個是個模型的基本概念,后續(xù)我有個專欄交接simulink建模,那

    2024年02月11日
    瀏覽(21)
  • 單片機 嵌入式開發(fā)軟件介紹對比與推薦(Keil、IAR、VSCode、Clion、STM32CubeIDE)

    單片機 嵌入式開發(fā)軟件介紹對比與推薦(Keil、IAR、VSCode、Clion、STM32CubeIDE)

    單片機 嵌入式開發(fā)軟件介紹對比與推薦(Keil、IAR、VSCode、Clion、STM32CubeIDE) KEI官網(wǎng):www.keil.com ????????Keil與MDK(Microcontroller Development Kit)是同一個軟件開發(fā)工具套件的不同名稱。 ????????Keil是一家德國公司,而MDK是他們開發(fā)的一款集成開發(fā)環(huán)境(IDE),通常稱為Keil

    2024年02月06日
    瀏覽(91)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包