web-dev-qa-db-ja.com

コードで関数定義を順序付ける方法

いくつかのプログラミングプロジェクト(通常、Pythonの多くのスイッチを使用したコマンドラインアプリケーション)で作業する場合、通常は約30以上の関数を作成しています。ほとんどの関数は1つのファイルにあります私がより多くのプロジェクトで利用するヘルパー)。

一部の関数は特定のスイッチ(-pや--printなど)で呼び出されますが、メイン関数を大きくしすぎたくないため、多くの関数はヘルパー計算、印刷操作、またはデータベース操作を実行します。

新しい機能を思いついたら、ファイルにランダムに新しい関数を追加することがよくあります。それについてもっと考えて、特定の場所に置くべきでしょうか?これにはいくつかの方法がありますか?

4
xralf

最近、IDEスタックトレースのナビゲートと呼び出し元の検索がサポートされているため、メソッドがどの順序で実行されるかはほとんど問題ではありません。小さなヘルパーを使用することにはわずかな利点があります関数が呼び出される場所の近くで、特に1つの場所でのみ呼び出される場合に、関数を最初に小さな関数に分割することは、それらを賢明に順序付けるよりもはるかに重要です。「最適な」配置を見つけることはほぼ確実です(かなり高額ですが、時間はかかりません)(自動生成されたAPIは通常アルファベット順に並べ替えられるため、モジュール内で行ったことが他のモジュールに影響を与えることもありません。)

8
Kilian Foth

私はClean Codeバージョンを好みます。関数の読み取りを開始した場合、新しい自己実装関数呼び出しはそれぞれそのすぐ下にあるはずです。たとえば、次のようにします。

func Foo()
    func1()
    funcWithFuncs()
    func2

func func1()
    stuff

func funcWithFuncs()
    funcA()
    funcB()

func funcA()
    stuff

func funcB()
    stuff

func func2()
    stuff

こうすることで、より多くの機能を持つ機能でも、どの機能がどこにあるかを簡単に追跡できます。また、すべての場所を簡単に見つけるために、コールスタックやプログラムを実行する必要もありません。もちろん、これは「味」のことですが、この点でClean Codeが間違っていることはまだわかりません。

対照的に、関数がスクランブルされているときは、スクロールを停止するタイミングがわからないので嫌いです。私はそれを完全に見逃すかもしれません。それは、より大きなコードファイルで望むよりも頻繁に起こります。

11
IAE

20年以上前のCコーディングの習慣のせいかもしれませんが、言語に関係なく、通常、小さなヘルパー関数を上に浮かせています。

少なくとも、前の宣言/関数プロトタイプの必要をなくすために、呼び出される前にすべての関数を宣言しておくのが好きです。

@IAE(とにかく+1とにかく;-)の正反対になると思いますが、ヘルパーを直接持つことで、彼のアプローチを正確に反映することもあります上記それらを呼び出す関数。

ヘルパーが1つの関数に固有であり、言語がネストされた関数を許可している場合、それらを利用する関数内にヘルパーをネストすることについては多くのことが言われています。

オブジェクト指向言語では、クラスのデータとパブリックインターフェイスを簡単にスキャンできることが重要です。コードファイルレベルでは、カプセル化されたデータを最初に配置し、直後にコンストラクターとパブリックメンバーを配置します。保護されたものやプライベートなものは、理解して使用するのではなくコードを掘り下げる必要がある場合にのみ興味深いので、保護された部分とプライベートな部分(ハハ)はかなり下がっています(ハハ)。それらを折りたたんで、クラスの素敵な写真を機能レベルで維持することができます。

私は、上記の理由を念頭に置いて一貫した順序を維持するのに役立つツールであるStyleCopを使用するC#開発者です。 Pythonにも同様のツールがあると思います。

1
Martin Maat

私は反復的なリファクタリングのアプローチを好みます。アプリケーションを開発している間、通常は機能に焦点を当てます。一度、コードを見て、読みやすくするためにリファクタリングできます。

アプローチに関する質問(コードの配置場所を決定する方法)に答えるには-コードに追加する新しい機能またはメソッドをリファクタリングするときに尋ねる質問をします。

0
Siva Senthil