私は言語設計と「理想的な」プログラミング言語に必要な要素について多くのことを考えていましたが、GoogleのGoを勉強して、それ以外の多くの一般的な知識に疑問を投げかけました。
具体的には、Goはオブジェクト指向プログラミングの興味深い利点をすべて備えているようですが、実際にはオブジェクト指向言語の構造はありません。クラスはなく、構造のみです。クラス/構造の継承はなく、構造の埋め込みのみです。階層、親クラス、明示的なインターフェース実装はありません。代わりに、型キャストルールは、ダックタイピングと同様の緩いシステムに基づいています。そのため、構造体が「リーダー」、「リクエスト」、または「エンコーディング」の必要な要素を実装する場合、キャストして使用できます。一つとして。
OOP C++とJavaおよびC#で実装されているように、本質的により機能的で、より保守可能で、なんらかの理由で、あきらめなければならないより強力なC#について何かありますか?囲碁のような言語への移行?この新しいパラダイムが表すシンプルさを得るには、どのようなメリットをあきらめる必要がありますか?
[〜#〜]編集[〜#〜]
読者が過度に夢中になり、憤慨しているように思われる「時代遅れ」の質問を削除しました。
問題は、一般的な言語の実装で頻繁に見られる従来のオブジェクト指向のパラダイム(階層など)では、この単純なモデルでは簡単に実行できないことを何が提供する必要があるのかということです。あるいは、言い換えれば、今日言語を設計する場合、クラス階層の概念を含めたいと思う理由はありますか?
新しいパラダイムはありません。オブジェクト指向は、プログラムの作成に使用するパターンであり、明確に定義されていません。さまざまな言語が、オブジェクト指向に典型的なさまざまな特性(新しいタイプの定義、カプセル化、タイプ階層、ポリモーフィズム、メッセージパッシングなど)を提供しますが、他の言語を提供できない場合があります。これらの場合、必要に応じてそれらをエミュレートするのはプログラマの責任です。
これらの機能を提供する言語の多くには、JavascriptやCommon LISPなどのクラス概念の類似物がありません。 Javaライクな言語(クラスベース、単一継承、インターフェース、タイプベースのディスパッチ)によって提供される実装は、可能性の1つにすぎず、必ずしも最良のものではありません。
この新しいパラダイムが表す単純さを得るには、どのようなメリットをあきらめる必要がありますか?
構造型システムの型チェックは、ベースクラスが継承リストにあるかどうかを単にチェックするよりもはるかに複雑です。仮想ディスパッチは少しトリッキーになり、パフォーマンスが低下する可能性があります。
そのようなシステムはOOPの概念を廃止しましたか?
いいえ。命令のリスト、宣言された一連のルール、またはカスケードされた一連の関数ではなく、「物事を行うオブジェクト」の観点からプログラムを作成できる限り、実装は重要ではありません。同様に、型システムを変更しても、一般的なOO原則)が無効になることはありません。
それでも基本型で作業でき、実際の型は気にしません。タイプを変更せずに拡張することもできます。型に1つの処理のみを実行させることができます。細かいインターフェースを提供することもできます。それでも、型に抽象化を提供できます。
方法言語が許可することは、実際には重要ではありません。
OOP=についてのあなたの考えはかなりずれています:
私は「オブジェクト指向プログラミング」という用語を考案しましたが、この{JavaおよびC++}は私が考えていたものではありません。
- Alan Kay 。
タイピング(主格サブタイピング、構造サブタイピング、アヒルタイピング、またはそれらの組み合わせ)の選択は、OOPとほぼ直交しています。継承とクラスは、OOPに対して完全に直交しています。 io で遊ぶのに少し時間がかかると、それがわかるようになります。
ここで、どのタイプのシステムが「より良い」か、どのコード再利用と組み合わせの手段が良いかを尋ねることができます。そして、Simulaで行われた選択(および後にC++、JavaおよびC#)で行われた選択)とGoで行われた選択の間の利点と欠点を特定してみてください。しかし、これらはすべて異なる明確な質問です。
結局のところ、OOPは非常にあいまいな概念であり、それを実装するすべての試みは非常にさまざまなフレーバーで行われます。しかし、物事を本当に簡単にするために、OOPは [〜#〜] solid [〜#〜] サブシステムのシステムを構成することです。これにより、他のパラダイムとの境界が完全にぼやけますが、それが理由であると推測しますマルチパラダイム言語は最近人気が高まっており、GoogleがGoを使って独自の試みを行っている理由はここにあります。
OOPは廃止されていません。
Andreaが言ったように、クラスの代替として提案された多くの概念があります(例:haskell typeclass)。 OOPには1つの大きな利点があります。それは多くの場所で教えられており、OOPの文化は主に開発者の間で共有されています。
これにより、チーム内でより豊かなコミュニケーションが可能になります。 factories については Zygohistomorphic prepromorphisms についてよりも簡単に話すことができます。 OOPは、一般的に使用される図を使用して、プログラムについて整理および通信する方法を構成します。これは強力な資産です。
いいえ、ここには何も新しいものはありません。また、OOP廃止されました。C++にはテンプレートの形で暗黙のインターフェースもありますが、人々は依然として仮想関数を使用しています。たとえば、バイナリに対処するには明示的なインターフェースが必要です。インターフェース、または他のコードがコンパイル時に単純に認識されないインターフェース。
これは、単に推論する場合と明示的に説明する場合の違いであり、「新しいパラダイム」とは異なり、本当に便利なものであると主張できます。