LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

軟件工程:?jiǎn)我宦氊?zé)原則(SRP)

admin
2023年7月12日 8:49 本文熱度 777

在開發(fā)軟件時(shí),通常會(huì)面臨一個(gè)問(wèn)題:如何設(shè)計(jì)類和模塊,使其易于理解、修改和維護(hù)?

這就需要我們遵循一些設(shè)計(jì)原則,其中單一職責(zé)原則(SRP)是其中之一。

單一職責(zé)原則的核心思想是一個(gè)類或模塊只應(yīng)該有一個(gè)職責(zé),即一個(gè)類或模塊只負(fù)責(zé)一項(xiàng)功能。

這個(gè)原則是面向?qū)ο笤O(shè)計(jì)中最重要的原則之一,它可以提高代碼的可讀性、可維護(hù)性和可擴(kuò)展性。

今天,我們將深入探討單一職責(zé)原則,以及如何在實(shí)際開發(fā)中遵循這個(gè)原則。

Part1什么是單一職責(zé)?

單一職責(zé)原則(Single Responsibility Principle,簡(jiǎn)稱 SRP)是指一個(gè)模塊或類只應(yīng)該負(fù)責(zé)單一的功能或責(zé)任。換句話說(shuō),一個(gè)類或模塊應(yīng)該只有一個(gè)引起它變化的原因。

SRP 是面向?qū)ο笤O(shè)計(jì)的一個(gè)基本原則,它可以提高代碼的可維護(hù)性、可讀性、可擴(kuò)展性和可重用性。

如果一個(gè)模塊或類負(fù)責(zé)過(guò)多的功能,那么它會(huì)變得復(fù)雜、難以理解和難以修改。

相反,如果一個(gè)模塊或類只負(fù)責(zé)一個(gè)功能,那么它的職責(zé)就更加清晰明確,容易被理解和維護(hù)。

SRP 還可以幫助開發(fā)人員更好地組織代碼結(jié)構(gòu),使其更加模塊化和靈活。

通過(guò)將不同的職責(zé)分離成不同的類或模塊,可以使得代碼更易于擴(kuò)展和修改,也更容易進(jìn)行測(cè)試和重用。

Part2一個(gè)案例

以下是一個(gè)簡(jiǎn)單的 Java 代碼示例,演示了如何逐步應(yīng)用單一職責(zé)原則,來(lái)改進(jìn)代碼設(shè)計(jì)。

1初始版本

首先是一個(gè)最初的版本,這個(gè)版本的代碼實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的功能:讀取一個(gè)文件并將其中的內(nèi)容轉(zhuǎn)換為字符串。

但是,這個(gè)版本的代碼職責(zé)過(guò)于復(fù)雜,既包含了文件操作,也包含了字符串操作,違反了單一職責(zé)原則。具體代碼如下:

public class FileReader {
    
    public String readfromFile(String filename) throws IOException {
        File file = new File(filename);
        BufferedReader br = new BufferedReader(new FileReader(file));
        StringBuilder sb = new StringBuilder();
        String line;
        while ((line = br.readLine()) != null) {
            sb.append(line);
        }
        br.close();
        return sb.toString();
    }
}

2改進(jìn)版

接下來(lái),我們可以使用單一職責(zé)原則來(lái)改進(jìn)這個(gè)代碼:將其拆分為兩個(gè)類,每個(gè)類只負(fù)責(zé)一項(xiàng)職責(zé)。具體代碼如下:

public class FileReader {
    
    public String readfromFile(String filename) throws IOException {
        File file = new File(filename);
        BufferedReader br = new BufferedReader(new FileReader(file));
        StringBuilder sb = new StringBuilder();
        String line;
        while ((line = br.readLine()) != null) {
            sb.append(line);
        }
        br.close();
        return sb.toString();
    }
}

public class StringConverter {
    
    public String convertToString(String input) {
        // some logic to convert the input string
        return convertedString;
    }
}

在這個(gè)版本中,F(xiàn)ileReader 類負(fù)責(zé)從文件中讀取數(shù)據(jù),StringConverter 類負(fù)責(zé)將字符串轉(zhuǎn)換為其他形式。這兩個(gè)類各自負(fù)責(zé)不同的職責(zé),遵循了單一職責(zé)原則。

3依賴注入版

我們可以進(jìn)一步改進(jìn)這個(gè)代碼,使用依賴注入來(lái)解耦代碼。通過(guò)使用接口和依賴注入,可以使得這兩個(gè)類更加靈活和可擴(kuò)展。具體代碼如下:

public interface Reader {
    public String read();
}

public interface Converter {
    public String convert(String input);
}

public class FileReader implements Reader {
    
    public String read() throws IOException {
        // read from file
    }
}

public class StringConverter implements Converter {
    
    public String convert(String input) {
        // some logic to convert the input string
        return convertedString;
    }
}

public class DataProcessor {
    
    private Reader reader;
    private Converter converter;
    
    public DataProcessor(Reader reader, Converter converter) {
        this.reader = reader;
        this.converter = converter;
    }
    
    public String processData() throws IOException {
        String data = reader.read();
        return converter.convert(data);
    }
}

在這個(gè)版本中,我們將 FileReader 和 StringConverter 分別抽象成了 Reader 和 Converter 接口,并通過(guò)依賴注入的方式注入到 DataProcessor 類中。

這種方式使得代碼更加靈活、可擴(kuò)展和易于測(cè)試,同時(shí)也更好地遵循了單一職責(zé)原則。

Part3最佳實(shí)踐

在我們?nèi)粘5南到y(tǒng)設(shè)計(jì)和開發(fā)中,有哪些舉措可以更好的實(shí)現(xiàn)單一職責(zé)的原則呢?

以下是一些單一職責(zé)原則落地的最佳實(shí)踐經(jīng)驗(yàn):

  • 將類或模塊的職責(zé)盡可能地降到最小。一個(gè)類或模塊的職責(zé)應(yīng)該越單一越好,盡量避免實(shí)現(xiàn)多個(gè)功能。
  • 如果一個(gè)類或模塊負(fù)責(zé)的職責(zé)太多,可以考慮拆分成多個(gè)類或模塊,每個(gè)類或模塊只負(fù)責(zé)單一的職責(zé)。
  • 在拆分職責(zé)的過(guò)程中,要考慮職責(zé)的相關(guān)性,將相關(guān)的職責(zé)放到同一個(gè)類或模塊中,減少耦合度。
  • 避免在一個(gè)類或模塊中實(shí)現(xiàn)與職責(zé)無(wú)關(guān)的功能。
  • 將通用的功能封裝成獨(dú)立的類或模塊,并在需要時(shí)進(jìn)行調(diào)用,避免重復(fù)實(shí)現(xiàn)。
  • 要注意職責(zé)的界限,避免將與職責(zé)無(wú)關(guān)的代碼放到同一個(gè)類或模塊中。
  • 在設(shè)計(jì)時(shí)要考慮未來(lái)的需求變化,將可擴(kuò)展性考慮進(jìn)去,保證代碼的可維護(hù)性。
  • 在實(shí)現(xiàn)時(shí)要注意代碼的可讀性,使用有意義的變量名和函數(shù)名,以及清晰的代碼結(jié)構(gòu)。
  • 在測(cè)試時(shí)要考慮職責(zé)的獨(dú)立性,對(duì)于每個(gè)職責(zé)都進(jìn)行單獨(dú)的測(cè)試,確保代碼的正確性和穩(wěn)定性。

總之,在實(shí)際開發(fā)中,我們應(yīng)該盡可能地遵循這個(gè)原則,并注意一些最佳實(shí)踐,以達(dá)到更好的設(shè)計(jì)效果。

Part4反模式

單一職責(zé)原則是面向?qū)ο笤O(shè)計(jì)中的一個(gè)重要原則,它要求一個(gè)類或模塊只負(fù)責(zé)一項(xiàng)職責(zé)。但是在實(shí)踐中,我們也會(huì)遇到一些反模式,下面是單一職責(zé)原則的常見(jiàn)反模式:

過(guò)度拆分

過(guò)度拆分是指在拆分類或模塊時(shí)過(guò)度細(xì)化,導(dǎo)致代碼過(guò)于分散,增加了代碼的復(fù)雜性和維護(hù)難度。在設(shè)計(jì)時(shí),應(yīng)該權(quán)衡好單一職責(zé)原則和代碼的復(fù)雜性,避免過(guò)度拆分。

職責(zé)不清

職責(zé)不清是指類或模塊的職責(zé)不夠明確,導(dǎo)致代碼難以維護(hù)和擴(kuò)展。在設(shè)計(jì)時(shí),應(yīng)該明確類或模塊的職責(zé),避免職責(zé)模糊不清。

任務(wù)超出職責(zé)范圍

任務(wù)超出職責(zé)范圍是指類或模塊承擔(dān)了超出其職責(zé)范圍的任務(wù),導(dǎo)致代碼的耦合性增加,難以維護(hù)和擴(kuò)展。在設(shè)計(jì)時(shí),應(yīng)該明確類或模塊的職責(zé)范圍,避免任務(wù)超出職責(zé)范圍。

職責(zé)沖突

職責(zé)沖突是指類或模塊承擔(dān)的職責(zé)之間存在沖突,導(dǎo)致代碼難以維護(hù)和擴(kuò)展。在設(shè)計(jì)時(shí),應(yīng)該避免職責(zé)之間的沖突,確保類或模塊的職責(zé)清晰明確。

依賴過(guò)度

依賴過(guò)度是指類或模塊依賴于其他類或模塊,導(dǎo)致代碼的耦合性增加,難以維護(hù)和擴(kuò)展。

在設(shè)計(jì)時(shí),應(yīng)該盡量減少類或模塊之間的依賴關(guān)系,提高代碼的靈活性和可擴(kuò)展性。

為了避免這些反模式,開發(fā)人員應(yīng)該遵循單一職責(zé)原則的原則,確保類或模塊的職責(zé)明確,避免任務(wù)超出職責(zé)范圍,避免職責(zé)沖突,盡量減少依賴關(guān)系,提高代碼的靈活性和可擴(kuò)展性。

Part5最后

單一職責(zé)原則是面向?qū)ο笤O(shè)計(jì)中的一個(gè)重要原則,它要求一個(gè)類或模塊只負(fù)責(zé)一項(xiàng)職責(zé)。

遵循單一職責(zé)原則可以提高代碼的靈活性和可擴(kuò)展性,使代碼更易于維護(hù)和修改。

同時(shí),開發(fā)人員也應(yīng)該避免違反單一職責(zé)原則的反模式,并盡可的參考一些最佳的實(shí)踐。

總之,通過(guò)遵循單一職責(zé)原則和避免其反模式,可以有效地提高代碼的質(zhì)量和可維護(hù)性。


該文章在 2023/7/12 8:49:17 編輯過(guò)
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
日本乱滛中文字幕 | 综合国产精品私拍国产在线 | 在线观看国精产品二区 | 色窝窝视频手机在线播放 | 中文字幕v亚洲日本在线电影 | 亚洲日本97视频在线 |