国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁(yè) Java java教程 堅(jiān)實(shí)的原則

堅(jiān)實(shí)的原則

Oct 21, 2024 am 06:12 AM

SOLID Principles

SOLID 是一組基本原則,旨在增強(qiáng)物件導(dǎo)向程式設(shè)計(jì) (OOP) 中程式碼的可管理性和可擴(kuò)展性。它由五個(gè)關(guān)鍵原則組成:

  1. S單一責(zé)任原則?—?SRP
  2. O筆閉原則?—?OCP
  3. L伊斯科夫替代原理?—?LSP
  4. I介面隔離原則?—?ISP
  5. D 依存倒置原理?—?DIP

這些原則是由 Robert C. Martin(也稱為 Uncle Bob)在 2000 年代初期提出的,此後已在軟體開發(fā)社群中廣泛採(cǎi)用。透過(guò)遵循 SOLID 原則,開發(fā)人員可以創(chuàng)建更易於理解、修改和擴(kuò)展的程式碼,從而形成更強(qiáng)壯和可維護(hù)的軟體系統(tǒng)。

單一職責(zé)原則(SRP)

單一職責(zé)原則是 OOP 和 SOLID 中第一個(gè)也是最基本的原則。顧名思義,這原則的意思是「一個(gè)類別應(yīng)該只負(fù)責(zé)一個(gè)特定的責(zé)任」。

假設(shè)我們有一個(gè)名為 Invoice 的類,其中包含 2 個(gè)方法generateInvoice() 和 saveToFiles() 。

public class Invoice {
  private Long InvoiceNo;

  public void generateInvoice() {
    // code to generate Invoice.
  }

  public void saveToFiles() {
    // code to save invoice as a file.
  }
}

這不是一個(gè)好的做法,因?yàn)?Invoice 類別有兩個(gè)職責(zé)。更好的方法是將這些功能分成專用的類別。

public class Invoice {
  private Long InvoiceNo;

  public void generateInvoice() {
    // code to generate Invoice.
  }
}

public class FileManager {
  public void saveToFiles(Invoice invoice) {
    // code to save invoice as a file.
  }
}

在這裡,我們可以看到我們有 2 個(gè)用於用例的類別:

  • 產(chǎn)生發(fā)票
  • 儲(chǔ)存到檔案

遵循 SRP 的好處

  • 改進(jìn)的程式碼組織:透過(guò)將關(guān)注點(diǎn)分成不同的類,程式碼庫(kù)變得更有組織性並且更容易導(dǎo)航。
  • 更好的可維護(hù)性:當(dāng)一個(gè)類別具有單一職責(zé)時(shí),更容易理解其目的並進(jìn)行更改,而不會(huì)產(chǎn)生意想不到的副作用。
  • 提高可重用性:具有單一職責(zé)的類別更有可能在應(yīng)用程式的不同部分甚至其他項(xiàng)目中重複使用。
  • 更容易測(cè)試:具有單一職責(zé)的類別通常更小、更集中,使它們更容易單獨(dú)測(cè)試。

開閉原則(OCP)

開閉原則是SOLID的另一個(gè)核心原則。此原則由 Bertrand Meyer 於 1997 年提出。這個(gè)原則背後的想法是「軟體工件(類別、模組和函數(shù))應(yīng)該對(duì)擴(kuò)展開放,但對(duì)修改關(guān)閉。」

例如;

比方說(shuō),我們有一個(gè)名為 Shape 的類,我們可以用這個(gè)類來(lái)計(jì)算形狀的面積。

public class Invoice {
  private Long InvoiceNo;

  public void generateInvoice() {
    // code to generate Invoice.
  }

  public void saveToFiles() {
    // code to save invoice as a file.
  }
}

在上面的程式碼中,新增形狀需要修改現(xiàn)有的 Shape 類,這不是一個(gè)好的做法。

以下是一個(gè)程式碼範(fàn)例,示範(fàn)如何將開閉原則應(yīng)用於此場(chǎng)景。

public class Invoice {
  private Long InvoiceNo;

  public void generateInvoice() {
    // code to generate Invoice.
  }
}

public class FileManager {
  public void saveToFiles(Invoice invoice) {
    // code to save invoice as a file.
  }
}

透過(guò)OCP的應(yīng)用,我們可以在不修改目前實(shí)現(xiàn)的情況下添加許多我們想要的形狀。

注意:使用介面並不是實(shí)現(xiàn) OCP 的唯一方法。

遵循 OCP 的好處

  • 降低錯(cuò)誤風(fēng)險(xiǎn):透過(guò)不修改現(xiàn)有程式碼,可以最大限度地降低引入新錯(cuò)誤或破壞現(xiàn)有功能的風(fēng)險(xiǎn)。
  • 提高可維護(hù)性:遵循 OCP 的程式碼更容易維護(hù)和擴(kuò)展,因?yàn)榭梢栽诓桓默F(xiàn)有程式碼庫(kù)的情況下添加新功能。
  • 增強(qiáng)靈活性:抽象和多態(tài)性的使用允許更靈活和適應(yīng)性更強(qiáng)的設(shè)計(jì),從而更容易適應(yīng)不斷變化的需求。

里氏替換原理 (LSP)

里氏替換原則是 OOP 中的另一個(gè)重要原則。它是由 Barbara Liskov 於 1987 年在一次關(guān)於資料抽象的會(huì)議演講中引入的。

該原則指出,「超類別的物件應(yīng)該可以用其子類別的物件替換,而不改變程式的正確性」。

例如,如果 Circle 和 Rectangle 是 Shape 的子類型,那麼我們應(yīng)該能夠用 Circle 或 Rectangle 物件取代 Shape 對(duì)象,不會(huì)有任何問(wèn)題。

public class Shape {
    private String shapeType;
    private double radius;
    private double length;
    private double width;

    public Shape(String shapeType, double radius, double length, double width) {
        this.shapeType = shapeType;
        this.radius = radius;
        this.length = length;
        this.width = width;
    }

    public double area() {
        if (shapeType.equals("circle")) {
            return Math.PI * (radius * radius);
        } else if (shapeType.equals("rectangle")) {
            return length * width;
        } else {
            throw new IllegalArgumentException("Unknown shape type");
        }
    }
}

// Usage
public class Main {
    public static void main(String[] args) {
        Shape circle = new Shape("circle", 5, 0, 0);
        Shape rectangle = new Shape("rectangle", 0, 4, 6);

        System.out.println(circle.area());
        System.out.println(rectangle.area());
    }
}

如本例所示,遵循里氏替換原則意味著我們應(yīng)該能夠無(wú)縫地用子類別實(shí)例取代超類別實(shí)例。

遵循 LSP 的好處

  • 改進(jìn)的程式碼可重複使用性:透過(guò)確保子類型可以取代其基本類型,使用基本類型的程式碼也可以與其任何子類型一起使用,從而促進(jìn)程式碼重用。
  • 增強(qiáng)的可維護(hù)性:遵循LSP的程式碼更容易維護(hù),因?yàn)樗档土诵薷幕驍U(kuò)展程式碼庫(kù)時(shí)引入錯(cuò)誤的風(fēng)險(xiǎn)。
  • 更好的可測(cè)試性:LSP 使為類別及其子類型編寫單元測(cè)試變得更加容易,因?yàn)闇y(cè)試可以針對(duì)基本類型編寫,並且應(yīng)該適用於所有子類型。

介面隔離原則(ISP)

介面隔離原則是 Robert C. Martin 提出的五個(gè) SOLID 原則之一。它指出:「不應(yīng)強(qiáng)迫客戶端依賴他們不使用的介面」。

換句話說(shuō),使用多個(gè)特定於任務(wù)的介面比使用一個(gè)通用介面更好。

下面的範(fàn)例展示了通用介面的用法。

public class Invoice {
  private Long InvoiceNo;

  public void generateInvoice() {
    // code to generate Invoice.
  }

  public void saveToFiles() {
    // code to save invoice as a file.
  }
}

使用像 MultifunctionPrinter 這樣的通用介面迫使我們實(shí)作不必要的方法,這被認(rèn)為是不好的做法。讓我們探討一下如何將介面隔離原則套用到此場(chǎng)景。

介面

public class Invoice {
  private Long InvoiceNo;

  public void generateInvoice() {
    // code to generate Invoice.
  }
}

public class FileManager {
  public void saveToFiles(Invoice invoice) {
    // code to save invoice as a file.
  }
}

實(shí)施

public class Shape {
    private String shapeType;
    private double radius;
    private double length;
    private double width;

    public Shape(String shapeType, double radius, double length, double width) {
        this.shapeType = shapeType;
        this.radius = radius;
        this.length = length;
        this.width = width;
    }

    public double area() {
        if (shapeType.equals("circle")) {
            return Math.PI * (radius * radius);
        } else if (shapeType.equals("rectangle")) {
            return length * width;
        } else {
            throw new IllegalArgumentException("Unknown shape type");
        }
    }
}

// Usage
public class Main {
    public static void main(String[] args) {
        Shape circle = new Shape("circle", 5, 0, 0);
        Shape rectangle = new Shape("rectangle", 0, 4, 6);

        System.out.println(circle.area());
        System.out.println(rectangle.area());
    }
}

透過(guò)應(yīng)用ISP,我們將其分成更小的、特定於角色的介面?——例如印表機(jī)、掃描器和傳真。這允許每個(gè)類別(例如 BasicPrinter、AdvancedPrinter 或 FaxMachine)僅實(shí)現(xiàn)相關(guān)功能,從而促進(jìn)模組化並減少不必要的依賴關(guān)係。

跟隨 ISP 的好處

  • 模組化和可重複使用程式碼:透過(guò)將大型介面分解為更小、更具體的接口,程式碼變得更加模組化和可重用。類別或模組可以僅實(shí)現(xiàn)它們需要的接口,從而減少不必要的依賴關(guān)係,並使在系統(tǒng)的不同部分之間重複使用程式碼變得更容易。
  • 降低程式碼複雜度:當(dāng)類別或模組僅依賴它們所需的介面時(shí),程式碼變得不那麼複雜且更容易理解。這是因?yàn)殚_發(fā)人員不必處理不必要的方法或依賴項(xiàng)。這些與其特定用例無(wú)關(guān)。
  • 提高可維護(hù)性:透過(guò)更小、更集中的介面,可以更輕鬆地維護(hù)程式碼。對(duì)一個(gè)介面的變更不太可能影響系統(tǒng)的其他部分,從而降低了引入錯(cuò)誤或破壞現(xiàn)有功能的風(fēng)險(xiǎn)。
  • 更好的可測(cè)試性:更小、更集中的介面使得為各個(gè)組件編寫單元測(cè)試變得更容易。這是因?yàn)闇y(cè)試可以專注於特定的行為,而不會(huì)受到不相關(guān)的方法或依賴項(xiàng)的影響。
  • 增加靈活性:透過(guò)遵守ISP,系統(tǒng)變得更加靈活並且更容易擴(kuò)展或修改??梢酝高^(guò)建立新介面或修改現(xiàn)有介面來(lái)新增功能或要求,而不會(huì)影響整個(gè)系統(tǒng)。

依賴倒置原則(DIP)

依賴倒置原則是SOLID的最終原則。這也是由 Robert C. Martin 介紹的。這促進(jìn)了鬆散耦合的程式碼。

DIP說(shuō)明了幾點(diǎn):

  • 高層模組不應(yīng)該依賴低層模組。
  • 兩者都應(yīng)該依賴抽象。
  • 抽像不應(yīng)該依賴細(xì)節(jié)。
  • 細(xì)節(jié)應(yīng)該取決於抽象。

簡(jiǎn)單來(lái)說(shuō),一個(gè)類別不應(yīng)該直接依賴其他特定類別(具體實(shí)作),而應(yīng)該依賴介面或抽象類別。這使得程式碼更加靈活且更易於維護(hù),因?yàn)槟梢栽诓桓囊蕾囶悇e的情況下更換實(shí)作。

緊耦合代碼(無(wú) DIP)

public class Invoice {
  private Long InvoiceNo;

  public void generateInvoice() {
    // code to generate Invoice.
  }

  public void saveToFiles() {
    // code to save invoice as a file.
  }
}

如上例所示,Computer 類別直接依賴 Keyboard 類別。

松耦合代碼(帶 DIP)

public class Invoice {
  private Long InvoiceNo;

  public void generateInvoice() {
    // code to generate Invoice.
  }
}

public class FileManager {
  public void saveToFiles(Invoice invoice) {
    // code to save invoice as a file.
  }
}

現(xiàn)在,Computer 依賴 InputDevice 接口,而不是特定的 Keyboard。這樣可以輕鬆切換到另一個(gè)輸入設(shè)備,例如 WirelessKeyboard,而無(wú)需修改 Computer 類別。

遵循 DIP 的好處

  • 鬆散耦合:透過(guò)依賴抽象而不是具體實(shí)現(xiàn),程式碼的耦合變得不那麼緊密,使得更容易更改系統(tǒng)的一個(gè)部分而不影響其他部分。
  • 提高可維護(hù)性:低層模組的變化不會(huì)影響高層模組,使系統(tǒng)更容易維護(hù)和擴(kuò)展。
  • 增強(qiáng)的可測(cè)試性:可以使用低階模組的模擬實(shí)作來(lái)測(cè)試高階模組,使測(cè)試更快、更可靠。
  • 提高可重複使用性:高層模組可以在不同的上下文中重複使用,而不需要更改它們所依賴的低層模組。

結(jié)論

總而言之,SOLID 原則:?jiǎn)我宦氊?zé)、開閉、里氏替換、介面隔離和依賴倒置為在物件導(dǎo)向程式設(shè)計(jì)中編寫乾淨(jìng)、可維護(hù)和可擴(kuò)展的程式碼提供了基本準(zhǔn)則。

透過(guò)遵守這些原則,開發(fā)人員可以創(chuàng)建更易於理解、修改和擴(kuò)展的系統(tǒng),最終帶來(lái)更高品質(zhì)的軟體和更有效率的開發(fā)流程。

概括

感謝您閱讀這篇文章!我希望您現(xiàn)在對(duì) SOLID 原則以及如何應(yīng)用它們來(lái)增強(qiáng)您的專案有了深入的了解。

追蹤我:
  • LinkedIn?—?@nsadisha
  • GitHub?—?@nsadisha
  • 中?—?@nsadisha
  • Dev.to?—?@nsadisha

—薩迪莎·尼薩拉

以上是堅(jiān)實(shí)的原則的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁(yè)開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1602
29
PHP教程
1504
276
Hashmap在Java內(nèi)部如何工作? Hashmap在Java內(nèi)部如何工作? Jul 15, 2025 am 03:10 AM

HashMap在Java中通過(guò)哈希表實(shí)現(xiàn)鍵值對(duì)存儲(chǔ),其核心在於快速定位數(shù)據(jù)位置。 1.首先使用鍵的hashCode()方法生成哈希值,並通過(guò)位運(yùn)算轉(zhuǎn)換為數(shù)組索引;2.不同對(duì)象可能產(chǎn)生相同哈希值,導(dǎo)致衝突,此時(shí)以鍊錶形式掛載節(jié)點(diǎn),JDK8後鍊錶過(guò)長(zhǎng)(默認(rèn)長(zhǎng)度8)則轉(zhuǎn)為紅黑樹提升效率;3.使用自定義類作鍵時(shí)必須重寫equals()和hashCode()方法;4.HashMap動(dòng)態(tài)擴(kuò)容,當(dāng)元素?cái)?shù)超過(guò)容量乘以負(fù)載因子(默認(rèn)0.75)時(shí),擴(kuò)容並重新哈希;5.HashMap非線程安全,多線程下應(yīng)使用Concu

Java可選示例 Java可選示例 Jul 12, 2025 am 02:55 AM

Optional能清晰表達(dá)意圖並減少null判斷的代碼噪音。 1.Optional.ofNullable是處理可能為null對(duì)象的常用方式,如從map中取值時(shí)可結(jié)合orElse提供默認(rèn)值,邏輯更清晰簡(jiǎn)潔;2.通過(guò)鍊式調(diào)用map實(shí)現(xiàn)嵌套取值,安全地避免NPE,任一環(huán)節(jié)為null則自動(dòng)終止並返回默認(rèn)值;3.filter可用於條件篩選,滿足條件才繼續(xù)執(zhí)行後續(xù)操作,否則直接跳到o??rElse,適合輕量級(jí)業(yè)務(wù)判斷;4.不建議過(guò)度使用Optional,如基本類型或簡(jiǎn)單邏輯中其反而增加複雜度,部分場(chǎng)景直接返回nu

如何修復(fù)java.io.notserializable Exception? 如何修復(fù)java.io.notserializable Exception? Jul 12, 2025 am 03:07 AM

遇到j(luò)ava.io.NotSerializableException的核心解決方法是確保所有需序列化的類實(shí)現(xiàn)Serializable接口,並檢查嵌套對(duì)象的序列化支持。 1.給主類添加implementsSerializable;2.確保類中自定義字段對(duì)應(yīng)的類也實(shí)現(xiàn)Serializable;3.用transient標(biāo)記不需要序列化的字段;4.檢查集合或嵌套對(duì)像中的非序列化類型;5.查看異常信息定位具體哪個(gè)類未實(shí)現(xiàn)接口;6.對(duì)無(wú)法修改的類考慮替換設(shè)計(jì),如保存關(guān)鍵數(shù)據(jù)或使用可序列化的中間結(jié)構(gòu);7.考慮改

如何處理Java中的字符編碼問(wèn)題? 如何處理Java中的字符編碼問(wèn)題? Jul 13, 2025 am 02:46 AM

處理Java中的字符編碼問(wèn)題,關(guān)鍵是在每一步都明確指定使用的編碼。 1.讀寫文本時(shí)始終指定編碼,使用InputStreamReader和OutputStreamWriter並傳入明確的字符集,避免依賴系統(tǒng)默認(rèn)編碼。 2.在網(wǎng)絡(luò)邊界處理字符串時(shí)確保兩端一致,設(shè)置正確的Content-Type頭並用庫(kù)顯式指定編碼。 3.謹(jǐn)慎使用String.getBytes()和newString(byte[]),應(yīng)始終手動(dòng)指定StandardCharsets.UTF_8以避免平臺(tái)差異導(dǎo)致的數(shù)據(jù)損壞。總之,通過(guò)在每個(gè)階段

Java插座編程基本面和示例 Java插座編程基本面和示例 Jul 12, 2025 am 02:53 AM

JavaSocket編程是網(wǎng)絡(luò)通信的基礎(chǔ),通過(guò)Socket實(shí)現(xiàn)客戶端與服務(wù)器間的數(shù)據(jù)交換。 1.Java中Socket分為客戶端使用的Socket類和服務(wù)器端使用的ServerSocket類;2.編寫Socket程序需先啟動(dòng)服務(wù)器監(jiān)聽端口,再由客戶端發(fā)起連接;3.通信過(guò)程包括連接建立、數(shù)據(jù)讀寫及流關(guān)閉;4.注意事項(xiàng)包括避免端口衝突、正確配置IP地址、合理關(guān)閉資源及支持多客戶端的方法。掌握這些即可實(shí)現(xiàn)基本的網(wǎng)絡(luò)通信功能。

Java中的可比較與比較器 Java中的可比較與比較器 Jul 13, 2025 am 02:31 AM

在Java中,Comparable用於類內(nèi)部定義默認(rèn)排序規(guī)則,Comparator用於外部靈活定義多種排序邏輯。 1.Comparable是類自身實(shí)現(xiàn)的接口,通過(guò)重寫compareTo()方法定義自然順序,適用於類有固定、最常用的排序方式,如String或Integer。 2.Comparator是外部定義的函數(shù)式接口,通過(guò)compare()方法實(shí)現(xiàn),適合同一類需要多種排序方式、無(wú)法修改類源碼或排序邏輯經(jīng)常變化的情況。兩者區(qū)別在於Comparable只能定義一種排序邏輯且需修改類本身,而Compar

如何在Java的地圖上迭代? 如何在Java的地圖上迭代? Jul 13, 2025 am 02:54 AM

遍歷Java中的Map有三種常用方法:1.使用entrySet同時(shí)獲取鍵和值,適用於大多數(shù)場(chǎng)景;2.使用keySet或values分別遍歷鍵或值;3.使用Java8的forEach簡(jiǎn)化代碼結(jié)構(gòu)。 entrySet返回包含所有鍵值對(duì)的Set集合,每次循環(huán)獲取Map.Entry對(duì)象,適合頻繁訪問(wèn)鍵和值的情況;若只需鍵或值,可分別調(diào)用keySet()或values(),也可在遍歷鍵時(shí)通過(guò)map.get(key)獲取值;Java8中可通過(guò)Lambda表達(dá)式使用forEach((key,value)-&gt

Java中的'靜態(tài)”關(guān)鍵字是什麼? Java中的'靜態(tài)”關(guān)鍵字是什麼? Jul 13, 2025 am 02:51 AM

InJava,thestatickeywordmeansamemberbelongstotheclassitself,nottoinstances.Staticvariablesaresharedacrossallinstancesandaccessedwithoutobjectcreation,usefulforglobaltrackingorconstants.Staticmethodsoperateattheclasslevel,cannotaccessnon-staticmembers,

See all articles