編集:
さらなる混乱を避けるために:私はウェブサービスなどについて話していません。内部でアプリケーションを構造化することについて話しているのですが、それはコンピューターの通信方法についてではありません。プログラミング言語、コンパイラー、および命令型プログラミングパラダイムの拡張方法についてです。
元の:
命令型プログラミングの分野では、過去20年(またはそれ以上)に2つのパラダイムがありました。オブジェクト指向(OO)とサービス指向(SO)です。コンポーネントベース(CB)。
両方のパラダイムは、モジュールの独自の概念を導入することにより、命令型プログラミングパラダイムを拡張します。OOはそれらをオブジェクト(およびクラス)と呼び、データ(フィールド)とプロシージャ(メソッド)の両方を一緒にカプセル化します。SOは対照的に、データ(レコード、Beanなど)をコード(コンポーネント、サービス)から分離します。
ただし、Smalltalk、C ++、Javaおよびその他すべてのJVM互換、C#およびその他すべての.NET互換、Pythonなど、そのパラダイムをネイティブにサポートするプログラミング言語を持っているのはOOのみです。
SOにはそのような母国語はありません。COM / DCOM(バイナリ、C、C ++)、CORBA、EJB、Spring、Guice(すべてJava)などの手続き型言語またはオブジェクト指向言語の上にのみ存在します。
これらのSOフレームワークは、その概念のネイティブ言語サポートが欠落していることは明らかです。
- OOクラスを使用して、サービスとレコードを表し始めます。これにより、メソッドのみ(サービス)を持つクラスとフィールドのみ(レコード)を持つクラスが明確に区別される設計になります。サービスまたはレコード間の継承は、クラスの継承によってシミュレートされます。技術的には、厳密に保持されていませんが、一般的に、プログラマーは2つの役割のうちの1つだけを行うようにクラスを作成することをお勧めします。
- 追加の外部言語を使用して、欠落している部分を表現します。IDL、XML構成、Javaコードの注釈、またはGuiceのような埋め込みDSLです。サービスの構成はサービスコード自体の一部ではないため、これは特に必要ですが、これに限定されません。OOでは、オブジェクトは他のオブジェクトを作成するため、そのような機能は必要ありませんが、SOでは他のサービスをインスタンス化または構成しないためです。
- それらは、プログラマーがSOを「駆動」するために必要なすべてのコードを書かなければならないOO(初期のEJB、CORBA)の上に内部プラットフォーム効果を確立します。クラスはサービスの性質の一部にすぎず、多くのクラスを作成して一緒にサービスを形成する必要があります。プログラマーのためにそれを行うSOコンパイラーがないため、そのすべてのボイラープレートが必要です。これは、一部の人々がC ++が存在しないときにOO for Cでそれを行ったのと同じです。オブジェクトのデータを保持するレコードを、メソッドであるプロシージャの最初のパラメーターとして渡すだけです。OO言語では、このパラメーターは暗黙的であり、コンパイラーは仮想関数などに必要なすべてのコードを生成します。SOの場合、これは明らかに欠落しています。
- 特に、新しいフレームワークでは、AOPまたはイントロスペクションを使用して、欠落している部分をオブジェクト指向言語に追加しています。これは、必要な言語表現力をもたらしませんが、前のポイントで説明したボイラープラットフォームコードを避けます。
- 一部のフレームワークは、コード生成を使用してボイラープレートコードを生成します。XMLの構成ファイルまたはOOコードの注釈は、このための情報源です。
上記のすべての現象がSOに起因するとは限りませんが、SO言語が必要であることを明確に示すことを望みます。このパラダイムは非常に人気があるため、なぜ存在しないのですか?または、学術的なものもあるかもしれませんが、少なくとも業界では使用していません。