異なるプログラミング言語でOOPを学習することに違いはありますか?[閉まっている]


9

OOPを学びたいです。私はPythonを知っており、OOPについてはほとんど知りません。

しかし、フォーラムで「learn OOP」を検索すると、「Pythonは非常に新しいため、PythonでOOPを学習できないのです。Javaを学習してから、JavaでのOOPを理解する必要がある」という男を見かけました。

本当ですか?異なるプログラミング言語でOOPを理解するのに違いはありますか?Java、C#、C ++、Perl、Pythonで学習したいですか?


12
「Pythonは非常に新しいため、PytonでOOPを学ぶことができません。Javaを学び、JavaでOOPを理解できます」それは私には意味がありません。Pythonを使用してOOPを学びたいのであれば、理由はわかりません。頑張れ!
FrustratedWithFormsDesigner 2014

13
PythonはJavaよりも古くないのですか?私の頭の上からそれはそうだと私は信じていますが、私は数年でオフになる可能性があります。
ジミーホファ2014

2
@JimmyHoffaさすがです。ウィキペディアによると91対95。
Evicatos 2014

2
@JimmyHoffa:さあ、それは真実ではあり得ない、それはできます!Javaが最初のオブジェクト指向言語であったことは誰もが知っています。「太陽が大声でジャワの目新しさを告げる」... —質問に関して...なぜあなたはオブジェクト指向を学ぶ決心をしましたか?それはすぐにあなたに強制されます。Pythonは、複数のプログラミングパラダイムの利点を理解するための優れた出発点です。
-leftaroundabout

回答:


10

理論上の構成要素としてのオブジェクトは非常に単純です。データ、関数、またはその両方を格納する構造です。これらの構造には、Python以外のほとんどの言語で暗黙的に存在する「自己」の感覚があるという考えです。これは「記述子」と呼ばれ、データ(変数またはフィールド)および関数(通常はメソッドと呼ばれます)を問題の特定のオブジェクトにバインドする自己参照ポイントをオブジェクトに提供します。いくつかのより大きく、より一般的な構造体ではなく、その特定のインスタンス(通常、割り当てられたメモリブロック)に属する変数またはメソッドを具体的に使用しているという考えです。

オブジェクトシステムは、継承とアクセスという2つの大きなカテゴリに関して異なる傾向があります。

JavaやC ++のように、割り当てられるオブジェクトの「青写真」として機能するクラスを宣言しているクラスもあります。これらのクラスとそのオブジェクトは、一度インスタンス化されると構造的に変更できません。変数は変更できるが、構造は静的であるという意味で、コンテンツをオーバーライドできます。たとえば、JavaのHashMapに新しいメソッドを追加することはできません。インターフェイス(基本的に部分的に実装されたクラスはコントラクトとして機能します)を拡張するか、サブクラスを作成して、問題の特定のクラスのすべての元の変数およびメソッドと共に必要な追加のメソッドまたは変数を取得できます。

他のクラスベースの言語、最も一般的に引用されるのはRubyですが、既存のクラスを簡単に開いて、必要に応じてメソッドを追加することができます。これは論争の骨であり、非常に非常に危険であると多くの人が考えています。

JavaScriptはさらに緩やかです。オブジェクトは、変数または関数のスロットのコレクションにすぎません。プログラマがそうする必要があると感じるときはいつでも、それらを変更または上書きすることができます。それらは他のオブジェクトの「プロトタイプ」として任意に複製することもでき、それによってそれらのすべての能力を渡します。

アクセス制御は、さまざまな言語間のもう1つの大きな違いです。

Javaのような一部の言語には、「プライベート」や「保護」などのアクセス修飾子が厳密に適用されており、特定の変数またはメソッドを使用できるクラスとサブクラスを正確に定義します。

Pythonなどの他のものは、メソッドまたは変数名の前にアンダースコアの規則を使用して、それがプライベートであることを示すため、あまり正式ではありません。

結局のところ、Pythonはオブジェクト指向の方法でプログラミングするのに完全に正当な言語であり、他のいくつかの言語ほど厳密には強制されていません。


この質問には少し専門的すぎるかもしれません。
2014

@zeroth、あまりにも具体的すぎる。'self'(または 'this')パラメータは普遍的ではありません。
ハビエル

@Javierこれが、Pythonでは明示的であり、他の場所では暗黙的であると私が言った理由です。
世界エンジニア

問題はOOPの学習に関するものでありprivate、Javaの場合はカプセル化、__Pythonの場合は下線()のような特定の概念を実現するために言語をどのように記述するかについて議論することはかなり重要だと思います。Pythonの抽象化レベルでは、初心者にとっては少し難しいかもしれませんが、不可能ではありません。Javaは、一部の概念をもう少し簡単に固執させる可能性があるプログラマーのためにそれを綴っています。
デレクW

@WorldEngineer私は明示的/暗黙的であることについて話していない(また、Pythonはこれに関して珍しいことではありません)が、単に概念として存在することについてです。一部の言語では、最初のパラメータだけでなく、すべてのパラメータに対してポリモーフィックディスパッチを実行します。特定のバージョンに他のヒントを使用する人もいます。メインスタイルでは、引数に 'this'の特権が与えられない場合があります。
ハビエル

18

OOPの原則を学ぶは言語固有ではないので、「OOPを学ぶ」が「用語の意味、OOPとは何か、なぜそれを使いたいのかを学ぶ」という意味であれば、言語は重要ではありません。

「OOPを使用して開発する方法を学ぶ」という意味であれば、はい、言語によって処理方法は異なりますが、すべて同じ原則を共有しています。あなたが私のような人なら、あなたはそれをするだけでそれを最もよく学ぶでしょう。オブジェクト指向の側面をカバーし、それを理解できる優れたチュートリアルまたは本を備えたオブジェクト指向言語を選択してください。オブジェクト指向設計の原則を理解していれば、他のオブジェクト指向言語でそれらを使用できます。

「Pythonは非常に新しいので、PytonでOOPを学ぶことができません。Javaを学び、JavaでOOPを理解してください。」

これはちょうど私の頭を傷つけます。とても間違ったことが一文に詰め込まれました。

Pythonの起源は1989年です。

http://python-history.blogspot.com/2009/01/brief-timeline-of-python.html

Javaから1995まで。

http://www.oracle.com/technetwork/java/javase/overview/javahistory-index-198355.html

あなたはそのアドバイスの妥当性についてあなた自身の結論を導くことができます...


1
はい。ただし、Python 1.0は1994年まで存在しませんでした。Javaも、リリースされるまでのかなり長い間開発されていました。しかし、Pythonにはオブジェクト指向があり、オブジェクト指向の概念を学ぶことができることに同意します。そうでないと言うのはばかげています。
chubbsondubs 2014

2
@chubbsondubsうん、それはまだJavaの前です!;)
イズカタ2014

1
軽いカウンターポイントを提供するために、クラスベースのOOP(C ++、Java、Python、その他多数)は、プロトタイプベースのOOP(JavaScriptがこれを使用する唯一の言語です)とはかなり異なります。それらは依然としてOOPであり、基本は同じであり、多くの同じ目的を果たしますが、JavaScriptにはクラスがなく、オブジェクト指向であるため、多くの人々はクラスをOOPの一部と見なしています。
KRyan 2014

@KRyan:ご参考までに、Selfという名前のプロトタイプベースのオブジェクト指向言語がもう1つあります。
Jerry Coffin

ActionScriptにはプロトタイプとクラスの両方があります。
OrangeDog 2014

8

あなたが引用している人物は、単に言語優越主義を示していたと思います。

実際には、OOPの概念とOOPの実装には違いがあります。詩的には、OOPのいくつかの概念をよく理解すれば、これは最もよく理解されます。

多くのプログラマーは、いくつかの類似した言語に慣れるだけなので、能力を拡張したり、しばらく能力がないことに悩まされたりする必要はありません。

では、問題は、実際にはPython がOOP の概念を教えてくれるのでしょうか?

自分主導の学習では通常探求しないことを試すように促す十分な学習サポートがあれば、できると言います。本かある種のメンターが一番いいでしょう。Mark Lutzは、Pythonについて非常に詳細で、非常に詳細で、非常に優れた本を書いています。私は彼に本を勧めます。

覚えておくべきことは、Pythonの方法は唯一の方法ではなく、唯一の正しい方法でもないということです。プログラミングパラダイムを習得すればするほど、優れたプログラマーになります。PythonがOOPを行う方法は、C ++またはJavaが行う方法とは厳密には異なりますが、概念はうまく移行します。


4
OOPの点では、JavaとC ++はPythonとは異なり、互いに異なります。
Gort the Robot、

ある程度までは、それは主に言語設計の知識の変化とさまざまな制約によるものです。
ゼロス

そして率直に言って、OOPの概念の90%はそれらの間でうまく移行します。
ゼロス

うん、同意する。OOPに関してJavaとC ++が「同じ」であると考えるのは少しおかしいと思います。
Gort the Robot、

4

はい、OOPの実装は大きく異なります。理論と原則は同じですが、多くの人々はJavaとC ++が行う「実際のOOP」のみを検討しているため、「言語にとらわれない」はずの多くの参照が得られますが、実際にはクラスベースの静的型付け言語を想定しています。

これは、それらの参照が悪い、または制限されているという意味ではありません。たとえば、「ギャングオブ4」(GoF)の独創的な著書「デザインパターン:再利用可能なオブジェクト指向ソフトウェアの要素」は、「静的クラスベースのOOP」を本当に意味する「OOP」と言う素晴らしい作品の典型的な例です。

したがって、私の意見では、はい。Python、Javascript、C、およびその他の多くの言語で多くのOOPを学ぶことができます。しかし、「OOP経験」を求める人(おそらく将来の雇用主)は、Java / C ++ / C#を意味します。したがって、他のビューも確認することをお勧めします。

(そして、それらはOOPの2つの「タイプ」だけではありません...)。


2
皮肉なことに、クラスベースのOOPは、Alan Keyが最初にOOPとして提案したものではありません。しかし、「学習」OOPの多くは、特定のOOP実装に厳密に限定されない学習デザイン/コーディング感覚に関するものです
Daniel Gratzer

2
CLOSを見るのも意味があるかもしれません。私は、多くの言語/フレームワークがマルチメソッドを提供しているとは思いません。
ジョルジオ

2
@jozefg:そうです、アラン・ケイはかつて「実際には「オブジェクト指向」という用語を作り上げたので、C ++を考えていなかったと言えるでしょう。」
ハビエル

1
@Giorgio実際には、ディランはCLOSの少しシンプルなバージョンを提供するかもしれません(マルチメソッドを実行するタイミングを指定する方法はありませんが、アプローチははるかに簡単です)
Daniel

4

オブジェクト指向プログラミングは、低カップリング、情報の非表示(別名:カプセル化)、データとそのデータを一緒に操作するメソッドのバンドル、およびコードの再利用を促進するプログラミング言語を構築する方法に関するアイデアです。多くの言語がこれらのアイデアを取り入れているため、オブジェクト指向への取り組み方について言語間でばらつきがあります。たとえば、Javaは1つのクラスを拡張するクラスのみを許可します。ただし、PythonおよびC ++では、任意の数のクラスを拡張できます。Javaには、その制限について特定の理由があります。C ++からの修正を意図した制限ですが、Smalltalkは単一の基本クラスしかサポートしないためです。

オブジェクト指向言語は2つのファミリーにグループ化できます。言語のSmalltalkファミリ(またはクラスベースのOOP)には、C ++、Java、Smalltalk、Ruby、C#、Pythonなどが含まれます(このファミリには多数あります)。これらは静的型言語と動的型言語の混合であり、一部の概念はわずかに異なりますが、OOPについての考え方が非常に似ています。つまり、結合、カプセル化、データとメソッドのバインド、コードの再利用、およびそれらを実現するために提供するツールへのアプローチ方法です。このファミリ内では、概念の多くは同じです。

もう1つのファミリは、プロトタイプベースのOOPです。これらの言語は、OOP実装において非常に異なって見えます。おそらくこれの最もよく知られている例はJavascriptですが、JavascriptはこれらのアイデアをSchemeおよびObject LISPからコピーしたものです。これらはあまり知られていない言語で、通常は動的に型付けされます。静的に型付けされたプロトタイプベースの言語を考えることはできませんが、それが存在しないという意味ではありません。あなたはそれをここで読むことができます:http : //en.wikipedia.org/wiki/Prototype-based_programming。ポイントは、クラスベースの言語とはまったく異なる方法でOOPにアプローチすることです。つまり、これらの2つのファミリ間でコンセプトを移植することはできません。あるファミリーのOOを知っているからといって、それらのアイデアを他のファミリーに簡単に移行できるわけではありません。

ほとんどのプログラミング言語は多くのアイデアからの概念を混合していることを覚えておいてください。PythonとRubyは、OOPと関数型プログラミングの両方のアイデアを言語に組み込んでいます。また、プロトタイプベースのOOとクラスベース言語の特定の拡張機能を組み合わせることができるため、さらに複雑になります。


私はC ++をSmalltalkファミリーに数えません。SmalltalkはSimulaに基づいており、Alan Kay はSimula-IIのほとんどの変更を意図的に無視していますが、C ++はそれに基づいています。C#は奇妙です。C++ユーザーとPascalデザイナーによってJavaのように設計されました。
イェルクWミッターク

1

OOPはプログラミングの原則であり、基本的にはアイデアです。OOPの実装はプログラミング言語全体で異なりますが、OOPの柱(抽象化、継承、カプセル化、およびポリモーフィズム)は通常、何らかの形で存在しています。

どちらの言語も優先せずに、JavaはセマンティクスをPythonよりもプログラマーに少し強く押していると言います。

例えば、

Javaコード: class Cat extends Animal {}

物事のOOPの観点で何をしているのかについては、次のことよりも少し明白です。

Pythonコード: class Cat(Animal):

もちろん、どちらもCatがAnimalから継承するクラス階層を定義しています。しかし、OOPから始めたばかりのプログラマーにとって、OOPのアイデアのアプリケーションと意味は、プログラマーのためにそれを綴っているので、Javaで少し良くなるかもしれないと感じています。


1

OOPの概念を学ぶのに最も簡単な言語は何かを明確に尋ねています。答えは明確だと思います:python

これが事実である理由を示すために、JavaとPythonの典型的な初心者プログラムを見てみましょう。シンプルな高低推測ゲームを作ってみましょう。

ジャワ

Javaでは、Gameクラスを記述します。

public class Game {
    public int secretNumber;
    public int tries;

    public Game(int tries, int secretNumber) {
        this.tries = tries;
        this.secretNumber = secretNumber;
    }

    public void guess(int myNumber) {
        if(myNumber > secretNumber)
            System.out.println("Your guess is too high!");
        else if (myNumber < secretNumber)
            System.out.println("Your guess is too low!");
        else
            System.out.println("You win!!");
        tries = tries - 1;
        if(tries == 0) {
            System.out.println("No more tries: you lose :(");
        }
    }

    public static void main(String[] args) {
        Game game = new Game(10, 47);
        while(true) {
            // how do I read a newline again? Something with BufferedInputStreamReader?
            // how do I convert a String to a number?
        }
    }
}

私は経験豊富なプログラマーですが、苦労しています。さらに、この簡単なプログラムの見込み生徒に何を説明する必要があるかを見てください。

  • 静的メソッド
  • 可視性(パブリックvsプライベート)。フィールドは常にプライベートとしてマークする必要があります。
  • this. 他のユーザーによってマスクされているときに変数を参照するための表記
  • コンストラクタはメソッドに似ていますが、メソッドではありません。
  • System.outoutputStreamです。はい、それはフィールドですが、staticフィールドです。
  • ステートメントが1つしかない場合は、中括弧を省略することができます
  • String[]配列です。これは特別なタイプのオブジェクトですが、実際にはそうではありません。
  • intプリミティブ型です。特別です。
  • 多くのフレームワークメソッドが必要です

パイソン

Pythonは「純粋」です。プリミティブ型はありません。コンストラクタは存在せず、初期化時に呼び出される特別なメソッドのみがあります。

を持っているので、コンソールと対話する必要はありませんREPL。あなたは単に使用してゲームをプレイすることができますg.guess(35)文字列して返すます。

これにより、言語がOOPの基本的な概念を学習および把握しやすくなります。


0

OOPの中核となるアイデアは、クラス内(Pythonが完全にサポートしている)の内部で変数とメソッドを一緒にカプセル化(つまり、バンドルまたは非表示)することです。名詞を中心にコードを設計することです。その後、そこから少し進んでいきます。

実装の違い(たとえば、PythonはJavaのように可視性をサポートしていません)と構文の違い(Javascriptでは、自分でメソッドを継承する必要があります)がありますが、基本的な設計は同じです。

Javaのような言語でOOPを学ぶ方が簡単だと思います。なぜなら、言語はそれを必要とし、コミュニティは、たとえばpythonコミュニティよりも悪影響が少ないからです。

しかし、そこにはOOPの設計と実践について多くの文書があり、それを読むことは無駄な努力ではありません。Python(たくさんある)を書くときでも、たくさんのオブジェクトを書き、サードパーティのライブラリからたくさんのオブジェクトを使用します。


コードのアイデアはメッセージパッシングです。ソースもありません。
ユーザー

1
OOPはクラスに関するものではありません
イェルクWミッターク

1
@User Alan Kayの当初のアイデアはメッセージングに関するものでしたが、それ以降、OOの実践は名詞またはオブジェクトのクラスによってデザインに発展しました。たとえば、ケイ博士は、Javaは遅延バインディングをサポートしていないため、オブジェクト指向ではないとも考えています。@ Jorg lol ya ya
Rob

0

言語でOOPを学ぶとき、あなたはこの言語で考え始めます。言語は、あなたが何ができると思うか、どのように影響するか、そしてOOPに風味を追加します。

  • ガベージコレクションがありますか?
  • 整数にメソッドを追加できますか?
  • クラスまたはプロトタイプを使用しますか?
  • オブジェクトはどのように自分自身を反映しますか?

クラスがなければOOPを行えない人もいます。いくつかはプロセスでオブジェクトを殺さなければなりません。

OOPのコアとそれに関する独自のアイデアがあります。Smalltalk、Self、Simula、LISP、Newspeakもご覧いただけます。また、データフロー言語bash、APL、Jなどの非OOP言語タイプも見てください。Haskell(型クラス)。彼らはみなあなたに別の考え方を教え、あなたはそれを学ぶかもしれません

  • OOPは命令型言語についてではありません
  • OOPはクラスに関するものではありません

そして最終的に、OOPが何に適しているかがわかるでしょう。少なくともあなたはそれについて別の考えを持つでしょう。アラン・ケイの講演を探すことをお勧めします。


言語を見ないなら、この投稿は役に立たない。

ここを見るとわかるように、OOPが何であるかについては同意できません。

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