web-dev-qa-db-ja.com

「Java OOP」と「Pythonic OOP」の違いは何ですか?

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

私のオブジェクト指向プログラミングのスタイルは非常に非Pythonicですが、恐らくJava OOP with Python構文。JavaとPythonic OOPが互いに異なる理由は何ですか?何が何をするのかJava "Pythonでオブジェクト指向のコードを書くとき?

19
Anto

Java男の場合 Pythonは、誰もがクラブをつかみ、あなたの頭を傷つけ始める無秩序な遊び場です。

Python guy Java=の場合、Orwellの宇宙であり、他の誰かの絶望的な方法に常に束縛されています。宇宙ティック。

真実とは、ある言語で他の言語でできるのと同じくらいきれいにできることです。しかし、あなたが述べたように、cleanが何を意味するかに関して、両方のコミュニティで重要な違いがあります。

Javaの方法:クリーンなシステムとは、意図された目的を果たすものであり、意図された目的の性質に反する拡張や変更を許可せず、これらを強制しようとするものです。コンパイラを介して可能。柔軟性は、厳密な構造内の単純なインターフェースを注意深く作成することによって得られます。 Javaの場合、1つのサンドボックスは常に明確に制限されており、これらを超えてSwiftコンパイラーからのフィードバックを満たします。Java =は、静的にオブジェクト構造を定義し、それらのインスタンスから動的相互作用を作成する手段を提供します。Java I頭の悪い解決策に向けて基本的なビルディングブロックを巧みに作成するようにしてください。

Javaは、大規模なチームにまたがる大規模なソフトウェアを生成する傾向があり、群れをチェックするためのツールと手段を提供します。オフのままにしておくと、非常に孤立したチームがこれまで以上に不明確な目標に向けて独立して作業することになります。結局、各チームはそれ自身の「レゾンドゥートレ」になり、システム全体がメインプロジェクトを誤って運転することになります。これらは、極端なコスト超過と、パフォーマンスとメンテナンスが不十分な巨大なソフトウェアシステムにつながる可能性があります。

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

Pythonの方法:クリーンとは、簡潔で読みやすいことを意味します。優れたpythonシステムは、システムの中心部を正しく理解できるように設計されており、コードの意図する用途と目的をコードから理解できるように、その最も内側の秘密を公開します。また、オリジナルのデザインを拡張またはカプセル化することで独自のソリューションを設計し、正確に方向を決めることができます。Pythonからオブジェクトテンプレートを作成できます。 pythonでは、インスタンスを動的に変更して、問題をすぐに解決し、コードを論理構造に展開して、最終的なソリューションを次のように単純で読みやすいままにしますpythonの場合、私はトップダウンで作業し、分割統治法を使用して複雑さの増加を管理する傾向があります。

Pythonチームは軽量なシステムを作成する傾向があり、実用的なソリューションを非常に迅速に提供します。彼らは、システムのどの部分でも同じように機能し、お互いのソリューションをあらゆる機会で検証する傾向があります。彼らはお互いを養い、非常に爽快な相乗効果を生み出します。ただし、これにより、大規模なシステムへの拡張が困難なチームが作成され、多くの場合、一種のガラス天井にぶつかります。チームに新しいメンバーを紹介することは役立ちますが、知識が広がり、追加の生産性が感じられるまでには時間がかかります。その後、チームは分裂し、システム全体の絶え間ない概観は、初期の雰囲気と同様に薄れます。これにより、かつては単純な問題であったコードが極端に複雑になり、極端なコストのオーバーランが発生し、システムのパフォーマンスと維持が不十分になる可能性があります。

Python)を使用してすばやく簡単な方法を実行する方法はほとんど常にありますが、システムが特定のしきい値に達すると、複雑さを抑えることが難しくなります。

つまり、どちらもダークサイドで、どちらも明確な強さを持っています。ただし、両方のコミュニティに沿って売り込むと、一方の強さが他方のダークサイドにつながり、逆もまた同様です。

したがって、どちらが最善であるかに関する白熱した議論が行われます。

54
Newtopian

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

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

これらは私がスイッチを入れたときに慣れなければならなかったいくつかのことです。

14
unholysampler

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

ただし、OOコードに関する限り、言語ごとに変更すべきではない特定のスタイルの基本事項があります。Applescript、Pythonのどちらで作成する場合でも、常にShyとDRYのコードを作成するように努める必要があります。 、Java、またはC++。

----編集----

@delnanがはっきりと指摘しているように、実際には、「Python in a Nutshell」のコピーによると、カーネルレベルでPythonによって定義された5つの複合データ型(リスト、ディクテーション、タプル、セット、およびフリーズセット)があります。 )。これは事実ですが、私が作ろうとしているポイントには実際には関係ありません。Pythonは、必須のデータ構造としてリストに基づいて構築されます。はい、リストをスタックとして使用できますが、まったく同じリストをキューとして使用できます。そして再びスタック。

一方、Javaには1つのカーネルデータ構造(配列、「The Java Pocket Guide」による)がありますが、一般的にはJavaで多くのことを行うことはできません。コレクションをインポートする必要はありません。これを行うと、Pythonのリストと同じ機能を取得するための「豊富な」(つまり、非常に複雑な意味の)タイプライブラリにアクセスできます。

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

1つの違いは、Javaキューからアイテムをポップできないこと、およびJavaリンクが期待される場所にJavaキューオブジェクトを渡すことができないことです。リスト。おそらく「リッチ」とは、実際には「リジッド」を意味します。

つまり、「Pythonにはリストがあります」と言って何を意味するのかを説明すると、Pythonで実行する必要があるほとんどすべてのことをJavaで実行できるということです。 Pythonリストタイプを使用したコレクション。この単一の型は、Javaの非常に多くの型の機能を果たします。

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

6
philosodad