OOPを学びたいです。私はPythonを知っており、OOPについてはほとんど知りません。
しかし、フォーラムで「learn OOP」を検索すると、「Pythonは非常に新しいため、PythonでOOPを学習できないのです。Javaを学習してから、JavaでのOOPを理解する必要がある」という男を見かけました。
本当ですか?異なるプログラミング言語でOOPを理解するのに違いはありますか?Java、C#、C ++、Perl、Pythonで学習したいですか?
OOPを学びたいです。私はPythonを知っており、OOPについてはほとんど知りません。
しかし、フォーラムで「learn OOP」を検索すると、「Pythonは非常に新しいため、PythonでOOPを学習できないのです。Javaを学習してから、JavaでのOOPを理解する必要がある」という男を見かけました。
本当ですか?異なるプログラミング言語でOOPを理解するのに違いはありますか?Java、C#、C ++、Perl、Pythonで学習したいですか?
回答:
理論上の構成要素としてのオブジェクトは非常に単純です。データ、関数、またはその両方を格納する構造です。これらの構造には、Python以外のほとんどの言語で暗黙的に存在する「自己」の感覚があるという考えです。これは「記述子」と呼ばれ、データ(変数またはフィールド)および関数(通常はメソッドと呼ばれます)を問題の特定のオブジェクトにバインドする自己参照ポイントをオブジェクトに提供します。いくつかのより大きく、より一般的な構造体ではなく、その特定のインスタンス(通常、割り当てられたメモリブロック)に属する変数またはメソッドを具体的に使用しているという考えです。
オブジェクトシステムは、継承とアクセスという2つの大きなカテゴリに関して異なる傾向があります。
JavaやC ++のように、割り当てられるオブジェクトの「青写真」として機能するクラスを宣言しているクラスもあります。これらのクラスとそのオブジェクトは、一度インスタンス化されると構造的に変更できません。変数は変更できるが、構造は静的であるという意味で、コンテンツをオーバーライドできます。たとえば、JavaのHashMapに新しいメソッドを追加することはできません。インターフェイス(基本的に部分的に実装されたクラスはコントラクトとして機能します)を拡張するか、サブクラスを作成して、問題の特定のクラスのすべての元の変数およびメソッドと共に必要な追加のメソッドまたは変数を取得できます。
他のクラスベースの言語、最も一般的に引用されるのはRubyですが、既存のクラスを簡単に開いて、必要に応じてメソッドを追加することができます。これは論争の骨であり、非常に非常に危険であると多くの人が考えています。
JavaScriptはさらに緩やかです。オブジェクトは、変数または関数のスロットのコレクションにすぎません。プログラマがそうする必要があると感じるときはいつでも、それらを変更または上書きすることができます。それらは他のオブジェクトの「プロトタイプ」として任意に複製することもでき、それによってそれらのすべての能力を渡します。
アクセス制御は、さまざまな言語間のもう1つの大きな違いです。
Javaのような一部の言語には、「プライベート」や「保護」などのアクセス修飾子が厳密に適用されており、特定の変数またはメソッドを使用できるクラスとサブクラスを正確に定義します。
Pythonなどの他のものは、メソッドまたは変数名の前にアンダースコアの規則を使用して、それがプライベートであることを示すため、あまり正式ではありません。
結局のところ、Pythonはオブジェクト指向の方法でプログラミングするのに完全に正当な言語であり、他のいくつかの言語ほど厳密には強制されていません。
private
、Javaの場合はカプセル化、__
Pythonの場合は下線()のような特定の概念を実現するために言語をどのように記述するかについて議論することはかなり重要だと思います。Pythonの抽象化レベルでは、初心者にとっては少し難しいかもしれませんが、不可能ではありません。Javaは、一部の概念をもう少し簡単に固執させる可能性があるプログラマーのためにそれを綴っています。
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
あなたはそのアドバイスの妥当性についてあなた自身の結論を導くことができます...
あなたが引用している人物は、単に言語優越主義を示していたと思います。
実際には、OOPの概念とOOPの実装には違いがあります。詩的には、OOPのいくつかの概念をよく理解すれば、これは最もよく理解されます。
多くのプログラマーは、いくつかの類似した言語に慣れるだけなので、能力を拡張したり、しばらく能力がないことに悩まされたりする必要はありません。
では、問題は、実際にはPython がOOP の概念を教えてくれるのでしょうか?
自分主導の学習では通常探求しないことを試すように促す十分な学習サポートがあれば、できると言います。本かある種のメンターが一番いいでしょう。Mark Lutzは、Pythonについて非常に詳細で、非常に詳細で、非常に優れた本を書いています。私は彼に本を勧めます。
覚えておくべきことは、Pythonの方法は唯一の方法ではなく、唯一の正しい方法でもないということです。プログラミングパラダイムを習得すればするほど、優れたプログラマーになります。PythonがOOPを行う方法は、C ++またはJavaが行う方法とは厳密には異なりますが、概念はうまく移行します。
はい、OOPの実装は大きく異なります。理論と原則は同じですが、多くの人々はJavaとC ++が行う「実際のOOP」のみを検討しているため、「言語にとらわれない」はずの多くの参照が得られますが、実際にはクラスベースの静的型付け言語を想定しています。
これは、それらの参照が悪い、または制限されているという意味ではありません。たとえば、「ギャングオブ4」(GoF)の独創的な著書「デザインパターン:再利用可能なオブジェクト指向ソフトウェアの要素」は、「静的クラスベースのOOP」を本当に意味する「OOP」と言う素晴らしい作品の典型的な例です。
したがって、私の意見では、はい。Python、Javascript、C、およびその他の多くの言語で多くのOOPを学ぶことができます。しかし、「OOP経験」を求める人(おそらく将来の雇用主)は、Java / C ++ / C#を意味します。したがって、他のビューも確認することをお勧めします。
(そして、それらはOOPの2つの「タイプ」だけではありません...)。
オブジェクト指向プログラミングは、低カップリング、情報の非表示(別名:カプセル化)、データとそのデータを一緒に操作するメソッドのバンドル、およびコードの再利用を促進するプログラミング言語を構築する方法に関するアイデアです。多くの言語がこれらのアイデアを取り入れているため、オブジェクト指向への取り組み方について言語間でばらつきがあります。たとえば、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とクラスベース言語の特定の拡張機能を組み合わせることができるため、さらに複雑になります。
OOPはプログラミングの原則であり、基本的にはアイデアです。OOPの実装はプログラミング言語全体で異なりますが、OOPの柱(抽象化、継承、カプセル化、およびポリモーフィズム)は通常、何らかの形で存在しています。
どちらの言語も優先せずに、JavaはセマンティクスをPythonよりもプログラマーに少し強く押していると言います。
例えば、
Javaコード: class Cat extends Animal {}
物事のOOPの観点で何をしているのかについては、次のことよりも少し明白です。
Pythonコード: class Cat(Animal):
もちろん、どちらもCatがAnimalから継承するクラス階層を定義しています。しかし、OOPから始めたばかりのプログラマーにとって、OOPのアイデアのアプリケーションと意味は、プログラマーのためにそれを綴っているので、Javaで少し良くなるかもしれないと感じています。
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?
}
}
}
私は経験豊富なプログラマーですが、苦労しています。さらに、この簡単なプログラムの見込み生徒に何を説明する必要があるかを見てください。
this.
他のユーザーによってマスクされているときに変数を参照するための表記System.out
outputStreamです。はい、それはフィールドですが、static
フィールドです。String[]
配列です。これは特別なタイプのオブジェクトですが、実際にはそうではありません。int
プリミティブ型です。特別です。Pythonは「純粋」です。プリミティブ型はありません。コンストラクタは存在せず、初期化時に呼び出される特別なメソッドのみがあります。
を持っているので、コンソールと対話する必要はありませんREPL
。あなたは単に使用してゲームをプレイすることができますg.guess(35)
文字列して返すます。
これにより、言語がOOPの基本的な概念を学習および把握しやすくなります。
OOPの中核となるアイデアは、クラス内(Pythonが完全にサポートしている)の内部で変数とメソッドを一緒にカプセル化(つまり、バンドルまたは非表示)することです。名詞を中心にコードを設計することです。その後、そこから少し進んでいきます。
実装の違い(たとえば、PythonはJavaのように可視性をサポートしていません)と構文の違い(Javascriptでは、自分でメソッドを継承する必要があります)がありますが、基本的な設計は同じです。
Javaのような言語でOOPを学ぶ方が簡単だと思います。なぜなら、言語はそれを必要とし、コミュニティは、たとえばpythonコミュニティよりも悪影響が少ないからです。
しかし、そこにはOOPの設計と実践について多くの文書があり、それを読むことは無駄な努力ではありません。Python(たくさんある)を書くときでも、たくさんのオブジェクトを書き、サードパーティのライブラリからたくさんのオブジェクトを使用します。
言語でOOPを学ぶとき、あなたはこの言語で考え始めます。言語は、あなたが何ができると思うか、どのように影響するか、そしてOOPに風味を追加します。
クラスがなければOOPを行えない人もいます。いくつかはプロセスでオブジェクトを殺さなければなりません。
OOPのコアとそれに関する独自のアイデアがあります。Smalltalk、Self、Simula、LISP、Newspeakもご覧いただけます。また、データフロー言語bash、APL、Jなどの非OOP言語タイプも見てください。Haskell(型クラス)。彼らはみなあなたに別の考え方を教え、あなたはそれを学ぶかもしれません
そして最終的に、OOPが何に適しているかがわかるでしょう。少なくともあなたはそれについて別の考えを持つでしょう。アラン・ケイの講演を探すことをお勧めします。
言語を見ないなら、この投稿は役に立たない。
ここを見るとわかるように、OOPが何であるかについては同意できません。