2009-03-04 14 views
6

長い関数を主関数とヘルパー関数に分割するのは賢明です。いつ機能を解除する必要がありますか?

私は、モジュールの外部の機能だけが呼び出されることは知っていますが、その長さは脅かされることがあります。

教科書には行数に制限がありますが、これはあまりにも硬いと感じています。

P.S.私はPythonでプログラミングしており、受信メッセージを処理する必要があります。この関数はメッセージを含むタプルをPythonの内部データ型で返します。 したがって、各メッセージタイプごとに多少の独立したコードを見ることができます。親指の

重複質問

When is a function too long?

答えて

4

を気にしないでください、私はあなたが問題のもう一方の端からこのついて行くする必要があると思います。ボトムアップと考えてください。できるだけ小さな作業単位を特定し、そのようにコードを作成し始めます。トップダウンでコードを作成し、構造化されたアプローチを維持しないと、スパゲッティコードの問題にぶつかります。

すでにスパゲッティコードがあり、リファクタリングする必要がある場合は、まずは最初からやり直す必要があります。既存のスパゲッティコードを書き直すよりも、おそらくもっと多くの作業があり、結果はそれほど良くないかもしれません。

メソッドのコード行にハード番号があるはずはないと思いますが、よく書かれたコードには、下位層に5〜10行以上のメソッドがあり、20〜30行ビジネスロジックであなたに何らかの指標を与えること。

+0

コードの行数を参照するときは、間隔、コメント、改行(配列要素やメソッドのパラメータなどの後にキャリッジリターンを追加する)は含まれません。 – koeder

3

一つの良いルールは、それが一つの画面に収まらない場合は、それを分割についてを考えて価値があるということです。しかし、それを分割することが理にかなっている場合にのみ、いくつかの長い関数は完全に読み込み可能であり、そのためにそれらを複数の関数にスラブに分割する意味がありません。

3

私は、関数を不必要に複数の関数に分割する大きなファンではありません。それは困難で速いことではありません。異なる論理ユニットのように見えるものがあれば、忘れずにそれらを分解し、別々に考えてください。しかし、「関数ごとに1ページ」や「関数ごとにN行」といったいくつかのガイドラインのために物事を壊すだけではありません。

1

私は最近、これを友人と議論していました。彼は懸念を分けるためにリファクタリングを提案し、私は同意する必要があると言わなければならない。つまり、1つの関数は1つのことを実行する必要があります。複数の場合は分割します。そうでなければ、それを一緒にして、意味をわかりにくくするために関数を分割するのは意味がありません。結局のところ、関数は1つのことをするコードのブロックです!

+0

「1つのこと」はかなり主観的です。私は主要な機能とヘルパー機能に侵入することについて尋ねました。だからここでは、主な機能が多くのことをやっているのを見る。 – Xolve

+0

主な機能が果たす役割が論理的なステップに分かれている限り、ヘルパーの主な機能は大丈夫だと言いますが、それぞれが別々の懸念を表しています。 – batbrat

+0

私はまた、チーフ関数がループ内に深く入れ子になっているときに、関数へのブレークアップを避けるでしょう。 – batbrat

1

行数の制限は、可読性をよく考慮していないため、しばしば実用的ではありません。わずかな入力とわずかな出力しか持たないコード行を分離し、これを別々の機能にすることをお勧めします。常に可能なわけではありません。コードをそのままそのまま残し、リファクタリングのためにリファクタリングするのは賢明です。

0

個人的に私は関数を打ち切ります。それは、合計行数または合計処理時間を節約する場合です。

私は一度だけチーフ機能ごとにヘルパーを実行する場合、私は

0

要点は、特化した機能を持つ方がよいということです。しかし、制限を設定する場所は、 に非常に依存しています。1)特定の言語の「通常の」プログラミングスタイル。 (1つは、オブジェクト指向のランゲージは、Cなどのように言うより短い手続きになる傾向があることを観察することができます 2)あなたのプログラミングの方法に依存します。すべての厳しい制限に疑問を呈する必要があります。私見では。全体的にはおそらくプログラムの "自然な"分布でしょう。 3)私は自分の考えを保つべきだと思うのは、あるタスクがあるタスクを行うべきであるということです。たとえば、それを解析するいくつかの関数は、フィールドを構造体に挿入します。または、Windows APIのイベントループがどのように見えるかを考え直すだけです。だから、すべてが長い方法の良い理由があるかもしれないことを示唆している...

0

それぞれのメッセージタイプごとに独自のコードがある場合は、それらのエリアを分割する必要があります。

0

サイズの問題ではありません。私のサイズで私を判断するか? - Yoda

あなたの主な関心事は、可読性、シンプルさ、保守性です。関数のセクションを説明するコメントを書く必要がある場合、そのセクションは別の関数の良い候補です。

0

書き込みしておらず、すでに制作中の場合:決して!あなたがそれを壊すと、あなたはそれを壊す可能性が高い、それは簡単です。

あなたがそれを書いていて、わからない場合は、オンスクリーンルールのリンゴが他の人と同様に言っています。

+1

私は完全に同意しない。ユニットテストを書き、次にリファクタリングします。 –

+2

Gaa ..これは、 "レガシー"コードがレガシーコードに残る方法です。不正なコードは常にリファクタリングのために考慮する必要があります。 –

+0

私は強く同意します。不正なコードは常にリファクタリングする必要があります。長寿命のプロジェクトは、リファクタリングされなければ悪夢になるでしょう。既存のコードであっても、要件は常に変更されます。リファクタリングの前に単体テストを記述し、リファクタリング後にこれらのテストが実行されることを確認します。 – jgauffin

0

長い関数をその構成要素に分解する理由はたくさんあります。最も重要なのは、次のとおりです。

  • 可読性
  • 保守
  • 何のハードがないので、簡単ないくつかの機能は、負記載されている目標に影響を与えることなく、より小さな部分に分割することはできません

意思コードをわかりやすく/早急なルール。

2

ファンフォールド紙に印刷したときに、自分よりも背の高い機能を書き込まないでください。

+0

+1の価値があります。lol –

+0

本当のアドバイスですが、それは数十年前です。 – joeforker

+1

あなたは展開時にあなたよりも背が高いのですか?またはまだ折り畳まれていますか? :-) – Andy

1

私はPythonでコーディングしているので、C、C++、Javaとは異なり、関数内に関数を書く自由があります。これは私が感じるより良い選択です。

2

といいますとのドメインに関連する名前があると思われる場合は、サブファンクションを抜き出すべきです。

誰かがトップレベルの機能を理解できるときに、サブ機能の定義を参照する必要がなくても、純利益が得られる可能性があります。 (ただし、あなたがそれを分解すると、あなたの名前は、ドメインではなくあなたの実装の成果物を参照し始める)

関連する問題