関数の長さはどれくらいですか(関数内のコードの行)? [複製
-
24-10-2019 - |
質問
考えられる複製:
関数/手順/メソッドにはいくつのコードが必要ですか?
関数のコードの行がいくつあるべきか知りたいですか?いくつの行が多すぎます。
私はこれをしばらく前に読みました、それは10行または20行ほどですが、それは画面が非常に多くの線しか収容していないためです。画面サイズが大きくなると、それは真実ではありません。
関数の部分が他のどこでも使用されていないと仮定しましょう。つまり、乾燥した原理を無視します。
他の人がこれについて言わなければならないことを聞きたいです。
ありがとう。
ノート: :の複製 機能が長すぎるのはいつですか?, 、私が投稿したときにそれを見つけることができませんでした。
解決
この種の質問はよく答えられています コードが完了します. 。スティーブ・マッコネルは書いた ページ全体 この質問に答えるために。彼の結論:
数十年にわたる証拠によると、このような長さ(> 100行)のルーチンは、より短いルーチンよりもエラーが発生しやすいと述べています。 ルーチンの結束、意思決定ポイントの数、ルーチンを説明するために必要なコメントの数、およびその他の複雑さ関連の考慮事項などの問題は、長さの制限自体を課すのではなく、ルーチンの長さを決定するものとします。 とはいえ、約200行より長くルーチンを書きたい場合は、注意してください。
他のヒント
ラインは無関係ですが、複雑さです。
関数は1つのタスクを実行する必要があり、すぐに明らかにする必要があります。関数がどのように、どのように機能するかを正確に理解するために、それ以上の瞬間を必要とするべきではありません。
必要な数のものがあるはずです。
画面サイズに関数のラインカウントを制限する点はありません(公平ではありません。画面が10〜20行以上を超えるまでプログラミングを開始しませんでした - 多分これは環境では意味がありました) 。理にかなっているように関数を書くだけです。それが非常に大きくなったら、コードが繰り返され始めたとき、それらのピースを他の機能/クラス/コンポーネントにリファクタリングします。
それはかなりarbitrary意的な経験則です。 20行のようなものもあれば、ノースクロールルールのようなものもあります。最後に、それが読みやすく、一目で簡単に理解できることを確認してください。あなたを読んでください 確固たる原則 そして、この方法に責任が1つしかないことを確認してください。
必要な限り、できるだけ短い。
経験則として5〜10行を撮影しますが、複数の関数に簡単に因数分解できないロジックがある場合は、必要に応じて長く記述します。一方、私はしばしば、1行か2行か2行の関数を持っています。
もししないなら すぐに コードの一部が何をするかを理解し、そのための新しい関数を書きます。
効率的である限り、どれだけの行があるかは重要ではないと思います。
コードベースのどこでも再利用できるコードは、同じクラスまたは共有クラスの別の関数/メソッドに移動して呼び出します。
私は以前にもスクリーンサイズのメトリックを聞いたことがありますが、明らかにハード制限であるか、モニターサイズでスケーリングすることを意図していませんでした。乾燥の原則を伝えることを目的としており、機能を可能な限り小さくすることは、(プロジェクトサイズで)スケーリングできるコードを書くための最良の方法の1つです。
Linuxカーネルコーディングスタイルのドキュメントには次のように書かれています。
機能は短くて甘いものでなければならず、1つだけのことをしてください。 1つまたは2つのスクリーンフルのテキスト(ISO/ANSIの画面サイズは80x24です)に適合し、1つのことをして、それをうまく行います。
今、私はこれがカーネルコードのコンテキストにあることを認識していますが、それが再生するポイントのいくつかは一般に有効であると思います。コピーを見つけます ここ. 。関数のセクションは第4章です。
全体として、関数の長さは、人工的なルールによって制約されるべきではありません。理にかなっている場合、そしてそれが読みやすくなりやすくなっているので、物事を要求しますが、1-2の画面についてのルールは石で書かれていません。
これは、OO-Perspectionからの意見です。
私は自分の方法を論理的な作業単位に保持することを好み、LOCのようなメトリックを本当に気にしません。これにより、メソッドに適切に名前を付けることも非常に簡単になり、肥大化を防ぐことができます。
非常に些細な機能的な例は、Fibonacci()関数によって呼び出される後継者(int a、int b)関数を追加するループでフィボナッチ配列を計算する関数を持つ代わりに、fibonacci()関数によって呼び出される関数を持つ代わりにです。
OOファッションのより複雑な例は、GETリクエストを実行するHTTPクライアントです。私はそれをこのようなものに分割します:
Connection getConnection(String host, int port)
Request createRequest(String[] params)
void sendRequest(Request r)
String getResponse(Connection c,Request r)
機能は仕事をするのに十分なほど小さくなければなりませんが、小さくはありません。