コードの再利用

コードの再利用（コードのさいりよう）またはソフトウェアの再利用とは、既存のソフトウェアまたはソフトウェアの知識を活用し、新たなソフトウェアを構築すること。コードの再利用はプログラミングの黎明期から行われてきた。プログラマは常にコードの一部、テンプレート、関数、プロシージャを再利用している。ソフトウェアの再利用はソフトウェア工学の研究対象である。
概要.
再利用可能なソフトウェアやソフトウェアの知識は再利用可能な資産である。資産には、設計、要求仕様、テストケース、アーキテクチャなども含まれる。
おそらく最もよく知られている再利用可能資産はコードである。コードの再利用とは、ある時点で書かれたプログラムの一部または全部を後の別のプログラムを書くときに利用することである。コードの再利用は、冗長な作業に費やす時間とエネルギーを節約する典型的技法である。
ライブラリは抽象化のよい例である。プログラマはプログラムの一部を再利用可能とするために内部に抽象化ポイントを作成したり、自前で使うためにカスタムライブラリを作ったりする。ソフトウェアをより再利用しやすくする特性をモジュール性、低結合度、高凝集度、情報隠蔽、関心の分離などと呼ぶ。
既存をコードを使って新たなコードを書く場合、なんらかのインタフェースあるいはアクセス手段が定義されていなければならない。これにはサブルーチンコール、オブジェクト、クラス、プロトタイプなどが含まれるのが一般的である。企業では、これらは定式化され標準化されているのが一般的である。
あるプログラムの以前のバージョンを出発点として、次のバージョンを開発する作業も、一種のコードの再利用である。
コードの再利用の一形態として、既存のプログラムからコードを一部または全部抜き出して新しいプログラムにコピーすることがある。企業は素早く開発するためにこの手法を使うことがあるが、このようなコピー・アンド・ペーストによるプログラミングを多用すると、後で重複コード問題に悩まされることになる。
再利用を素早く容易に、プログラミングの正常なプロセスの一部として、より体系的に行えるようにする研究が多くの研究者によって行われてきた。オブジェクト指向プログラミングもそのような目的で生み出されたもので、定式化された再利用手法として一般化した。同様な目的で後に開発されたものとしてジェネリックプログラミングがある。
さらに新しい手段として自動プログラミングがある。これはプログラムがユーザーが設定した一連のパラメータに基づいてある種のプログラムを生成するものである。類似の概念にメタプログラミングもある。
再利用の形態.
日和見的再利用はさらに以下のように分けられる。
例.
ソフトウェアライブラリ.
コードの再利用の非常に一般的例として、ライブラリを使った技法がある。各種フォーマット間での情報の変換、外部記憶装置へのアクセス、外部プログラムとのインタフェース、情報（数、単語、名前、位置、日付など）の操作といった一般的な操作は、多くのプログラムで必要とされる。新しいプログラムを書くとき、ライブラリのコードを使ってそれらタスクを実行するようにでき、「車輪の再発明」のように同じ操作を実行するプログラムを自前で書く必要はない。ライブラリの実装は特殊なケースも含めてよく評価されているという利点がある。欠点は、性能向上や出力形式を変えるといった目的があっても実装の詳細を調節できない点と、ライブラリを取得し学習し設定するのにかかる時間とコストである。
デザインパターン.
デザインパターンは、似たような問題を解くための汎用の解法である。デザインパターンは概念的であり、個々の問題の必要に応じて修正可能である。抽象クラスとインタフェースは特定のパターンの実装に再利用可能である。
フレームワーク.
サードパーティのアプリケーションやフレームワークを通してソフトウェアの大きな部分を再利用することも多い。ただしフレームワークは通常ドメイン固有で、ある範囲の応用にしか適用できない。
　上記、コードレベルでの再利用のほか、要件定義、設計、運用まで含めたソフトウェア再利用の取り組みがある。
ソフトウエアプロダクトライン.
　派生開発を整理し、コア資産を作成する開発手法。コア資産が、再利用可能なソフトウェア資産である。
　コア資産から製品群が導出可能であることをバリアビリティと呼ぶ。
　バリアビリティを表現する最も一般的な方法はフィーチャモデリングであり、フィーチャモデルはプロダクトラインエンジニアリングの重要な特徴である。
アセットベースド開発.
　オブジェクト指向技術を土台に、広義のソフトウェアの再利用を実現する試みである。
　アセットベースド開発（Asset-based Development）というプロセス体系が、ラショナルソフトウェア（現IBM）が主導する、RAS（Reusable Asset Specification) コンソーシアムで提言されている。