関数/プロシージャ/メソッドには何行のコードが必要ですか? [複製]
-
03-07-2019 - |
質問
可能な重複:
関数が長すぎる場合
最近、別の開発者によって書かれた貧弱なコードをレビューし、悪い慣行を文書化するといううらやましい仕事を与えられました。 (これは、もちろん、利他的な理由ではなく、開発者の作業に対する支払いから抜け出すためです!)
レビューされたコードには、多くのコード行であるいくつかの手順があります-最も長いコードはほぼ600行です。私が考えたこれに関するいくつかの問題は、保守性と読みやすさです。
秘trickは、これが悪い習慣である理由を素人に正当化する必要があり、可能であれば、十分に評価された最新の参考書でそれをバックアップすることです。アナロジーも良いです。
アイデアはありますか
複製: 関数が長すぎる場合
重複: 最大機能サイズの最適なルールですか?
解決
それはコードの行ではありません。 Steve Mcconnell およびボブマーティン(コーディングのベストプラクティスに関する2つの非常に優れたリファレンス)と言うと、メソッドは1つのことだけを行う必要があります。ただし、そのために必要なコードの行数は、1行に何行あるべきかということです。その「一つのこと」が小さいものに分割できるため、それぞれにメソッドが必要です。
メソッドが複数のことを行っていることを示す手がかり:
- メソッド内の複数レベルのインデント(1つのことだけを行うにはロジックブランチが多すぎることを示します)
- "段落区切り" -コードの論理グループ間の空白は、メソッドが複数のことを実行していることを示します
いくつか例を挙げます。ボブ・マーティンはまた、それを10前後に保つように言っています。個人的に私は通常10を狙って撮影しようとします。しかし、最終的に、LoCはほとんどすべてにとって悪い指標です。これは、実際の問題を潜在的に指摘できる有用な指標にすぎません。
他のヒント
本当の答え
特定の番号はありません。
具体的な回答
弁護士などに何らかの理由で正当化する必要がある場合は、お店の典型的な開発エディターウィンドウに収まる最大行数を把握し、それを使用してください。
一般的なプラクティス
実際にそのように見るべきではありませんが、1つの関数で非常に複雑な処理が行われるべきではありません。
各作業ユニットは、記述的に名前が付けられた独自のユニットテスト可能なメソッドに委任する必要があります。 これを行うと、すべてのメソッドは行を数えることなく小さくて読みやすくなります......
私が目にする最大の犯罪者は、if文の途中で爆発した3〜4個以上のブール条件です。すべてを1つのブール値に適切な名前でラップし、それを構成するそれ自体が複雑な部分をラップします。
まず、長さの制限は通常のメトリックとは完全に分離されていることに注意してください。これは「関数は1つのことだけを行い、それをうまく実行しますか?」その質問への答えが「はい」でない場合、関数はおそらく長さに関係なく、おそらく良いものではありません。
具体的には最大長に関連するCode Completeからの引用。一般的にコーディング慣行に関する最高の本の1つと考えられています。
時々、複雑なアルゴリズムによりルーチンが長くなり、そのような状況では、ルーチンを最大100〜200行まで有機的に成長させる必要があります。 (1行はソースコードの非コメント、非空白行です。)数十年の証拠は、そのような長さのルーチンは短いルーチンよりもエラーが発生しにくいと言っています。ネストの深さ、変数の数、その他の複雑性に関連する考慮事項などの問題が、長さ制限自体を課すのではなく、ルーチンの長さを決定するようにします。
約200行より長いルーチンを作成する場合は注意してください。コストの低下、エラー率の低下、またはその両方が200行を超えるサイズで区別される大きなルーチンを報告した研究はなく、200行のコードを渡すと、理解しやすい上限に達することになります。
この記事を読んでから何年も経ちましたが、 Perlの学習では、一度に画面全体を収めることができない手順を作成することを推奨していると思います。これは良い基準だと思いました。コードの繰り返しが原因で読み取り可能な長い関数(データベースアクセスやプロパティ値の割り当てなど)を見てきましたが、それらは通常ではなく例外です。
Rexのポイントに追加するには、できるだけ短くする必要があります。ボブ・マーティンによると、10以下
できるだけ少ない。