web-dev-qa-db-ja.com

小さな反復的なコードセグメントに対して関数/メソッドを作成する場合の適切なコードプラクティスは何ですか?

大きなプログラムの作成中に何度も何度もコピーと貼り付けを行った後、コードを関数またはメソッドに挿入することは理にかなっており、どのような経験則が適切ですか?私は4行以上の経験則を使用しており、2回以上表示されている場合は、そのコードを含む単純な関数/メソッドを作成します。あなたはより良い実践を考えたり、指針を提供したりできますか?これは、言語固有の問題ではなく、一般的なデザインパターンの問題です。

12
Nirma

コードを文書化する方法の一部として関数を使用しています。意味のある名前で関数を呼び出すと、コードを理解しやすくなります。場合によっては、1行の関数でも意味があります。

たとえば、「クリーンコード」では、ロバートC.マーティンは次の例を示します。どちらが見たいですか。この:

// Check to see if the employee is eligible for full benefits
if ((employee.flags & HOURLY_FLAG) &&
    (employee.age > 65))

それともこれ?

if (employee.isEligibleForFullBenefits())

私はいつも彼に同意するわけではありませんが、この場合は同意します。コードは、それを書いてすべての詳細を知っているときだけでなく、他の人のコードのバグを修正する必要がある午後9時にも、読みやすくなければなりません。長い条件を見つめて、すべてのダブルネガを理解しようとすることはお勧めできません。名前だけを付けることができる場合(条件だけでなく、記述するすべてのコード)、それは非常に単純になります。

関数に何かを入れたことを後悔したことは一度もありません。パフォーマンスが心配な場合は、まずプロファイルを作成してください。

29
omrib

関数呼び出しはコードセグメントの繰り返しを避けるためにのみ行うべきであるという誤解が広まっています。私の経験則では、1つの場所でのみ使用される場合でも、論理的な作業単位はすべて関数にする必要があります。これにより、通常、読みやすさが向上し、自己文書化コードを記述できるようになります。関数名はコメントに置き換わり、何をしているのかを説明する追加のコメントを書く必要はありません。

13
Lie Ryan

one以上で使用されている場合、および

  • 変わる可能性が高い、または
  • 正しくするのは難しい

次に、それを関数またはメソッドにします。私の経験では、繰り返されるコードの長い部分は、当然これらのカテゴリーの1つに分類されます(通常、最初のカテゴリーですが、カテゴリーはかなり重なります;)。もちろん、インターフェイスにある必要があるものは、それ自体が関数/メソッドでもあります。

6
Fred Foo

ほとんどの場合、特に、各複製が概念的な観点から同じ操作を表す場合。同じように実行されるが、型が異なる場合は、汎用的な実装を行います。

私が考えることができないようにする唯一の理由は、メンテナンスの1つです:場合によっては、いくつかの重複を犠牲にしても、個別のものの間に依存関係を作成しないようにする方が便利な場合があります。

4
Nicola Musatti

リファクタリング」を検索すると、この非常に一般的なプロセスに関する業界の「ベストプラクティス」に関する多くのリソースが表示されます。やや有名な記事Once and Only Onceは、「ベストプラクティス」としての見方を説明する優れた歴史的リファレンスです。あなたの質問によって提起された懸念。また、さらに一般的な概念は Do n't Repeat Yourself(DRY) として知られています。質問に対する本当に詳細な回答セットについては、 Martin Fowler のすばらしい定番である リファクタリング:既存のコードのデザインの改善 を参照してください refactoring の最もよく知られたアドバイスのいくつかをカバーしています。これは、直感的に達成しようとしているものです!

1
John Tobler

それは、繰り返されるコードの凝集の性質に依存します。コードの繰り返しセクションが特定の関数を実行している場合、その一部は DRYの原則 が原因であり、一部は関数を最適化または修正する必要があるためです。の場合、処理するコードのセクションは1つだけです。

関連付けが偶然である場合は、メソッドにするのではなく、コードを繰り返すことをお勧めします。そのスニペットの使用の1つを満たすために、コードシーケンスの1つの途中に何かを追加する必要がある場合、それがメソッド内にあると、変更はそのメソッドの他の使用に影響を与える可能性があります。

code cohesion の概念に関するWikipediaの記事を参照してください。

0
Jay Elston

構造化プログラミングの意味での関数とクラスのメソッドを区別する必要があります。

あなたの例では、あなたが示したものはmethodであるため、インラインでコーディングしないでください。

文字列を検証して数値であるかどうかを確認する必要がある場合があります。この場合は、関数を使用します。前述のほとんどの答えが当てはまります。

この区別は、大規模なプロジェクトでは特に重要です。

できる限り、ビジネスルール(メソッド)と計算アルゴリズム(純粋なプログラミング関数)を分離するように努めます。

0
NoChance

コードが複数の場所で正確に繰り返され、繰り返されたセクションが近い将来変更されない場合は、コードを関数に分割します。

0
Steven D.