首頁 >web前端 >js教程 >(D):在 Typescript 和 Java 中應用'依賴倒置原則”

(D):在 Typescript 和 Java 中應用'依賴倒置原則”

Susan Sarandon
Susan Sarandon原創
2024-12-03 12:00:20420瀏覽

(D): Aplicando o

概念

SOLID 是一個縮寫詞,代表物件導向程式設計的五個基本原則,由 Robert C. Martin(鮑伯大叔)提出。在這裡您可以閱讀有關他的文章的更多資訊。
這些原則旨在改進程式碼的結構和維護,使其更加靈活、可擴展且更易於理解。這些原則可以幫助程式設計師創建更有組織的程式碼、劃分職責、減少依賴、簡化重構過程並促進程式碼重複使用。

縮寫中的「D」代表「依賴倒置原則」。 Bob叔叔用來定義這個原則的一句話是:

「高層模組不應該依賴低層模組。兩者都應該依賴抽象。抽像不應該依賴細節。細節應該依賴抽象」

依賴倒置原則旨在減少系統元件之間的耦合,提高靈活性、可維護性和可測試性。

DIP 解決的問題

  • 緊密耦合:當一個模組直接依賴特定實作時,對此實作的變更可能會影響其他模組。
  • 測試難度:測試直接耦合到特定實現的程式碼單元更加複雜,因為它需要使用這些具體實現,因此很難建立模擬或存根。
  • 可重用性低:與具體細節高度耦合的模組在其他上下文中的可重用性較低。

實際應用

我們將建立一個程式碼負責透過電子郵件發送通知,以分析問題和可能的解決方案

爪哇

class EmailService {
    public void sendEmail(String message) {
        System.out.println("Sending email: " + message);
    }
}

class Notification {
    private EmailService emailService;

    public Notification() {
        this.emailService = new EmailService();
    }

    public void notify(String message) {
        this.emailService.sendEmail(message);
    }
}

// Uso
public class Main {
    public static void main(String[] args) {
        Notification notification = new Notification();
        notification.notify("Welcome to our service!");
    }
}

打字稿

class EmailService {
    sendEmail(message: string): void {
        console.log(`Sending email: ${message}`);
    }
}

class Notification {
    private emailService: EmailService;

    constructor() {
        this.emailService = new EmailService();
    }

    notify(message: string): void {
        this.emailService.sendEmail(message);
    }
}

// Uso
const notification = new Notification();
notification.notify("Welcome to our service!");

問題:

  • Notification 類別直接依賴特定實作(EmailService)。
  • 如果我們想更改通知頻道(例如:簡訊),我們需要更改通知代碼。

解決方案和優點:

  • 通知不需要知道訊息如何發送的詳細資訊。
  • 易於更換或增加新的溝通管道。
  • 我們可以單獨測試通知,而不需要依賴實際的實作。

爪哇

public interface MessageService {
    void sendMessage(String message);
}

public class EmailService implements MessageService {
    @Override
    public void sendMessage(String message) {
        System.out.println("Sending email: " + message);
    }
}

public class SMSService implements MessageService {
    @Override
    public void sendMessage(String message) {
        System.out.println("Sending SMS: " + message);
    }
}

public class Notification {
    private final MessageService messageService;

    public Notification(MessageService messageService) {
        this.messageService = messageService;
    }

    public void notify(String message) {
        messageService.sendMessage(message);
    }
}

// Uso
public class Main {
    public static void main(String[] args) {
        Notification emailNotification = new Notification(new EmailService());
        emailNotification.notify("Welcome via Email!");

        Notification smsNotification = new Notification(new SMSService());
        smsNotification.notify("Welcome via SMS!");
    }
}

打字稿

interface MessageService {
    sendMessage(message: string): void;
}

class EmailService implements MessageService {
    sendMessage(message: string): void {
        console.log(`Sending email: ${message}`);
    }
}

class SMSService implements MessageService {
    sendMessage(message: string): void {
        console.log(`Sending SMS: ${message}`);
    }
}

class Notification {
    private messageService: MessageService;

    constructor(messageService: MessageService) {
        this.messageService = messageService;
    }

    notify(message: string): void {
        this.messageService.sendMessage(message);
    }
}

// Uso
const emailNotification = new Notification(new EmailService());
emailNotification.notify("Welcome via Email!");

const smsNotification = new Notification(new SMSService());
smsNotification.notify("Welcome via SMS!");

3. 單元測試

爪哇

public class MockMessageService implements MessageService {
    @Override
    public void sendMessage(String message) {
        System.out.println("Mock message sent: " + message);
    }
}

// Teste com o mock
public class Main {
    public static void main(String[] args) {
        MessageService mockMessageService = new MockMessageService();
        Notification mockNotification = new Notification(mockMessageService);
        mockNotification.notify("Test message");
    }
}

打字稿

class MockMessageService implements MessageService {
    sendMessage(message: string): void {
        console.log(`Mock message sent: ${message}`);
    }
}

// Teste com o mock
const mockNotification = new Notification(new MockMessageService());
mockNotification.notify("Test message");

結論

依賴倒置原則(DIP)是靈活而健壯的專案的基本支柱。它允許您減少類別之間的耦合,促進程式碼重用並提高應用程式的可測試性。透過依賴抽象,您的系統變得更能適應變化並可透過新功能進行擴展。實際範例展示了小型的設計調整如何解決經常出現的維護問題。將 DIP 與其他 SOLID 原則結合應用可確保更清晰的程式碼,為成長做好準備。採用這些概念對於尋求卓越軟體架構的開發人員至關重要。

參考書目

  • Martin,Robert C. 敏捷軟體開發、原則、模式和實踐。普倫蒂斯·霍爾,2002 年。
  • 蒂亞戈·萊特和卡瓦略。 物件導向。 Casa do Code,2014。

以上是(D):在 Typescript 和 Java 中應用'依賴倒置原則”的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn