web-dev-qa-db-ja.com

どのようにしてコードを再利用可能にしますか?

少なくともコードを変更した場合、コードはなんらかの方法で再利用できます。ランダムコードは、そのようなものとしてあまり再利用できません。私がいくつかの本を読んだとき、彼らは通常、コードを使用する他の状況も考慮に入れて、コードを明示的に再利用可能にするべきだと言っています。しかし、特定のコードは、クラスを実行する全能であってはなりません。

後で変更する必要がない再利用可能なコードが欲しいのですが。どのようにしてコードを再利用可能にしますか?コードを再利用可能にするための要件は何ですか?再利用可能なコードが間違いなく持つべきものは何ですか?また、オプションのものは何ですか?

46
Silvercode

いくつかのヘルプについては、 再利用可能なコードの記述に関する10のヒント を参照してください。

  1. コードはDRYのままにしてください。ドライは「自分を繰り返さないでください」を意味します。
  2. クラス/メソッドに1つのことだけを行わせる。
  3. クラスの単体テストを記述し、クラスのテストを簡単にします。
  4. フレームワークコードからビジネスロジックまたはメインコードを削除する
  5. より抽象的に考えて、インターフェースと抽象クラスを使用してください。
  6. 拡張用のコード。将来簡単に拡張できるコードを記述します。
  7. 不要なコードは書かないでください。
  8. カップリングを減らすようにしてください。
  9. よりモジュール化する
  10. コードが外部APIであるかのようにコードを書く
63
Galwegian

テスト駆動開発アプローチを採用する場合、コードは、今後のシナリオに基づいたリファクタリングとしてのみ再利用可能になります。

個人的には、特定のクラスをコーディングするために必要なシナリオを推測するよりも、常にリファクタリングを行うとよりクリーンなコードが生成されることがわかります。

16
Duncan

何よりも、保守性によりコードが再利用可能になります。

再利用性自体が価値のある目標であることはめったにありません。むしろ、適切に構造化され、容易に保守可能で有用なコードを記述することの副産物です。

再利用可能なコードを作成しようとすると、将来のプロジェクトで必要になる可能性のある動作の要件を考慮に入れようとすることがよくあります。これがどれほど上手になっても、これらの将来を保証する要件が間違っていることに気付くでしょう。

一方、現在のプロジェクトの最低限の要件から始めると、コードがクリーンでタイトでエレガントであることがわかります。同様の機能を必要とする別のプロジェクトで作業しているときは、元のコードを自然に変更します。

選択したプログラミング言語/パラダイムのベストプラクティス(例:パターンとSOLID for Java/C#タイプ))、リーン/アジャイルを検討することをお勧めしますこれらのアプローチの長所と短所を理解することで、コーディングの実践が改善され、すべてのコードが再利用可能になります。ただし、設計上ではなく、「偶然」です。

また、ここを参照してください: 保守可能なコードの記述

12
Kramii

「再利用」のほとんどの定義では、コードの再利用は、少なくとも私の経験では神話です。この傷跡があるのは分かりますか? :-)

再利用とは、既存のソースファイルを取得して、新しいコンポーネントまたはサービスが機能しなくなるまでそれらを送信するという意味ではありません。特定のコンポーネントまたはサービスを取得し、変更せずに再利用することを意味します。

最初のステップは、再利用可能なコンポーネントを作成するために少なくとも3回の反復が必要になるという考え方に身を置くことだと思います。なぜ3?コンポーネントを初めて再利用しようとすると、常に、処理できないものを発見します。したがって、それを変更する必要があります。これは数回発生しますが、最終的には、少なくとも再利用可能と思われるコンポーネントが完成します。

もう1つのアプローチは、高価な前向きな設計を行うことです。しかし、その場合のコストはすべて前払いであり、メリットは(しばらくすると)いつか現れるかもしれません。上司が現在のプロジェクトスケジュールが常に支配的であると主張する場合、このアプローチは機能しません。

7
RoadWarrior

比較的大きなプロジェクトを作成する場合は、さまざまなモジュール(パーツ)を作成します。実際に再利用可能なコードとは、同じ機能を必要とする他のプロジェクトが使用できるライブラリを作成することを意味します。

そのため、再利用できるモジュールを特定する必要があります。

  1. 各モジュールのコアコンピタンスを特定します。たとえば、プロジェクトでファイルを圧縮する必要がある場合は、ファイル圧縮を処理するモジュールがあります。 [〜#〜] not [〜#〜]ONE THINGよりも多くのことを実行します。一つだけ。

  2. 圧縮するファイル、出力、および圧縮形式以外に何も必要とせずに、ファイル圧縮を処理するライブラリ(またはクラス)を記述します。これにより、モジュールがプロジェクトの残りの部分から切り離され、別の設定で(再)使用できるようになります。

  3. 最初に完璧にする必要はありません。実際にライブラリを再利用すると、おそらくデザインの欠陥が見つかります(たとえば、新しい圧縮形式を簡単に追加できるように十分にモジュール化していません)。そして、2回目にそれらを修正して、モジュールの再利用性を向上させることができます。再利用するほど(そして欠陥を修正するほど)、再利用しやすくなります。

考慮すべき最も重要なことはデカップリングです。緊密に結合されたコードの再利用性を記述した場合、最初の犠牲になります。

必要なすべての状態またはコンテキストをライブラリの外に残します。ライブラリに状態を指定するメソッドを追加します。

7
Vinko Vrsalovic

オブジェクト指向を使用すると、コードをスーパークラスにリファクタリングできます。これはおそらく、最も簡単で、最も安価で、最も効果的な種類の再利用です。通常のクラス継承では、「その他の状況」について多くのことを考える必要はありません。 「全能」コードを作成する必要はありません。

単純な継承を超えて、再利用はあなたが発明した以上のものを見つけるものです。わずかに異なる問題を解決するために独自のパッケージの1つを再利用したい場合、再利用の状況を見つけます。新しい状況に正確に適合しないパッケージを再利用する場合、2つの選択肢があります。

  1. それをコピーして修正します。ほぼ同様のパッケージにする必要があります-コストのかかる間違いです。

  2. 元のパッケージを2つの状況で再利用可能にします。

再利用のためにそれをしてください。これ以上何もない。 「潜在的な」再利用や未定義の「その他の状況」について考えすぎると、時間の浪費になる可能性があります。

6
S.Lott

他の人たちはこれらの戦術に言及しましたが、ここではそれらは正式です。これらの3つはあなたをとても遠くへ連れて行きます:

  • 単一の責任の原則 に準拠します。これは、クラスが「1つの処理」のみを実行することを保証します。つまり、同じことを含む別のアプリケーションで再利用できる可能性が高くなります。
  • Liskov Substitution Principle に準拠します。これにより、コードが「予期せずに想定どおりに動作する」ことが保証されます。つまり、同じことを実行する必要がある別のアプリケーションで再利用できる可能性が高くなります。
  • Open/Closed Principle に従います。これにより、ソースを変更せずにコードの動作を変更できるため、直接変更せずに再利用できる可能性が高くなります。
4
bzlm

上記の項目に追加するには、次のようにします。

  • 再利用する必要があるこれらの関数をジェネリックにする
  • 構成ファイルを使用し、files/dbで定義されたプロパティをコードで使用する
  • 独立した機能を提供し、さまざまなシナリオで使用できる関数/クラスにコードを明確に因数分解し、構成ファイルを使用してそれらのシナリオを定義します
1
Salman Kasbati

「クラス継承に対するクラス構成」の概念を追加します(これは、ここでの他の回答から派生しています)。このようにして、「作成された」オブジェクトは、依存するオブジェクトの内部構造を気にしません-その動作のみ。カプセル化が改善され、保守が容易になります(テスト、気にする必要のない詳細)。 C#やJavaなどの言語では、多重継承がないため、多くの場合重要です。そうすれば、継承グラフの地獄を回避するのに役立ちます。

1
reshefm

前述のように、モジュラーコードは非モジュラーコードよりも再利用可能です。

モジュラーコードを作成する1つの方法は、カプセル化を使用することです。カプセル化の理論については、こちらをご覧ください。 http://www.edmundkirwan.com/

エド。

1
Ed Kirwan

ホイールの再発明は避けてください。それでおしまい。そして、それ自体が上記の多くの利点があります。何かを変更する必要がある場合は、別のコード、別のクラス、別の定数、ライブラリなどを作成するだけです。これにより、同じアプリケーションで作業する開発者と他の開発者が役立ちます。

1
Ricardo Sanchez

コメント、詳細、次回コードに戻ったときに混乱しているように見えるすべてのもの。過度に冗長なコメントはやや煩わしいかもしれませんが、まばらなコメントよりはるかに優れており、前回行っていたWTFを理解しようとする時間を節約できます。

0
naught101