1. ホーム
  2. function

[解決済み] 関数が長すぎる場合とは?[クローズド]

2022-05-14 03:21:47

質問

35行、55行、100行、300行?いつからバラバラにすればいい?私は60行(コメントを含む)の関数を持っていて、それを分割することを考えていたので、私は尋ねています。

long_function(){ ... }

になります。

small_function_1(){...}
small_function_2(){...}
small_function_3(){...}

関数はlong_function以外では使わない、関数を小さくすると関数の呼び出しが多くなる、など。

どんな時に関数を小さく分解するのでしょうか?なぜですか?

  1. メソッドは論理的なことを1つだけ行うべき(機能性について考える)
  2. メソッドを一文で説明できなければならない
  3. ディスプレイの高さに収まること
  4. 不必要なオーバーヘッド(当たり前のことを指摘するコメント...)を避ける。
  5. ユニットテストは小さな論理関数のために容易である
  6. 関数の一部が他のクラスやメソッドで再利用可能かどうかをチェックします。
  7. 過度のクラス間結合を避ける
  8. 深くネストされた制御構造を避ける。

回答してくれたみなさん、ありがとうございました。 リストを編集して、正解に投票してください。)

私は今、これらのアイデアを念頭に置いてリファクタリングしています :)

どのように解決するのですか?

本当に厳密なルールはありません。一般的に、私はメソッドが 1 つのことを行うだけであることを好みます。したがって、データを取得し、そのデータで何かを行い、それをディスクに書き込むのであれば、取得と書き込みを別々のメソッドに分割し、私の "main" メソッドは "doing something" を含むだけにしています。

その "doing something" はまだかなりの行数になる可能性があるので、行数が使用する正しい指標かどうかはわかりません :)

編集: これは、先週私が仕事場でメールした 1 行のコードです (ポイントを証明するため。習慣にしていることではありませんが :) - 確かに、私のメソッドにこれらの不良少年を 50 ~ 60 行も入れたくはないでしょう :D

return level4 != null ? GetResources().Where(r => (r.Level2 == (int)level2) && (r.Level3 == (int)level3) && (r.Level4 == (int)level4)).ToList() : level3 != null ? GetResources().Where(r => (r.Level2 == (int)level2) && (r.Level3 == (int)level3)).ToList() : level2 != null ? GetResources().Where(r => (r.Level2 == (int)level2)).ToList() : GetAllResourceList();