質問

Pythonでの大規模開発について、特に大規模なコードベースをどのように維持するかについて知りたいですか?

  • メソッドのシグネチャに非互換性の変更を加えた場合、そのメソッドが呼び出されているすべての場所をどのようにして見つけることができますか。 C ++ / Javaでは、コンパイラーがそれを見つけます。Pythonでどのように実行しますか?

  • コードの奥深くで変更を行う場合、参照する静的な型がないため、インスタンスが提供する操作をどのように見つけるのですか?

  • 入力エラー(タイプミス)をどのように処理/防止しますか?

  • UnitTestは静的型チェックの代替として使用されていますか?

推測できるように、私はほとんど静的に型付けされた言語(C ++ / Java)でしか作業していませんが、より大きなプログラムではPythonを試してみたいと思います。しかし、かなり前に、動的に型指定されたクリッパー(dBase)言語で非常に悪い経験をしました。

役に立ちましたか?

解決

pychecker、pylint、および同様のツールを誰も指摘していないため、pycheckerとpylintは、誤った仮定(関数シグネチャ、オブジェクト属性など)を見つけるのに役立つツールです。コンパイラが検出する可能性のあるすべてを見つけることはできません静的に型付けされた言語で検索しますが、そのような言語のコンパイラーでは見つけられない問題も見つけることができます。

Python(および動的に型指定された言語)は、発生する可能性のあるエラーと、それらを検出して修正する方法の点で根本的に異なります。明確な欠点と欠点がありますが、多くの人(私を含む)は、Pythonの場合、コードを書くことの容易さ(および構造的に健全にすることの容易さ)および壊れないでコードを変更することを主張します APIの互換性(新しいオプションの引数の追加、同じメソッドと属性のセットを持つ異なるオブジェクトの提供)により、大規模なコードベースに最適です。

他のヒント

スクリュードライバーをハンマーとして使用しないでください

Pythonは静的に型付けされた言語ではないため、そのように使用しようとしないでください。

特定のツールを使用するときは、そのツールを作成されたものに使用します。 Pythonの場合:

  • ダックタイピング:タイプチェックなし。重要なのは行動だけです。したがって、この機能を使用するようにコードを設計する必要があります。優れた設計とは、一般的な署名、コンポーネント間の依存関係がないこと、高い抽象化レベルを意味します。したがって、何かを変更しても、残りのコードを変更する必要はありません。 Pythonは、それが何のために構築されているかについても文句を言いません。型は問題ではありません。

  • 巨大な標準ライブラリ。自分でコーディングしていない標準機能を使用する場合、プログラム内のすべての呼び出しを変更する必要はありません。また、Pythonにはバッテリーが付属しています。私は毎日それらを発見し続けています。私が始めたときに使用できるモジュールの数がわからず、みんなのような既存のものを書き直そうとしました。大丈夫、最初からすべてを取得することはできません。

Java、C ++、Python、PHP、Erlangなど、同じ方法で書くことはできません。それらは、非常に多くの異なる言語のそれぞれに余裕がある理由であり、同じことをしません。

単体テストは代替ではありません

すべての言語で単体テストを実行する必要があります。最も有名なユニットテストライブラリ( JUnit )はJavaの世界からです!

これは型とは関係ありません。ふるまいをもう一度確認します。回帰によるトラブルを回避できます。顧客が順調に進んでいることを確認します。

大規模プロジェクト用のPython

  

言語、ライブラリ、およびフレームワーク   スケーリングしないでください。アーキテクチャはそうします。

堅牢なアーキテクチャを設計する場合、それを迅速に進化させることができれば、スケーリングします。単体テストのヘルプ、自動コードチェックも同様です。しかし、それらは単なる安全策です。そして小さなもの。

Pythonは大規模なプロジェクトに特に適しています。これは、いくつかの優れた手法を実施し、多くの通常の設計パターンが組み込まれているためです。ただし、設計されていないものには使用しないでください。例:PythonはCPUを集中的に使用するタスクのためのテクノロジーではありません。

大規模なプロジェクトでは、とにかくいくつかの異なる技術を使用するでしょう。 SGBD として( DBMS )およびテンプレート言語、またはその他。 Pythonも例外ではありません。

コードの高速化が必要な部分には、おそらくC / C ++を使用する必要があります。または、 Tomcat 環境に適合するJava。わからない、気にしない。 Pythonはこれらでうまく動作します。

結論として

私の答えは少し失礼に感じるかもしれませんが、誤解しないでください。これは非常に良い質問です。

多くの人が古い習慣でPythonに来ています。 PythonのようにJavaをコーディングしようとしていたのです。可能ですが、それを最大限に活用することはありません。

Pythonでプレイしたことがある場合、またはPythonでプレイしたい場合は、素晴らしいことです!それは素晴らしいツールです。しかし、単なるツールです、本当に。

私は、「Frets On Fire」、オープンソースのpython、「Guitar Hero」、クローン。

私が見ているように、Pythonは本当に大規模なプロジェクトにはあまり適していません。

私は、開発時間の大部分を、互換性のない型の割り当てに関連する問題のデバッグに費やしていることに気付きました。 また、型は実行時に決定されるため、現在見ているパラメーターの型がわからないため、既存のコードを理解しようとするのは難しくなります。

それに加えて、 __ getattr __ 組み込み関数で名前文字列を使用して関数を呼び出すことは、一般に他のプログラミング言語よりもPythonでより一般的であるため、特定の関数の呼び出しグラフをやや難しくします(ただし、静的に型付けされた一部の言語でも、名前を付けて関数を呼び出すことができます)。

Pythonは小規模なソフトウェア、迅速なプロトタイプ開発、既存のプログラムの接着に本当に優れていると思いますが、大規模なソフトウェアプロジェクトには使用しません。私の意見では、Pythonは比較的弱いです。

マイ0.10ユーロ:

iには、「実稼働」状態のPythonアプリケーションがいくつかあります。当社は、java、c ++、およびpythonを使用しています。 Eclipse IDE(Pythonのpydev)を使用して開発しています

ユニットテストは問題の重要な解決策です。(c ++およびjavaでも)

「動的型付け」の安全性の低い世界コードの品質について不注意にならないようにします

途中で

大規模開発とは、単一の言語を使用するという意味ではありません!

大規模開発では、多くの場合、問題に固有の少数の言語を使用します。

だから私は the-hammer-problem に同意します:-)


PS: static-typing& python

ここに、Pythonでかなり大きなシステムを維持するのに役立ついくつかの項目を示します。

  • レイヤーでコードを構築します。つまり、ビジネスロジック、プレゼンテーションロジック、および永続レイヤーを分離します。これらのレイヤーの定義に少し時間をかけて、プロジェクトの全員が参加するようにします。大規模なシステムの場合、特定の開発方法を強いるフレームワークを作成することも重要です。

  • テストは重要です。ユニットテストを使用しないと、他の言語よりも数倍速く管理不能なコードベースが発生する可能性があります。多くの場合、単体テストでは十分ではないことに注意してください。大きな変更があれば、すぐに実行できる統合/受け入れテストをいくつか用意してください。

  • Fail Fast 原則を使用します。コードに脆弱性があると思われる場合にアサーションを追加します。

  • 問題にすばやくナビゲートするのに役立つ標準のログ/エラー処理を備えています

  • タイプ・アヘッド、pyLint / Checker統合を提供するIDEを使用して(pyDevが機能します)、すぐに一般的なタイプミスを検出し、コーディング標準を促進します

  • インポートについて細心の注意を払ってください。ximport *から実行したり、。を使用せずに相対インポートを実行したりしないでください。

  • リファクタリングを実行し、正規表現を使用した検索/置換ツールを使用するだけで、メソッドの移動/クラスタイプのリファクタリングを行うことができます。

メソッドのシグネチャに対する互換性のない変更。これは、JavaおよびC ++ほどにはPythonでも発生しません。

Pythonには、オプションの引数、デフォルト値、およびメソッドシグネチャを定義する際の柔軟性があります。また、ダックタイピングは、たとえば、重要なソフトウェアの変更の一部として、あるクラスからインターフェイスに切り替える必要がないことを意味します。物事はそれほど複雑ではありません。

そのメソッドが呼び出されているすべての場所をどのように見つけるのですか? grepは動的言語で機能します。メソッドが使用されているすべての場所を知る必要がある場合は、grep(または同等のIDEがサポートする検索)が最適です。

参照する静的な型がないため、インスタンスが提供する操作をどのように確認しますか?

a。ソースを見てください。競合するオブジェクトライブラリとjarファイルのJava / C ++問題はありません。これらの言語に必要なすべての手の込んだ補助具やツールは必要ありません。

b。 IDEは、多くの一般的な状況下で署名情報を提供できます。 IDEの推論力を簡単に無効にすることができます。それが起こったとき、あなたはおそらくそれが理にかなっていることを確認するためにあなたがしていることを検討する必要があります。 IDEが型情報を推論できない場合、おそらく動的すぎる可能性があります。

c。 Pythonでは、多くの場合、インタラクティブインタープリターを使用します。 JavaやC ++とは異なり、インスタンスを直接インタラクティブに探索できます。洗練されたIDEは必要ありません。

例:

  >>> x= SomeClass()
  >>> dir(x)

入力エラーをどのように処理/防止しますか:静的言語と同じ:防止しません。それらを見つけて修正します。 Javaは特定のクラスのタイプミスのみを見つけることができます。類似したクラス名または変数名が2つある場合、静的な型チェックを行っても、深刻なトラブルに巻き込まれる可能性があります。

例:

class MyClass { }
class MyClassx extends MyClass { }

これら2つのクラス名のタイプミスは大混乱を引き起こす可能性があります。 ["しかし、私はJavaでそのような立場に立つことはしませんでした、"人々は言う。同意した。私もPythonでそのような立場に立つことはしませんでした。まったく異なるクラスを作成し、誤用すると早期に失敗します。]

UnitTestは静的型チェックの代替として使用されますか?もう1つの観点は次のとおりです。静的型チェックは明確でシンプルなデザインの代替です。

私は、アプリケーションがなぜ機能するのかわからないプログラマーと仕事をしました。彼らは、物事がコンパイルされなかった理由を理解できませんでした。抽象スーパークラスとインターフェイスの違いを知らなかったため、場所を変更すると別のJARファイルにある他のモジュールがクラッシュする理由がわかりませんでした。静的型チェックにより、欠陥のある設計に対する誤った信頼が得られました。

動的言語を使用すると、プログラムを簡単にできます。簡易性は、静的型チェックの代替です。明快さは静的型チェックの代替です。

私の一般的な経験則は、ミッションクリティカルではない小さなプロジェクトには動的言語を使用し、大きなプロジェクトには静的に型付けされた言語を使用することです。 pythonなどの動的言語で記述されたコードは、「もつれ」ます。より迅速に。少なくとも私の場合は、動的言語でコードを書く方がはるかに迅速であり、ショートカットやデザインの悪化につながるからです。一部には、Javaを使用するときに迅速かつ簡単にリファクタリングできるIntelliJがありますが、これはPythonにはありません。

それに対する通常の答えは、テストテストテストです。特に新しいバージョンがオンラインになる前に、大規模な単体テストスイートを用意して頻繁に実行することになっています。

動的に型付けされた言語の支持者は、静的に型付けされた言語であっても型システムの粗雑な規則に準拠していても、潜在的に間違っている可能性のある部分をカバーするだけなので、テストする必要があると主張します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top