軟件開發(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)注。文章來源:http://www.zghlxwxcb.cn/news/detail-693963.html
合成復(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)!