web-dev-qa-db-ja.com

プロトコル指向プログラミングのようなものはありますか?

Redditの 投稿 を要約した this 記事から私のコメントをコピー/貼り付けています:

「プロトコルの向き」は新しいものだとは本当に思いません... Obj-Cでプロトコルを使用している、Javaでインターフェースを使用している、C++で抽象クラスを使用している、などです。

OO言語...で構成を置き換えることにより、インターフェースを分離し、継承を回避できます...

プロトコルオリエンテーションが異なる点または新しい点を理解するために私を助けてください。 Appleおそらく開発者にアプリの認識と尊重を促すSOLID原則)という造語のようです...悪いことを意味しますが、何か新しいことでもありません。

プロトコル指向プログラミングとは何ですか?

構造化プログラミングと同じくらい革新的で、OOPの危険な「後藤」を廃止する可能性のある新しいプログラミングパラダイムですか?

または、OOPコードベースに良い、しっかりした敬意のあるデザインを強制する方法ですか?

そして、特効薬は何もないので、POPの落とし穴は何ですか?

3
Lescai Ionel

Apple Inc.はインターフェイスを「プロトコル」と呼んでいます。「プロトコル指向」とは、継承ではなくインターフェイスを使用したプログラミングを意味します。

ここから: http://www.tutorialspoint.com/objective_c/objective_c_protocols.htm

Objective-Cを使用すると、特定の状況で使用されることが予想されるメソッドを宣言するプロトコルを定義できます。プロトコルは、プロトコルに準拠したクラスで実装されます。

Objective-Cから:

Objective-Cでは、プロトコルは、任意のクラスで実装できるメソッドのグループです。プロトコルは基本的にC#のインターフェイスと同じで、どちらも同じような目標を持っています。これらは疑似データ型として使用できます。これは、動的に型付けされたオブジェクトが特定のメッセージセットに応答できることを確認するのに役立ちます。また、どのクラスでもプロトコルを「採用」できるため、それらを使用して、まったく関係のないクラス間で共有されるAPIを表すことができます。

絶対初心者向けのObjective-Cから:

Appleは、プロトコルをクラス定義に関連付けられていないメソッド宣言のリストとして定義しています。プロトコル用にリストされているメソッドは、ユーザーが実装することを想定しています。

したがって、プロトコル指向プログラミングは、Objective-CおよびSwiftプログラマーが、クラスの継承(継承)よりも実装インターフェースの方を好むものと呼んでいます。

構造化プログラミングと同じくらい革新的で、OOPの危険な「後藤」を廃止する可能性のある新しいプログラミングパラダイムですか?

いいえ、これは新しいものではなく、Apple開発者コミュニティで使用されている別の名前です。継承よりも構成には大きな利点がありますが、このフォーラムで広く議論されています。

そして、特効薬は何もないので、POPの落とし穴は何ですか?

最初は何も思いつかなかったが、私はこれをCodeRanchの forum で見つけた、ユーザーJim Yingstの投稿:

インターフェースの欠点の1つは、インターフェースを自分の管理外の他のコーダーに公開すると、後で変更するのが難しいパブリックコミットメントを表すことです。他にだれがそのインターフェースを使用しているか、またその方法がわからないため、既存のクライアントのコードが破損する危険性なしに、インターフェースに新しいメソッドを追加することはできません(アップグレードする場合)。これに対して、抽象クラスまたは具象クラスを使用した場合は、新しい具象メソッドを追加するだけで(通常は)問題はありません。

元のインターフェースを拡張または補足して新しいインターフェースを作成し、具体的な実装を変更して、古いインターフェースの代わりに、または古いインターフェースに加えて、新しいインターフェースを実装することで、これを回避できます。そうすれば、既存のクライアントコードを壊すことはありません。通常、クラスにメソッドを追加するよりも多くの作業が必要ですが、それは可能です。

この欠点は、インターフェイスを破棄する理由ではありませんが、インターフェイスを慎重に設計し、新しいリリースで新しいインターフェイスを公開する前に慎重に検討する必要があります。物事をうまく設計するために余分な時間を費やすことで、後で多くの頭痛の種を減らすことができます。

11

Swift/Objective-CプロトコルとJavaのようなインターフェースの大きな違いは、前者のメソッドはデフォルトの実装を持つことができるということです。これは、Javaインターフェースで実行できることではありません。C++抽象クラスと多重継承を持っているようなものです。

POPは新しいですか?すでに述べたように、Objective-Cにもプロトコルがあるため、「新しいもの」と呼ぶのは少しばかりです。ただし、isの新機能Swiftは、参照型ではなく値型を使用してこれらのプロトコルを実装する機能であり、これは、POP紹介されました。

4
Daniel T.

私はマイクロソフトの世界から来たので、その言葉を知りませんでした。しかし、トゥレインの優れた答えを読んだので、私は落とし穴の部分をカバーできます。

POP(インターフェース)がOOP(継承)よりも優れているようではなく、どちらにも目的と長所があります。インターフェースはより緩く、より柔軟です。継承は特定の切り捨てに結び付けますクラスツリーですが、基本、構造、およびガイダンスの無料の実装を提供します。継承が適切に行われている場合、サブクラスのプログラマが物事を台無しにすることは困難です。

しかし、POPの台頭の最も重要な理由は、おそらく比較的新しい分散型のネットワーク化された世界であり、多くの開発者がお互いを知らず、同じプロジェクトに取り組んでいる可能性があります。開発コミュニティのモデルに適合し、プロセスやプログラミング言語の境界(SOA)を横断できます。継承は、同じコンパイラーによってコンパイルされた単一のプロジェクト内でのみ意味があります。それはそれを無効にしません、それはただ異なるドメインを持っています。

1
Martin Maat