大規模なプログラムの作成中に何度も、コピーまたは貼り付けの回数を関数またはメソッドにコードを入れるのが理にかなっていて、良い経験則は何かを疑問視しています。私は4行以上の経験則を使用しており、2回以上表示され、そのコードを含む単純な関数/メソッドを作成します。より良いプラクティスを考えたり、何か指針を提供できますか?これは、言語固有の質問というよりも、一般的なデザインパターンの質問です。
大規模なプログラムの作成中に何度も、コピーまたは貼り付けの回数を関数またはメソッドにコードを入れるのが理にかなっていて、良い経験則は何かを疑問視しています。私は4行以上の経験則を使用しており、2回以上表示され、そのコードを含む単純な関数/メソッドを作成します。より良いプラクティスを考えたり、何か指針を提供できますか?これは、言語固有の質問というよりも、一般的なデザインパターンの質問です。
回答:
コードを文書化する方法として、関数を部分的に使用します。意味のある名前で関数を呼び出すと、コードを理解しやすくなります。場合によっては、1行の関数でさえ理にかなっています。
たとえば、「クリーンコード」では、Robert C. Martinが次の例を示しています。この:
// Check to see if the employee is eligible for full benefits
if ((employee.flags & HOURLY_FLAG) &&
(employee.age > 65))
それともこれ?
if (employee.isEligibleForFullBenefits())
私はいつも彼に同意するとは限りませんが、この場合は同意します。コードは、それを書いてすべての詳細を知っているときだけでなく、他の人のコードのバグを修正する必要がある午後9時にも読み取り可能であるべきです。長い状態をじっと見つめ、二重のネガをすべて理解しようとすることはお勧めしません。名前を付けるだけでよい場合(条件だけでなく、作成するすべてのコードも)、より簡単になります。
関数に何かを置くことを後悔したことはありません。パフォーマンスが心配な場合は、最初にプロファイルを作成してください。
関数呼び出しは、コードセグメントの繰り返しを避けるためにのみ行うべきであるという誤解が広まっています。私の経験則では、1つの場所でしか使用されない場合でも、論理的な作業単位は関数にする必要があります。これにより、通常、読みやすさが向上し、自己文書化コードを記述できます。この場合、関数名がコメントに置き換わり、実行内容を説明する追加のコメントを記述する必要がなくなります。
それは以上で使われている場合は1位、および
それを関数またはメソッドにします。私の経験では、繰り返されるコードの長い断片は、これらのカテゴリのいずれかに自然に分類されます(通常は最初のカテゴリですが、カテゴリはかなり重なっています;)。もちろん、インターフェイスにある必要があるものはすべて、それ自体が関数/メソッドでもあります。
float x
、int y
およびを計算する場合、double density
これらの計算をC関数として設定することは、3つの値すべてを取得する方法を考案する必要があるため、単にコードを繰り返すより難しい場合があります。繰り返し計算自体が簡単な場合は、インラインのままにしておく方が良い場合があります。
ほとんどの場合、特に各重複が概念的な観点から同じ操作を表す場合。同じ方法で、ただしタイプが異なる場合は、一般的な実装を行います。
私が考えることができない唯一の理由は、メンテナンスの1つです:時には、いくつかの複製を犠牲にしても、別々のものの間で依存関係を作成することを避ける方が便利かもしれません。
「リファクタリング」を検索すると、この非常に一般的なプロセスの業界の「ベストプラクティス」に関する多くのリソースにアクセスできます。幾分有名な記事、Once and Only Onceは、あなたの質問によって提起された懸念に対する「ベストプラクティス」と考えるものを説明する素晴らしい歴史的参考資料です。また、さらに一般的な概念は、Do n't Repeat Yourself(DRY)として知られています。あなたの質問への回答の実際の深いセットの場合は、読みMartin Fowler氏の偉大な古典的、リファクタリング:既存のコードのデザインの向上のために最もよく知られているアドバイスのいくつかをカバーし、リファクタリングあなたが直感的に達成しようとしているものであるが、 !
それは、繰り返されるコードの凝集度の性質に依存します。コードの繰り返し区間が特定の機能を実行している場合、それは一部のための、方法になされているため優れた候補であるDRY原則機能が最適化または修正する必要がある場合、1つだけのセクションがあり、部分的にので、対処するコードの。
関連付けが偶然の場合は、コードをメソッドにするよりも、コードを繰り返す方が適切です。そのスニペットの使用の1つを満たすためにコードシーケンスの1つに何かを追加する必要がある場合、それがメソッド内にある場合、変更はそのメソッドの他の使用に影響する可能性があります。
コード結合の概念に関するウィキペディアの記事を参照してください。