web-dev-qa-db-ja.com

OOP異なるプログラミング言語で学習に違いはありますか?

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

しかし、フォーラムで「learn OOP」を検索すると、「Pythonは非常に新しいため、PythonではOOPを学習できません。Java理解するOOP) "

本当ですか?異なるプログラミング言語でOOP=を理解するのに何か違いはありますか?Java、C#、C++、PerlまたはPythonでそれを学ぶようなものですか?

9
user2783998

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

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

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

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

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

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

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

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

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

10
World Engineer

学習OOP原則は言語固有ではないので、「learn OOP」とは、「何を学ぶか用語は、OOPとは何か、そしてなぜそれを使用したいのか "を意味します。その場合、言語は重要ではありません。

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

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

これで頭が痛くなります。とても間違ったことが一文に詰め込まれました。

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

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

18
Paul Glover

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

実際には、概念のOOPと実装のOOPの間には違いがあります。理論的には、これはOOPの概念のいくつかを理解する。

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

つまり、問題は本当にPythonがあなたにOOPの概念を教えることになるでしょうか?

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

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

8
Zeroth

はい、OOP実装は非常に異なります。理論と原則は同じですが、多くの人々は "実際のOOP"のみを考慮しますJavaおよびC++は「言語にとらわれない」はずの多くの参照を取得しますが、実際には、クラスベースの静的に型付けされた言語を想定しています。

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

だから、私の意見では:はい、あなたは多くのOOPを学ぶことができますが、 "OOP経験」は、Java/C++/C#を意味します。したがって、他のビューも確認することをお勧めします。

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

4
Javier

オブジェクト指向プログラミングは、低結合、情報の非表示(別名:カプセル化)、データとそのデータを一緒に操作するメソッドのバンドル、およびコードの再利用を促進するプログラミング言語を構築する方法に関するアイデアです。多くの言語がこれらのアイデアを取り入れているため、オブジェクト指向への取り組み方については言語間でばらつきがあります。たとえば、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とクラスベースの言語の特定の拡張機能を組み合わせることができるため、さらに複雑になります。

4
chubbsondubs

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

私はどちらの言語も優先せずに、Javaは、セマンティクスをプログラマーにPythonを言うよりも少し難しいものに押し上げます。

例えば、

Javaコード:_class Cat extends Animal {}_

OOP物事の視点であなたが何をしているのかについては、次のことよりも少し明白です:

Pythonコード:class Cat(Animal):

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

1
Derek W

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

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

Java

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.out_はoutputStreamです。そして、はい、それはフィールドですが、staticフィールドです。
  • ステートメントが1つしかない場合は、中括弧を省略することができます
  • _String[]_は配列です。これは特別なタイプのオブジェクトですが、実際にはそうではありません。
  • intはプリミティブ型です。特別です。
  • たくさんのフレームワークメソッドが必要です

Python

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

REPLがあるため、コンソールを操作する必要はありません。 g.guess(35)を使用してゲームをプレイし、文字列を返すだけです。

これにより、基本的なOOP概念を理解し、理解することが容易になります。

1
parasietje

OOP=の中核となるアイデアは、変数とメソッドをクラス内にカプセル化する(つまり、バンドルまたは非表示を意味する)ことです(pythonが完全にサポートします)。これは、名詞の周りのコードです。

実装の違い(たとえば、pythonは可視性をサポートしていませんJavaはサポートしています)および構文の違い(JavaScriptでは、メソッドを継承する必要があります)あなた自身)、基本的なデザインは同じままです。

OOPはJavaのような言語で習得する方が簡単だと思います。ただし、言語はそれを必要とし、コミュニティは、例えばpythonコミュニティ。

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

0
Rob

ある言語でOOP=を学ぶと、この言語で考えるようになります。その言語は、あなたができると思うことに影響を与え、OOPにフレーバーを追加します。

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

クラスなしではOOPを実行できない人もいます。プロセスでオブジェクトを強制終了しなければならない人もいます。

OOPのコアとそれに関するオリジナルのアイデアがあります。Smalltalk、Self、Simula、LISP、Newspeakもご覧になれます。また、次のような非OOP言語タイプもご覧ください。データフロー言語bash、APL、J。論理的なものProlog。Haskell(型クラス)これらはすべて異なる考え方を教え、あなたはそれを学ぶかもしれません

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

最後に、OOPが適していることを確認できます。少なくともそれについて別のアイデアがあります。 Alan Kay で講演を見つけることをお勧めします。


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

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

0
User