web-dev-qa-db-ja.com

関数/プロシージャ/メソッドには何行のコードが必要ですか?

可能性のある複製:
関数が長すぎる場合

私は最近、別の開発者によって書かれた貧弱なコードをレビューし、悪い習慣を文書化するといううらやましい仕事を与えられました。 (これは、もちろん、利他的な理由ではなく、開発者の仕事に対する支払いから抜け出すためです!)

レビューされたコードには、多くのコード行であるいくつかの手順があります-最長はほぼ600行です。私が考えたこれに関するいくつかの問題は、保守性と読みやすさです。

秘trickは、これが悪い習慣である理由を素人に正当化する必要があり、可能であれば、十分に評価された最新の参考書でそれをバックアップすることです。アナロジーも良いです。

何か案は?

重複:関数が長すぎるのはいつですか?
重複:最大関数サイズの最良のルール?

46
Alex Angas

コードの行ではありません。 Steve Mcconnell および Bob Martin のように(コーディングのベストプラクティスに関する2つの非常に優れたリファレンス)、メソッドは1つだけのことを行う必要があります。ただし、そのために必要なコードの行数は、必要な行数です。その「1つのもの」をより小さなものに分割できる場合、それらのそれぞれにメソッドが必要です。

あなたの方法が複数のことをしている良い手がかり:

  • メソッド内の複数レベルのインデント(1つのことだけを行うにはロジックブランチが多すぎることを示します)
  • 「段落区切り」-コードの論理グループ間の空白は、メソッドが複数のことを実行していることを示します

ほんの数例を挙げます。ボブ・マーティンはまた、それを10前後に保つように言っています。個人的に私は通常10を狙って撃ちます。20に近づき始めたら、それはその方法にもっと注意を払う精神的な旗です。しかし、最終的に、LoCはほとんどすべてにとって悪い指標です。これは、実際の問題を潜在的に指摘できる有用な指標にすぎません。

111
Rex M

本当の答え

特定の番号はありません。

具体的な答え

弁護士などに何らかの理由で正当化する必要がある場合は、お店の典型的な開発エディターウィンドウに収まる最大行数を把握し、それを使用してください。

一般的な慣行

実際にそのように見るべきではありませんが、1つの関数で非常に複雑なことは何もないはずです。

各作業ユニットは、記述的に名前が付けられた独自のユニットテスト可能なメソッドに委任する必要があります。 これを行うと、すべてのメソッドが行数をカウントせずに小さくて読みやすくなります......

私が目にする最大の犯罪者は、ifステートメントの途中で爆発した3〜4個以上のブール条件です。それをすべて1つのブール値に適切な名前でラップし、それを構成するそれ自体が複雑な部分をラップします。

10
Trampas Kirk

まず、長さの制限は通常のメトリックスとは完全に分離されていることに注意してください。これは「関数は1つのことだけを行い、それをうまく行うか?」です。その質問に対する答えが「はい」でない場合、関数はおそらく長さに関係なく、おそらく良いものではありません。

特に最大長に関連する、Code Completeからの引用は、一般的にコーディング慣行の主題に関する最高の本の1つと考えられています。

時々、複雑なアルゴリズムはより長いルーチンにつながります、そして、そのような状況で、ルーチンは100-200行まで有機的に成長することを許されるべきです。 (1行は、ソースコードの非コメント、非空白行です。)数十年の証拠は、そのような長さのルーチンは、短いルーチンよりもエラーが発生しにくいと言っています。ネストの深さ、変数の数、およびその他の複雑性に関連する考慮事項などの問題が、長さ制限自体を課すのではなく、ルーチンの長さを決定するようにします。

約200行より長いルーチンを作成する場合は注意してください。コストの削減、エラー率の削減、またはその両方を報告する研究のいずれも、200行を超えるサイズで区別される大きなルーチンではなく、200行のコードを渡すと理解しやすい上限に達します。

6
Chad Birch

これを読んでから何年も経ちましたが、Learning Perlで、画面全体を一度に収めることができないように手順を作成することを推奨していると思います。これは良い基準だと思いました。コードの繰り返し(データベースアクセスやプロパティ値の割り当てなど)のためにまだ読み取り可能な長い関数を見てきましたが、それらは通常ではなく例外です。

2
flatline

Rexのポイントに追加するには、できるだけ短くする必要があります。ボブ・マーティンは10以下と言います

Object Mentor-関数の大きさはどれくらいですか?

2
Ovi Tisler

できるだけ少ない。

1
Alex Fort