Goのような言語に対する従来のOOPの利点


13

私は言語設計と「理想的な」プログラミング言語に必要な要素について多くのことを考えてきましたが、GoogleのGoを勉強することで、そうでなければ一般的な知識の多くを疑問視するようになりました。

具体的には、Goはオブジェクト指向言語の構造を実際に持たずに、オブジェクト指向プログラミングの興味深い利点をすべて備えているようです。クラスはなく、構造のみがあります。クラス/構造の継承はなく、構造の埋め込みのみです。階層はなく、親クラスも、明示的なインターフェイス実装もありません。代わりに、型キャストルールはアヒルのタイピングに似た緩やかなシステムに基づいており、構造体が「リーダー」または「リクエスト」または「エンコード」の必要な要素を実装する場合、キャストして使用できます。一つとして。

Goのような言語に移行するときにあきらめなければならない、本質的に機能性、保守性、強力な、C ++およびJavaとC#で実装されたOOPについて何かありますか?この新しいパラダイムが表すシンプルさを得るために、あきらめなければならないメリットは何ですか?

編集
読者が過度にハングアップして怒りを覚えるように見える「時代遅れの」質問を削除しました。

問題は、一般的な言語の実装でよく見られる従来のオブジェクト指向のパラダイム(階層など)は、この単純なモデルでは簡単に実行できないものを提供する必要があるということです。または、言い換えると、今日言語を設計する場合、クラス階層の概念を含めたい理由はありますか?


1
OOPは手続き型プログラミングを廃止しましたか?私はつまらなく聞こえるか、私があなたに話していることを嫌いますが、それは頭に浮かんだ最初の文でした。Goは、新しい(っぽい)パラダイムを提供します。実験を行うことで、ユーザーは(すべてのパラダイムや言語のように)得意なものと得意でないものを見つけ出し、Goで書かれた何百もの素晴らしい製品(悪い製品のかなりの部分を含む)になります。少なくとも、それは私の意見です
ジェイミーテイラー

1
Google for OOPが死んだとき、いくつかの興味深い読み物があります。OOPが終了するとWebが終了する
-Andomar

OOPには非常に小さな価値があるため、時間を無駄にする価値はまったくありません。
SKロジック

1
以前のコメントがOOPにあまり焦点を合わせていないことに同意します。OOP以外に、C ++やJavaを意味するわけではありません。ltu.orgでabitを読んでみてください
AndreasScheinert

C ++、Java、およびC#は「古典的な」OOP言語ではありません。古典的なOOP言語があれば、それはSmalltalkだと思います。
ケビンクライン

回答:


16

新しいパラダイムはありません。オブジェクト指向は、プログラムを作成するために使用するパターンであり、明確に定義されていません。さまざまな言語は、オブジェクト指向に典型的なさまざまな特性(新しい型の定義、カプセル化、型階層、ポリモーフィズム、メッセージパッシングなど)を提供しますが、他の特性を提供できない場合があります。これらの場合、必要に応じてそれらをエミュレートするのはプログラマー次第です。

これらの機能を提供する言語の多くには、クラスの概念に類似したものがありません。たとえば、JavascriptやCommon Lispです。Javaに似た言語(クラスベース、単一継承、インターフェース、型ベースのディスパッチ)によって提供される実装は、可能性の1つにすぎず、必ずしも最適なものではありません。


11
「必ずしも最良のものではない」ための+1。アラン・ケイを引用して:「私はオブジェクト指向という用語を発明しました、そして私はC ++を念頭に置いていなかったと言うことができます。」(彼はC#やJavaも持っていませんでした。謙虚に推測します)
-herby

1
@herby私は、エージェントシステム(Erlangの仕組みに似ている)がAOPに対するAlan Kayの最終的な意図に近いことを示唆しているのを見ました。
CodexArcanum

2
えー、Common Lispには間違いなくクラスがあります。ただし、通常、CLクラスにはデータが含まれ、メソッドは「汎用関数」で定義されます。副作用として、複数のディスパッチを行う便利な方法が提供されます。メソッドが「単一の実装クラス」に密接に結合されなくなったためです。
バティーン

はい、私が意味することは、Javaの感覚でクラスを持っていないということです
アンドレア

5

この新しいパラダイムが表すシンプルさを得るために、あきらめなければならないメリットは何ですか?

構造型システムの型チェックは、ベースクラスが継承リストにあるかどうかを単純にチェックするよりもはるかに複雑です。仮想ディスパッチは少し複雑になり、パフォーマンスが低下する可能性があります。

そのようなシステムはOOPの概念を廃止しますか?

いいえ。命令のリスト、宣言されたルールのセット、またはカスケードされた一連の関数ではなく、「物事を行うオブジェクト」の観点からプログラムを作成できる限り、実装は関係ありません。同様に、型システムを変更しても、一般的なオブジェクト指向の原則は無効になりません。

基本型で作業することはできますが、実際の型は気にしません。タイプを変更せずに拡張できます。それでも、型に1つのことだけを実行させることができます。それでも、きめの細かいインターフェイスを提供できます。タイプに抽象化を引き続き提供できます。

言語がそれをどのように許可するかは、実際には重要ではありません。


実際、GoはこれらすべてのOOPを簡単にし、型を拡張して既存のインスタンスに適用する新しいインターフェイスを提供するなど、いくつかの追加の可能性を追加します(もちろん、新しいデータメンバーが必要ない限り)。
ジャン・ヒューデック

4

OOPについてのあなたのアイデアは、少し外れていると思います。

「オブジェクト指向プログラミング」という用語を発明しましたが、この{JavaとC ++}は、私が念頭に置いていたものではありません。
- アラン・ケイ

タイピングの選択(主格のサブタイピング、構造サブタイピング、アヒルタイピング、またはこれらの組み合わせ)は、OOPにほぼ直交しています。継承とクラスは、OOPに完全に直交しています。ioで遊ぶのに少し時間がかかるなら、あなたはそれを見るようになるでしょう。

これで、どの種類のシステムが「より良い」か、コードの再利用と組み合わせの手段はどれかを尋ねることができます。そして、Simulaで行われた選択(および、後にC ++、Java、C#で行われた選択)とGoで行われた選択の間の長所と短所を判断してください。しかし、これらはすべて異なる明確な質問です。

最終的に、OOPは非常に曖昧な概念であり、OOPを実装しようとするすべての試みは非常に多様なフレーバーで行われます。しかし、物事を本当に簡素化するために、OOPの核となる考え方は、SOLIDサブシステムのシステムを構成することだと思います。これにより、他のパラダイムとの境界線が完全に曖昧になりますが、それがマルチパラダイム言語が最近人気を博している理由であり、GoogleがGoでそれを独自に撮影した理由だと推測します。


2
質問は概念に関するものであり、用語ではありません。クラス階層の概念とそれに付随するすべてのトリミングを参照するために「OOP」よりも良い名前を思い付くことができるなら、代わりにそれを使うことができます。
タイラー

@tylerl:少なくとも2つの質問を1つに混同しています。1つは、構造的サブタイピングが主格サブタイプよりも優れているかどうかです。もう1つは、基本的に、構成が継承よりも優れているかどうかです。これらの質問は相互に直交しています。最終的に、「最良の」言語はあなたにとってこの選択をしないと思います。Goには別の問題があると推測しますが、Googleがこれらの機能を「元に戻す」かどうかを確認します。
back2dos

C ++のほとんどの機能を備えているが、より小さくてシンプルな1つの言語が欲しいです。C ++は、カーネルにとって現実的なC以外の唯一の言語であり、デストラクタやSTLなどの非常に便利なツールを提供します。そして、重要な原則は、「使用しない場合は支払いません」です。正しく使用されているオブジェクト指向は非常に強力です。しかし、ジェネリックおよびその他の非オブジェクト指向の概念も非常に必要です。Cはあなたにほとんど何も与えません、そしてGoはいくつかの奇妙な新しい絡み合ったアイデアのために本当のオブジェクト指向を捨てます。
エリックアラパエ16

1

OOPは廃止されていません。

アンドレアが言ったように、クラスの代替として提案された多くの概念がありました(例:haskell typeclass)。OOPには大きな利点が1つあります。それは多くの場所で教えられており、OOPの文化は開発者の間で大部分が共有されています。

これにより、チーム内でより豊かなコミュニケーションが可能になります。Zygohistomorphic prepromorphismsよりも簡単に工場について話すことができます。OOPは、一般的に使用される図を使用して、プログラムを整理および通信する方法を構築します。これは強力な資産です。


1
私は思う:多くの場所で教えた。実際には利点ではありません。
アンドレアスシャイナート

@AndreasScheinertなぜそれがアドバンテージにならないのですか?
サイモンベルゴ

判断を下すためには、少なくとも1つの選択肢が同等に優れていることを知っておく必要があります。それは習慣問題であり、人々は快適なゾーンに留まることを好み、それが停滞につながります。
アンドレアスシャイナート

@AndreasScheinertは、仕事に適したツールを使用します。OOPは、すべてのシナリオのための作業が....自分の快適ゾーンとは何の関係もありません
pqsk

1

いいえ、ここには新しいものは何もありませんし、OOPも廃止されました。C ++にはテンプレート形式の暗黙的なインターフェイスもありますが、依然として仮想関数を使用しています。たとえば、バイナリインターフェイス、またはコンパイル時に他のコードが単にわからないインターフェイスに対処するには、明示的なインターフェイスが必要です。

これは単に推論と明示的な記述の場合であり、「新しいパラダイム」のようなものではなく、実際により便利であると主張することができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.