4

私は Python を学んでおり、自分のコードを構築するための最良の方法を見つけようとしています。

長い関数があり、それを小さな関数に分割したいとしましょう。ではC、最上位レベルで「静的」関数にします (それが関数の唯一のレベルであるため)。また、おそらくそれを前方宣言し、それを使用する短縮された関数の後に配置します。

次に Python です。Python では、ネストされた関数を作成するオプションがあります。この新しい「内部」関数は、実際には、読みやすさのために分割された大きな関数の一部にすぎず、それによってのみ使用されるため、ネストされた関数であるように聞こえますが、この関数を親関数内に配置すると、関数全体が発生しますコードが実際に移動されていないため、まだ非常に長くなります! 特に、関数は呼び出される前に完全にコーディングする必要があるため、実際の短い関数はこの疑似長い関数の最後にあることを意味し、可読性が大幅に低下します!

このような状況では、何が良いと考えられますか?

4

4 に答える 4

2

小さい関数を独自のファイルに配置し、それをメイン関数にインポートするのはどうですか? 次のようなものがあります。

def main_func():
    from impl import a, b, c

    a()
    b()
    c()

このアプローチは読みやすさにつながると思います。小さな関数を調べたい場合に備えて、それらの関数がどこから来ているかがわかります。それらのインポートはワンライナーであり、メイン関数の実装は直接表示されます。適切なファイル名/場所を選択することで、これらの関数が外部での使用を意図していないことをユーザーに伝えることもできますmain_func(とにかく、実際の情報が Python に隠されているわけではありません)。

ところで、この質問には正解は 1 つではありません。

于 2013-08-28T07:49:11.257 に答える
0

サイコマティックの複雑さを低く抑えることをお勧めします。これは実質的に、長い関数を多くの小さな関数に分割することを意味します。

複雑さは、if、while、do、for、?:、catch、switch、case ステートメント、および演算子 && と || の数によって測定されます。コンストラクター、メソッド、静的初期化子、またはインスタンス初期化子の本体で (プラス 1)。これは、ソースを通る可能なパスの最小数の尺度であり、したがって必要なテストの数です。一般的に、1 ~ 4 は良好、5 ~ 7 は問題ないと見なされ、8 ~ 10 はリファクタリングを検討し、11 以上は今すぐリファクタリングします。

コード品質分析ツールである Sonar からのこのアドバイスに従うことをお勧めします。このようなコードをリファクタリングする良い方法は、TDD を使用することです。まず、現在の関数のすべての実行パスをカバーする単体テストを作成します。その後、何も壊れていないことが単体テストによって保証されるので、安心してリファクタリングできます。

一方、長い関数が単に長いだけで、循環的複雑度が低い場合は、関数がネストされているかどうかはあまり問題ではないと思います。

于 2013-08-28T07:38:03.677 に答える