関数ごとに最適なコード行数はありますか?[閉まっている]


18

関数は、コードの重複を最小限に抑えるためだけに使用されるわけではありません。長い関数をより小さな関数に分割して読みやすさを高め、コードを自己コメント化するためにも使用されます。ただし、このゲインは、関数またはメソッドごとのLOC数に直接反比例するわけではありません。それ以外の場合は、1行または2行のコードのみが含まれる多数の関数があります。

これにより、機能ごとに最適な数のLOCが存在するかどうか疑問に思います。もしそうなら、それは何であり、言語間で逸脱していますか?


6
良い時間については、Mitch McConnellのChapter 7 Section 4のCode Complete Vol 2を参照してください。
ピーターターナー

2
@Peter -私はあなたが「スティーブ・マコーネル」を意味だと思う
JohnFx

ええ、おもしろい、本を見ながらそれを書いていました。...Wasnt Mitch McConnell Pres。ブッシュの参謀長?
ピーターターナー

3
数はほぼ間違いなく言語によって異なります。20行のDelphiメソッドでは完全に問題がないのに、6行のProlog句が表示されて驚いています。以下の私の答えは、環境を使用して短い方法を奨励するSmalltalkに対するものです。
フランクシェラー

1
@ピーターターナー:ふむ... S1からS15とI1からI11。彼は一時変数をレジスタと混同しているように聞こえます。^^
ギャブリン

回答:


33

行数の代わりに、私が使用する基準は、各関数が1つのことだけを実行し、適切に実行することです。


はい、作業単位があれば、何が起きているのかを知るために50個の関数間を移動する必要はありません。このメトリックを使用して関数を適切に分割すると、ほぼ自然にサイズが適切になります。
ChaosPandion

2
@ChaosPandion:しかし、あなたの作業単位はおそらくより基本的な一連のステップとして表現されるでしょう。関数を確認する場合は、各単一ステップのコードではなく、一連のステップを確認します。
Wizard79

2
@Lorenzo-その場合、各ステップが作業単位になります。親機能は、作業単位の高レベルの概要になります。
ChaosPandion

1
はい、これは確かに非常に真実です。では、質問を言い換えてみましょう。1つのことだけを行い、それをうまく機能する関数に最適なLOC数はありますか?
ギャブリン

@gablinは言いづらく、またLOCは言語に依存しますが、この原則を守れば、通常は1〜50の合理的な範囲内に収まります。
grokus

21

古い経験則では、スクロールする必要なく、関数は画面上に完全に表示される必要があります。

基本的な考え方は、一度に関数全体を見ることができない場合、関数は複雑すぎて、より基本的な部分に分割する必要があるということです。

このルールは非常に実用的で便利ですが、正式なルールでは、関数内の論理ステップを1つだけ保持する必要があります。関数は基本的なジョブのみを実行します。ジョブをより基本的な部分に分割できる場合は、関数を分割する必要があります。


21
このメトリックは、モニターの平均サイズ/解像度が増加するにつれて、次第に役に立たなくなります。
アダムリア

2
私たちのプログラミングの
専門家は先日

2
@Anna:まあ、私のモニターは高解像度ですが、ツールバー/パレット/パネルの数も増えました。そして、14 ptピッチのフォントを使用できるようになりました!:)
Wizard79

4
端末の24 x 80サイズは変更されない傾向があります。
代替

1
ナンセンス、ルールのポイントは「スクロールせずにすべて見ることができます」です。大きなモニターを使用すると、このルールに違反せずに機能をより多く使用できます。それは、大きなモニターが小さな機能のみを表示できることを意味するものではありません(ただし、IDEにあるすべてのツールバーとプロパティウィンドウでは、これはおそらく真実です:- ))
gbjbaanb

15

なにもない。

画面は大きくなり、フォントサイズは小さくなっています。親指のサイズが異なると、親指のルールはうまく機能しません。

簡潔にしてください。関数が複数のことを行う場合、おそらくそれを小さなものに分割することをお勧めします。


あなたができることは、私の答えが役に立たないと思う理由を教えてください。
ジョシュK

7
h1タグの使用により誰かが気分を害したと思います。
ChaosPandion

@Chaos:それが重要な答えです。
ジョシュK

6
たぶん私は少し微妙すぎたかもしれませんが、私の意図はあなたの答えに反対票を投じる正当な理由がないことを意味することでした。行為をした人は誰でもそうする個人的な理由をランダムに持っていました。彼らは単にジョシュが恐ろしい名前だと思うかもしれません。
ChaosPandion

6

Smalltalkには、メソッドのサイズを小さくする少し変わった方法があります。コードを記述するときは、ブラウザと呼ばれるウィジェットに記述します。ブラウザには、水平に分割された2つの主要な部分があります。コードは下半分に入ります。

デフォルトでは、ブラウザはそれほど大きくありません。スクロールを開始する前に、5行または6行に収めることができます。もちろん、スクロールは少し刺激的です。

そのため、Smalltalkでは、環境は最大で約6行の短いメソッドを記述するように「奨励します」。(通常は十分です。Smalltalkはかなり簡潔な言語です。)


2

メソッドの理想的なコード行数は可変です。基本的に、関数の定義のコンテキスト内で実行する必要があることを行うのに十分なコードのみを記述したいだけです。これは、クラスではなくメソッドにのみ適用される一種の単一責任原則と考えています。

メソッドに多数のロジックがあり、完了するためのいくつかのステップがある場合、メソッドをいくつかの個別のステップに分割することは理にかなっています。これらの各ステップは、必要に応じて新しいメソッドに抽出されます。

「それ以外の場合、1行または2行のコードのみを含む多数の関数があります。」

各メソッドが少ないほど、定義が簡単になり、理解と管理が簡単になります。必要な場合、何百ものメソッドを使用しても問題はありません。また、前述のSRPに従って、メソッドがより小さく管理しやすい部分に分割されている場合、新しいクラスを簡単に抽出できます。


1

答えはもちろん42です。

重要な注意:機能がSRPに違反することはありません。または、スペインの調査に直面する必要があります。

行の量を減らす方法のヒント:

  • 個々のセクションをマークするコメントはありますか?これらのセクションは関数でなければなりません。
  • ファクトリ/ビルダーの外部にif-elseチェーンまたはswitchステートメントがありますか?あなたのデザインは、あなたが責任を分割するのを助けるためにより良いデザインパターンを必要とするかもしれません。
  • あなたの機能は簡単にテストできますか?関数を簡単にテストできるようにすると、機能がバラバラになります。
  • それは複雑で、シグスの土地はありませんか(1000ラインモンスター)?スクラップリファクタリングを行う-それはリファクタリングであり、コードの責任について教育を受けることを期待して保存しないでください。

1
Nᴏʙᴏᴅʏはスペイン人を期待している...ああ、盗聴者、私はここに少し遅れています。
左辺約14年

0

ここにいくつかの手がかりがあります:

  • 関数の目的と使用法を説明するコメントの作成に問題がある場合は、長すぎます。

  • 関数内のコードのセクションのアクティビティを説明するコメントを書きたい場合、関数は長すぎます。

  • 別の関数からコードを貼り付ける場合、両方とも長すぎます(そのコードを別の関数として抽出します)。

  • クラスデータメンバーをローカル変数から分離するためのコーディング規則が必要な場合、関数が長すぎ、クラスのメンバーが多すぎます。

  • 関数の読み取り中にメモを取る必要がある場合は、長すぎます。

それぞれが1行または2行の長さの関数の「トーン」を持つことは、必ずしも悪いことではありません。私は、これらの小さな関数が最初に予想したよりもはるかに多く再利用されることを発見しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.