「Java OOP」と「Pythonic OOP」の違いは?[閉まっている]


19

ActionScript 2.0で始めてから、Javaで始めました。それ以来、Python(おそらく私のお気に入り)を含む多くの言語を学んだか、少なくとも使用しました。

私のオブジェクト指向プログラミングのスタイルは、Pythonシンタックスを使用したJava OOPのようなものではなく、非常にPythonに近いものではないのではないかと心配しています。JavaとPythonic OOPの違いは何ですか?Pythonでオブジェクト指向のコードを書くとき、Javaプログラマーはしばしば「非Python」に何をしますか?

回答:


54

Javaの人にとって Pythonは、誰でもクラブをつかんで頭をmaり始めることができる無秩序な遊び場です。

Pythonの男にとって、 Javaはオーウェルの宇宙であり、あなたは絶えず他の誰かの宇宙がどのようにカチカチと音を立てているのかという束縛に縛られています。

真実は、1つの言語でできることと同じように、他の言語でもできることです。しかし、あなたが述べたように、クリーンは何意味するかに関して、両方のコミュニティに重要な違いがあります。

Javaの方法: クリーンシステムとは、意図したことだけを行うシステムであり、意図した目的の性質に反する拡張や変更を許可せず、コンパイラーを介して可能な限りこれらを強制しようとします。厳格な構造内でシンプルなインターフェースを注意深く作成することにより、柔軟性が得られます。Javaでは、自分のサンドボックスは常に明確に区切られ、それらを超えると、コンパイラからの迅速なフィードバックが満たされます。Javaは、オブジェクト構造を静的に定義し、それらのインスタンスから動的な相互作用を作成する手段を提供します。Javaで作業するときは、頭の痛い解決策に向けて基本的なビルディングブロックを巧みに作成しようとします。問題に取り組む方法について実用的な理論が得られたら、私はほとんどボトムアップで仕事をします。

Javaは、大規模なチームにまたがることができる大規模なソフトウェアを作成する傾向があり、群れを抑えるツールと手段を提供します。これをチェックしないと、非常に孤立したチームがより明確な目標に向かって独立して作業することになります。最終的には、各チームが独自の「存在理由」となり、システム全体がメインプロジェクトから外れて希薄になります。これらは、極端なコストオーバーランや、パフォーマンスとメンテナンスが不十分な巨大なソフトウェアシステムにつながる可能性があります。

Javaで物事を行うための小さな迅速で簡単な方法はほとんどありませんが、IDEとツールは、数回クリックするだけで痛みを伴うタスクを作成します。

Pythonの方法: クリーンとは、簡潔で読みやすいことを意味します。優れたpythonシステムは、その核心をすぐに理解できるように設計されており、コードから意図された使用と目的を理解できるように、その最も内側の秘密を明らかにします。また、元の設計を拡張および/またはカプセル化して独自のソリューションを設計し、正確にあなたの方向に向かうようにすることもできます。Pythonは、手元のニーズに合わせてインスタンスを動的に変更できるオブジェクトテンプレートを作成する手段を提供します。Pythonでは、私はすぐに問題に取り組み、最終的な解決策ができるだけシンプルで読みやすいように、コードを論理構造に広げる傾向があります。Pythonでは、トップダウンで作業し、分割統治アプローチを通じて複雑さの増加を管理する傾向があります。

Pythonチームは、軽量のシステムを作成し、実用的なソリューションを迅速に提供する傾向があります。それらは、システムのあらゆる部分で相互に解決可能に機能する密接な結び付きの束になる傾向があり、機会があればいつでも互いのソリューションを検証します。彼らはお互いに餌をやり、相乗効果を生み出し、非常に爽快です。ただし、これにより、大規模なシステムへの拡張が困難なチームが作成され、多くの場合、一種のガラス天井にぶつかります。チームに新しいメンバーを紹介することは役に立ちますが、知識が十分に広まり、生産性が向上するのに十分な時間がかかるでしょう。その後、チームは分割され、システム全体の絶え間ない概観は、初期の雰囲気と同様に希薄になります。これにより、かつては単純な問題だったコードが過度に複雑になり、

ほとんどの場合、Pythonを使用して迅速かつ簡単に作業を行うことができますが、システムが特定のしきい値に達すると、複雑さをチェックしにくくなります。

要するに、両方とも暗い側面を持ち、両方とも明確な強さを持っています。しかし、両方のコミュニティに沿って突き進むと、一方の強さが他方の暗黒面につながり、逆もまた同様であることがわかります。

したがって、どちらが最適であるかについての白熱した議論。


14

メソッドと変数の可視性の設定に関するすべてを知っていますか?ええ、それらはもう存在しません、すべてが公開されています。命名規則と名前マングリングがありますが、すべてが実際に利用可能です。

Pythonの柔軟性の一部は、ほとんど何でもできることです。そのため、哲学は、メソッドが適切に使用されることをAPIに強制するのではなく、APIの使用方法を知る必要があるというものです。

メソッドのオーバーロードの代わりに、デフォルト変数があります。可変オブジェクトをデフォルト値として使用しないでください。

# bad
def fL(x=[])
  x.append(1)
  print x
# good
def fN(x=None)
  if (x is None):
    x = []
  x.append(1)
  print x

fL()
fL()
fN()
fN()

クラス変数とインスタンス変数の違いは、最初に始めたときには非常に微妙です。

class Obj(object):
   thing = "class variable"
   def __init__(self):
      self.thing1 = "instance variable"
      print self.thing, self.thing1

これらは、私が切り替えを行ったときに慣れなければならなかったいくつかのことです。


1
いくつかの事柄の良い要約を+1しましたが、私は以前からそれらを知っていました
アント

6

Pythonにはインターフェースがなく、メタクラスがあり、アヒルのタイピングが可能です。Pythonにはリスト内包表記がありますが、これは非常に強力であり、Javaには存在しません。Javaには多くのデータ構造を持つ豊富な型システムがあり、Pythonにはリストがあります。したがって、PythonでJavaの機能を再現しようとする代わりに、Pythonの機能を活用するのであれば、おそらくPythonicコードを書いていることになります。

しかし、OOコードに関する限り、言語ごとに変更すべきではない特定のスタイルの基本があります。Applescript、Python、Java、またはC ++で書いているかどうかにかかわらず、常にシャイでDRYのコードを書くよう努力する必要があります。

----編集----

@delnanが教育的に指摘しているように、実際にはカーネルレベルでPythonによって定義された5つの複合データ型があります(「Python in a Nutshell」によると、list、dict、tuple、set、frozenset)。これは事実ですが、実際に私が行おうとしているポイントには関係ありません。Pythonは、必須のデータ構造としてリストに基づいています。はい、リストをスタックとして使用できますが、キューとまったく同じリストを使用できます。そして再びスタック。

一方、Javaには1つのカーネルデータ構造(「Javaポケットガイド」によると配列)がありますが、一般的な使用では、コレクションをインポートしないとJavaで多くのことを行うことはできません。 Pythonのリストで持っていたのと同じ機能を取得するための「リッチ」(つまり、非常に複雑な)タイプライブラリに。

もちろん、両方の言語にはクラスがあり、Javaにはインターフェースがありますが、これらは複合データ型ですが、実際には教科書的な意味でのデータ構造ではありません。

1つの違いは、Javaキューから項目をポップできないことと、Javaリンクリストが必要な場所にJavaキューオブジェクトを渡すことができないことです。おそらく「リッチ」というのは、実際には「堅い」という意味です。

「Pythonにはリストだけがある」と言うことの意味を説明すると、Pythonで行う必要があることのほとんどすべてを、Pythons Listタイプを使用してJavaコレクションで行うことができるということです。この単一の型は、Javaの非常に多くの型の作業を行います。

Pythonプログラマーにとってこれは何を意味しますか?これは、Pythonリストタイプを活用して、追加のライブラリを使用せずに非常に簡潔で直接的なコードを記述することができることを意味します。 。


私はメタクラス以外のすべてに精通しているので、それらを調べます。ありがとう:)
アント

7
以下を説明できるまで-1。(1)「Pythonにはリストがあるだけ」-Pythonには豊富なデータ構造があります。これまで考えられていたすべての単一のデータ構造の3つの実装はありませんが、それでもほとんどの人が必要とするすべてのものについてです。(2)Javaの型システムを「リッチ」と呼ぶことは、これらの本当に洗練された型システムのof笑です。手始めに、Haskell(拡張機能なしの98)を見てください。

申し訳ありませんが、これは事実ではありません。Pythonには、リストと辞書という2つのデータ構造があります。一部のPythonライブラリはこれらのコア構造を拡張する場合がありますが、それは言語がそれらを持っていると言っているのと同じではありません。
哲学者

5
それはすでに回答名の2倍です。リストはスタックとしても機能します。セットとタプルも組み込まれています(Javaにはいくつのデータ構造が組み込まれていますか?)標準ライブラリには、(最小)ヒープ、両端キュー、不変レコード、密に詰められた同種の配列(Cに限定)のモジュールもありますタイプ)。そして、それは私の頭の上からです。ええ、それらのほとんどは内部でリスト/辞書を使用しています(ただし、セットは未使用のキーを持つ辞書ではありません)。しかし、Javaのほとんどのコレクションは、実際、すべての言語でそうです。それが動作する方法です。

1
今、私はあなたがしようとしたポイントを理解していると思います(そして私のダウン投票を削除しました-最初に追加したのは、その部分が元々述べられてた方法で明らかに間違っていたからです)。私はまだ、少なくとも2つのデータ構造(ほぼ普遍的なシーケンスとしてのリストとほぼ普遍的なマッピングとしての辞書)を考慮する必要があると思います。そして、それはさまざまなイテレーターとジェネレーターについては言うまでもありません。私は少なくともリストとして(そしてさらに適切には)頻繁に使用します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.