首頁  >  文章  >  web前端  >  (一):在 Typescript 和 Java 中應用'介面隔離原則”

(一):在 Typescript 和 Java 中應用'介面隔離原則”

Patricia Arquette
Patricia Arquette原創
2024-11-27 13:07:14664瀏覽

(I): Aplicando o

概念

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

縮寫中的「I」代表「介面隔離原則」。 Bob叔叔用來定義這個原則的一句話是:

「任何客戶都不應該被迫依賴他們不使用的介面」

介面隔離原則解決了一個常見問題:介面過大迫使不需要它們的類別實作不必要的實作。

實際應用

想像一個應用程式中的身分驗證系統,其中使用不同的方法來驗證使用者身分(例如,透過密碼、透過生物辨識、透過 QR 碼)。

首先我們來看看這個類別在Java和Typescript中不使用ISP的情況下的應用:

爪哇

interface Authenticator {
    boolean authenticateWithPassword(String userId, String password);
    boolean authenticateWithBiometrics(String userId);
    boolean authenticateWithQRCode(String qrCode);
}

class PasswordAuthenticator implements Authenticator {
    @Override
    public boolean authenticateWithPassword(String userId, String password) {
        System.out.println("Authenticating with password...");
        return true;
    }

    @Override
    public boolean authenticateWithBiometrics(String userId) {
        throw new UnsupportedOperationException("Not implemented");
    }

    @Override
    public boolean authenticateWithQRCode(String qrCode) {
        throw new UnsupportedOperationException("Not implemented");
    }
}

打字稿

interface Authenticator {
  authenticateWithPassword(userId: string, password: string): boolean;
  authenticateWithBiometrics(userId: string): boolean;
  authenticateWithQRCode(qrCode: string): boolean;
}

class PasswordAuthenticator implements Authenticator {
  authenticateWithPassword(userId: string, password: string): boolean {
    console.log("Authenticating with password...");
    return true;
  }

  authenticateWithBiometrics(userId: string): boolean {
    throw new Error("Not implemented");
  }

  authenticateWithQRCode(qrCode: string): boolean {
    throw new Error("Not implemented");
  }
}

問題:

  1. 未使用的方法:PasswordAuthenticator 類別實作了對其功能沒有意義的方法。
  2. 有問題的維護:如果介面發生變化,所有實作類別都需要更改,即使它們不使用新方法。
  3. 單一責任違規:班級開始處理不應該屬於他們的問題。

為了解決這個問題,我們可以將Authenticator介面拆分為更小、更具體的介面。

爪哇

interface PasswordAuth {
    boolean authenticateWithPassword(String userId, String password);
}

interface BiometricAuth {
    boolean authenticateWithBiometrics(String userId);
}

interface QRCodeAuth {
    boolean authenticateWithQRCode(String qrCode);
}

class PasswordAuthenticator implements PasswordAuth {
    @Override
    public boolean authenticateWithPassword(String userId, String password) {
        System.out.println("Authenticating with password...");
        return true;
    }
}

class BiometricAuthenticator implements BiometricAuth {
    @Override
    public boolean authenticateWithBiometrics(String userId) {
        System.out.println("Authenticating with biometrics...");
        return true;
    }
}

class QRCodeAuthenticator implements QRCodeAuth {
    @Override
    public boolean authenticateWithQRCode(String qrCode) {
        System.out.println("Authenticating with QR Code...");
        return true;
    }
}

打字稿

interface PasswordAuth {
  authenticateWithPassword(userId: string, password: string): boolean;
}

interface BiometricAuth {
  authenticateWithBiometrics(userId: string): boolean;
}

interface QRCodeAuth {
  authenticateWithQRCode(qrCode: string): boolean;
}

class PasswordAuthenticator implements PasswordAuth {
  authenticateWithPassword(userId: string, password: string): boolean {
    console.log("Authenticating with password...");
    return true;
  }
}

class BiometricAuthenticator implements BiometricAuth {
  authenticateWithBiometrics(userId: string): boolean {
    console.log("Authenticating with biometrics...");
    return true;
  }
}

class QRCodeAuthenticator implements QRCodeAuth {
  authenticateWithQRCode(qrCode: string): boolean {
    console.log("Authenticating with QR Code...");
    return true;
  }
}

重構的好處

  1. 特定介面:每個類別僅實作它實際使用的方法。
  2. 靈活性:新增新的身份驗證方法或模式不會影響現有實作。
  3. 更簡單的維護:減少程式碼變更的影響,避免不必要的重構。

結論

以上是(一):在 Typescript 和 Java 中應用'介面隔離原則”的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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