ホームページ  >  記事  >  ウェブフロントエンド  >  (I): Typescript と Java で「インターフェイス分離原則」を適用する

(I): Typescript と Java で「インターフェイス分離原則」を適用する

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-27 13:07:14665ブラウズ

(I): Aplicando o

コンセプト

SOLID は、ロバート C. マーティン (アンクル ボブ) によって提案された、オブジェクト指向プログラミングの 5 つの基本原則を表す頭字語です。ここで彼の記事の詳細を読むことができます。
これらの原則は、コードの構造とメンテナンスを改善し、コードをより柔軟でスケーラブルにし、理解しやすくすることを目的としています。このような原則は、プログラマーがより組織化されたコードを作成し、責任を分割し、依存関係を減らし、リファクタリング プロセスを簡素化し、コードの再利用を促進するのに役立ちます。

頭字語の「I」は、「インターフェース分離原理」 を表します。ボブおじさんがこの原則を定義するために使用したフレーズは次のとおりです:

「顧客は使用しないインターフェイスに依存することを強制されるべきではありません」

インターフェイス分離原則は、一般的な問題、つまり必要のないクラスに不必要な実装を強制する大きすぎるインターフェイスに対処します。

実用化

ユーザーの認証にさまざまな方法 (パスワード、生体認証、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. メンテナンスの簡素化: コード変更の影響を軽減し、不必要なリファクタリングを回避します。

結論

以上が(I): Typescript と Java で「インターフェイス分離原則」を適用するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。