タイトルには次のように書かれています。そして、あなたはでなく、インターフェイスを使用する必要があることを示す重要な点は何ですか?いつインタフェース/契約を結ぶべきですか?
答えて
インターフェイスは、実装をスワップしたり、インターフェイスを使用する必要がある別の実装を柔軟に使用できるようにするために、公開された「契約」です。
例:
後で読み込むことができるように保存する必要があります。 あなたは
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コンテナ実装のフレームワークを使用できるようになります。
私にはかなり分かります:)これは、実装が変更されないことを99%確信しているとき、インターフェイスを書くのは無意味だということですか? –
「はい」またはとにかくそれを使用している場合のみ) – sfeldmann
インターフェイスの全ポイントは、クラスに複数のインターフェイスを実装するように強制できますが、複数の継承を許可しないように柔軟にするためです。複数のクラスから継承する問題は、多種多様です。
インターフェイスは妥協です。多重継承の問題の大半は抽象基本クラスには適用されないため、最近のほとんどの言語は多重継承を無効にしていますが、抽象基本クラスインタフェースを呼び出すことができ、クラスで必要な数だけ実装することができます。
- 1. blogchain testnetで契約を結ぶ
- 2. Laravelのモデル契約/インタフェース5
- 3. WCF WSDLでのインタフェース契約の定義
- 4. タイプ/インタフェース契約に関するガイドライン - ガイドライン
- 5. RESTful Webサービスを使用して契約を結ぶ方法
- 6. Coffeescriptで約束を結ぶ
- 7. WCFサービスにはどのような運用契約を結ぶことができますか?
- 8. Javascript:2つの約束を結ぶ
- 9. Typescript:new()インタフェース契約が強制されていません
- 10. 契約のすべての列挙値をテストすべきですか?
- 11. 春クラウド契約:1つのファイルに複数の契約
- 12. 春クラウド契約のデバッグ契約テストケース
- 13. 契約
- 14. サービス契約にデータ契約が表示されない...どうすれば追加できますか?
- 15. 他の契約のコンストラクタを使ってethに契約を送信できますか?
- 16. 多くのインテントを持つAndroid契約
- 17. 複数のサービス契約を持つシングルエンドポイント
- 18. WCFクライアントが複数の契約(複数契約)を使用していた契約を(サーバー側で)どのように把握するのですか?
- 19. 契約第1対契約現在の世代で最後に
- 20. サービス契約図
- 21. 契約tapply
- 22. スプリングクラウド契約 - ファーンクライアント
- 23. コード契約ビルドパフォーマンス
- 24. コード契約エラー
- 25. トラブルトリュフ契約モジュール
- 26. どのインタフェース「のApp \を照らし\契約「が見つかりません認証\ Aunthenticatableを\」laravel
- 27. webhttpbindingエンドポイントの契約は何ですか?
- 28. コード契約はモノですか?
- 29. Ethereum契約機能はセキュアですか?
- 30. Jaxerとの契約は何ですか?
なぜこれが広すぎるのか説明してください。私は、インターフェイスの使用についての議論を開始しないで、一般的なキーポイントを求めています。 –
いつも通り - それは依存しています。一般的なルールはありません。 DI/IOC、UnitTestingなどのインターフェイスですか? – Philipp
@PhilippそれはDI/IoC用です。ルールを求めているわけではなく、インプリメンテーションを直接使用するのではなく、インターフェイスを使用することを検討したいと考える重要なポイントです。 –