2017-03-29 6 views
-6

タイトルには次のように書かれています。そして、あなたはでなく、インターフェイスを使用する必要があることを示す重要な点は何ですか?いつインタフェース/契約を結ぶべきですか?

+0

なぜこれが広すぎるのか説明してください。私は、インターフェイスの使用についての議論を開始しないで、一般的なキーポイントを求めています。 –

+0

いつも通り - それは依存しています。一般的なルールはありません。 DI/IOC、UnitTestingなどのインターフェイスですか? – Philipp

+0

@PhilippそれはDI/IoC用です。ルールを求めているわけではなく、インプリメンテーションを直接使用するのではなく、インターフェイスを使用することを検討したいと考える重要なポイントです。 –

答えて

1

インターフェイスは、実装をスワップしたり、インターフェイスを使用する必要がある別の実装を柔軟に使用できるようにするために、公開された「契約」です。

例:

後で読み込むことができるように保存する必要があります。 あなたは

public function save(MySQL $db, array $data); 

のようなものを使用することができます。しかし、これは非常に柔軟ではない、それはMySQLの実装にあなたのコードを結び付けます。 公共の図書館やフレームワークなどを構築しているため、他の実装のために公開したい場合は、このようなことを行う必要があります。

public function save(Persistance $storage, array $data) 
{ 
    // dome some random stuff with you data 
    ... 
    $storage->save($data); 
} 

この場合、Persistenceはインターフェイスであり、このように見えます。

interface Persistance 
{ 
    public function save(array $data); 
} 

ローカルの実装は次のようになります。

class MySQL implements Persistance 
{ 
    public function save(array $data) 
    { 
     $this->insert('my_table', $data); 
    } 
} 

しかし、他の誰かがちょうどあなたのインターフェイスを実装して、自分のPersistenceの実装を注入することにより、例えば完全な別の永続化層、RedisのかはPostgresであなたのコードを使用することができます。

これは単なる例ですが、インターフェイスは主にクラス間の契約として理解し、実装を開いたままにしておきます。

複数のインターフェイスを実装する機会はいいですが、複数の継承とは関係ありません。インターフェースは、あるクラスが明確に定義されたインとアウトプットを持っていることを確認するだけですが、バックグラウンドでのやり方は完全に開いています。

本当に「多重継承」に入る場合は、特性を見てください。

インターフェイスはフレームワークで使用され、PHPFigは最近フレームワークコンポーネントをより交換可能にするために多くの標準インターフェイスを定義しています。

たとえば、PSR-16シンプルキャッシュインターフェイスを使用すると、フレームワーク間でキャッシュレイヤの実装を交換することができます。

または、PSR-7リクエストレスポンスインターフェイスを使用すると、フレームワークは、ログイン、CRFセキュリティなどの標準化されたミドルウェアの実装を交換できます。

依存性注入コンテナ用のインターフェイスがあります。フレームワークが独自のDIコンテナからインターフェイスにその実装を変更すると、異なるDIコンテナ実装のフレームワークを使用できるようになります。

+0

私にはかなり分かります:)これは、実装が変更されないことを99%確信しているとき、インターフェイスを書くのは無意味だということですか? –

+0

「はい」またはとにかくそれを使用している場合のみ) – sfeldmann

0

インターフェイスの全ポイントは、クラスに複数のインターフェイスを実装するように強制できますが、複数の継承を許可しないように柔軟にするためです。複数のクラスから継承する問題は、多種多様です。

インターフェイスは妥協です。多重継承の問題の大半は抽象基本クラスには適用されないため、最近のほとんどの言語は多重継承を無効にしていますが、抽象基本クラスインタフェースを呼び出すことができ、クラスで必要な数だけ実装することができます。

関連する問題