回答:
Javaの人にとって Pythonは、誰でもクラブをつかんで頭をmaり始めることができる無秩序な遊び場です。
Pythonの男にとって、 Javaはオーウェルの宇宙であり、あなたは絶えず他の誰かの宇宙がどのようにカチカチと音を立てているのかという束縛に縛られています。
真実は、1つの言語でできることと同じように、他の言語でもできることです。しかし、あなたが述べたように、クリーンは何を意味するかに関して、両方のコミュニティに重要な違いがあります。
Javaの方法: クリーンシステムとは、意図したことだけを行うシステムであり、意図した目的の性質に反する拡張や変更を許可せず、コンパイラーを介して可能な限りこれらを強制しようとします。厳格な構造内でシンプルなインターフェースを注意深く作成することにより、柔軟性が得られます。Javaでは、自分のサンドボックスは常に明確に区切られ、それらを超えると、コンパイラからの迅速なフィードバックが満たされます。Javaは、オブジェクト構造を静的に定義し、それらのインスタンスから動的な相互作用を作成する手段を提供します。Javaで作業するときは、頭の痛い解決策に向けて基本的なビルディングブロックを巧みに作成しようとします。問題に取り組む方法について実用的な理論が得られたら、私はほとんどボトムアップで仕事をします。
Javaは、大規模なチームにまたがることができる大規模なソフトウェアを作成する傾向があり、群れを抑えるツールと手段を提供します。これをチェックしないと、非常に孤立したチームがより明確な目標に向かって独立して作業することになります。最終的には、各チームが独自の「存在理由」となり、システム全体がメインプロジェクトから外れて希薄になります。これらは、極端なコストオーバーランや、パフォーマンスとメンテナンスが不十分な巨大なソフトウェアシステムにつながる可能性があります。
Javaで物事を行うための小さな迅速で簡単な方法はほとんどありませんが、IDEとツールは、数回クリックするだけで痛みを伴うタスクを作成します。
Pythonの方法: クリーンとは、簡潔で読みやすいことを意味します。優れたpythonシステムは、その核心をすぐに理解できるように設計されており、コードから意図された使用と目的を理解できるように、その最も内側の秘密を明らかにします。また、元の設計を拡張および/またはカプセル化して独自のソリューションを設計し、正確にあなたの方向に向かうようにすることもできます。Pythonは、手元のニーズに合わせてインスタンスを動的に変更できるオブジェクトテンプレートを作成する手段を提供します。Pythonでは、私はすぐに問題に取り組み、最終的な解決策ができるだけシンプルで読みやすいように、コードを論理構造に広げる傾向があります。Pythonでは、トップダウンで作業し、分割統治アプローチを通じて複雑さの増加を管理する傾向があります。
Pythonチームは、軽量のシステムを作成し、実用的なソリューションを迅速に提供する傾向があります。それらは、システムのあらゆる部分で相互に解決可能に機能する密接な結び付きの束になる傾向があり、機会があればいつでも互いのソリューションを検証します。彼らはお互いに餌をやり、相乗効果を生み出し、非常に爽快です。ただし、これにより、大規模なシステムへの拡張が困難なチームが作成され、多くの場合、一種のガラス天井にぶつかります。チームに新しいメンバーを紹介することは役に立ちますが、知識が十分に広まり、生産性が向上するのに十分な時間がかかるでしょう。その後、チームは分割され、システム全体の絶え間ない概観は、初期の雰囲気と同様に希薄になります。これにより、かつては単純な問題だったコードが過度に複雑になり、
ほとんどの場合、Pythonを使用して迅速かつ簡単に作業を行うことができますが、システムが特定のしきい値に達すると、複雑さをチェックしにくくなります。
要するに、両方とも暗い側面を持ち、両方とも明確な強さを持っています。しかし、両方のコミュニティに沿って突き進むと、一方の強さが他方の暗黒面につながり、逆もまた同様であることがわかります。
したがって、どちらが最適であるかについての白熱した議論。
メソッドと変数の可視性の設定に関するすべてを知っていますか?ええ、それらはもう存在しません、すべてが公開されています。命名規則と名前マングリングがありますが、すべてが実際に利用可能です。
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
これらは、私が切り替えを行ったときに慣れなければならなかったいくつかのことです。
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リストタイプを活用して、追加のライブラリを使用せずに非常に簡潔で直接的なコードを記述することができることを意味します。 。