私は、ファイルごとに 1 つの public クラスを持つことができる Java モデルに慣れています。Python にはこの制限がありません。クラスを編成するためのベスト プラクティスは何だろうと思っています。
6 に答える
Pythonファイルは「モジュール」と呼ばれ、「意味のある」ようにソフトウェアを整理する1つの方法です。もう1つは、「パッケージ」と呼ばれるディレクトリです。
モジュールは、1つまたは2ダースの密接に関連するクラスを持つ可能性のある別個のものです。秘訣は、モジュールはインポートするものであり、ソフトウェアを読み、保守し、拡張する人々が完全に理解できるようにインポートする必要があるということです。
ルールは次のとおりです。モジュールは再利用の単位です。
1つのクラスを簡単に再利用することはできません。モジュールを問題なく再利用できるはずです。ライブラリ内のすべて(およびダウンロードして追加するすべて)は、モジュールまたはモジュールのパッケージのいずれかです。
たとえば、スプレッドシートを読み取り、いくつかの計算を実行し、結果をデータベースにロードするものに取り組んでいます。メインプログラムをどのように見せたいですか?
from ssReader import Reader
from theCalcs import ACalc, AnotherCalc
from theDB import Loader
def main( sourceFileName ):
rdr= Reader( sourceFileName )
c1= ACalc( options )
c2= AnotherCalc( options )
ldr= Loader( parameters )
for myObj in rdr.readAll():
c1.thisOp( myObj )
c2.thatOp( myObj )
ldr.laod( myObj )
インポートは、コードを概念またはチャンクに編成する方法と考えてください。各インポートに含まれるクラスの正確な数は重要ではありません。import
重要なのは、ステートメントで表現している組織全体です。
人為的な制限はないので、何が理解できるかにかかっています。論理的にグループ化されたかなり短くて単純なクラスがたくさんある場合は、それらの束を放り込んでください。大きくて複雑なクラス、またはグループとして意味をなさないクラスがある場合は、クラスごとに 1 つのファイルに移動します。または、その中間の何かを選択します。変化に応じてリファクタリングします。
私は次の理由でJavaモデルが好きです。各クラスを個別のファイルに配置すると、ソースコードを参照するときにクラスが見やすくなるため、再利用が促進されます。多数のクラスが1つのファイルにグループ化されている場合、プロジェクトのディレクトリ構造を参照するだけで再利用できるクラスがあることは、他の開発者には明らかでない場合があります。したがって、クラスが再利用できる可能性があると思われる場合は、それを独自のファイルに入れます。
プロジェクトの大きさ、クラスの長さ、他のファイルから使用されるかどうかなどに完全に依存します。
たとえば、私はデータ抽象化のために一連のクラスを頻繁に使用します。そのため、1 行の長さしかないクラスが 4 つまたは 5 つある場合があります ( class SomeData: pass
)。
これらをそれぞれ別のファイルに分割するのはばかげていますが、別のファイルから使用される可能性があるため、これらすべてを別のファイルに入れることdata_model.py
は理にかなっています。from mypackage.data_model import SomeData, SomeSubData
多くのコードを含むクラスがある場合、おそらくそのクラスだけが使用するいくつかの関数がある場合、このクラスとヘルパー関数を別のファイルに分割することをお勧めします。
from mypackage.database.schema import MyModel
ではなく、そのように構造化する必要がfrom mypackage.email.errors import MyDatabaseModel
あります。インポート元が理にかなっていて、ファイルが数万行の長さでない場合は、正しく整理されています。
Python モジュールのドキュメントには、パッケージの編成に関する有用な情報が含まれています。
ファイルの巨大さに悩まされたり、関連性の望ましい構造が自然に現れ始めると、物事を分割することに気づきます。多くの場合、これら 2 つの段階は一致しているように見えます。
分割が早すぎると、まったく異なる構造の順序付けが必要であることに気付き始めるため、非常に煩わしい場合があります。
一方、.java または .py ファイルが約 700 行を超えると、「その特定のビット」がどこにあるかを常に思い出そうとすることにイライラし始めます。
Python/Jython では、インポート ステートメントの循環依存関係も役割を果たしているようです。連携する基本的なビルディング ブロックを別々のファイルに分割しようとすると、言語のこの「制限」/「不完全さ」により、おそらく物事をグループ化する必要があるようです。かなり賢明な方法で。
パッケージへの分割に関しては、よくわかりませんが、モジュール性のすべてのレベルで、煩わしさと幸せな構造の出現の同じルールが機能していると思います。
ファイルが大きくなりすぎたり複雑になったりすることなく、そのファイルに論理的にグループ化できる限り多くのクラスを配置することをお勧めします。