コードの再利用

コードの再利用（コードのさいりよう）またはソフトウェアの再利用とは、既存のソフトウェアまたはソフトウェアの知識を活用し、新たなソフトウェアを構築すること。コードの再利用はプログラミングの黎明期から行われてきた。プログラマは常にコードの一部、テンプレート、関数、プロシージャを再利用している。ソフトウェアの再利用はソフトウェア工学の研究対象である。

概要 
再利用可能なソフトウェアやソフトウェアの知識は再利用可能な資産である。資産には、設計、要求仕様、テストケース、アーキテクチャなども含まれる。

おそらく最もよく知られている再利用可能資産はコードである。コードの再利用とは、ある時点で書かれたプログラムの一部または全部を後の別のプログラムを書くときに利用することである。コードの再利用は、冗長な作業に費やす時間とエネルギーを節約する典型的技法である。

ライブラリは抽象化のよい例である。プログラマはプログラムの一部を再利用可能とするために内部に抽象化ポイントを作成したり、自前で使うためにカスタムライブラリを作ったりする。ソフトウェアをより再利用しやすくする特性をモジュール性、低結合度、高凝集度、情報隠蔽、関心の分離などと呼ぶ。

既存をコードを使って新たなコードを書く場合、なんらかのインタフェースあるいはアクセス手段が定義されていなければならない。これにはサブルーチンコール、オブジェクト、クラス、プロトタイプなどが含まれるのが一般的である。企業では、これらは定式化され標準化されているのが一般的である。

あるプログラムの以前のバージョンを出発点として、次のバージョンを開発する作業も、一種のコードの再利用である。

コードの再利用の一形態として、既存のプログラムからコードを一部または全部抜き出して新しいプログラムにコピーすることがある。企業は素早く開発するためにこの手法を使うことがあるが、このようなコピー・アンド・ペーストによるプログラミングを多用すると、後で重複コード問題に悩まされることになる。

再利用を素早く容易に、プログラミングの正常なプロセスの一部として、より体系的に行えるようにする研究が多くの研究者によって行われてきた。オブジェクト指向プログラミングもそのような目的で生み出されたもので、定式化された再利用手法として一般化した。同様な目的で後に開発されたものとしてジェネリックプログラミングがある。

さらに新しい手段として自動プログラミングがある。これはプログラムがユーザーが設定した一連のパラメータに基づいてある種のプログラムを生成するものである。類似の概念にメタプログラミングもある。

再利用の形態 
 日和見的再利用
 プロジェクト開始時に、再利用可能なコンポーネントがすでに存在することを知って、再利用する。
 計画的再利用
 コンポーネントを後々再利用可能なように戦略的に設計していく。

日和見的再利用はさらに以下のように分けられる。
 内部再利用
 チームが自分達で作ったコンポーネントを再利用する。あくまでも日和見的再利用であって、計画的ではないので、インタフェースの調整などに工数を取られる可能性がある。
 外部再利用
 サードパーティ製コンポーネントを調達して利用する。有償の場合、自身で開発した場合の20%以下のコストとなるのが一般的である。また、調達したコンポーネントについて学習して統合するのにかかる時間も考慮しなければならない。

例

ソフトウェアライブラリ 
コードの再利用の非常に一般的例として、ライブラリを使った技法がある。各種フォーマット間での情報の変換、外部記憶装置へのアクセス、外部プログラムとのインタフェース、情報（数、単語、名前、位置、日付など）の操作といった一般的な操作は、多くのプログラムで必要とされる。新しいプログラムを書くとき、ライブラリのコードを使ってそれらタスクを実行するようにでき、「車輪の再発明」のように同じ操作を実行するプログラムを自前で書く必要はない。ライブラリの実装は特殊なケースも含めてよく評価されているという利点がある。欠点は、性能向上や出力形式を変えるといった目的があっても実装の詳細を調節できない点と、ライブラリを取得し学習し設定するのにかかる時間とコストである。

デザインパターン 

デザインパターンは、似たような問題を解くための汎用の解法である。デザインパターンは概念的であり、個々の問題の必要に応じて修正可能である。抽象クラスとインタフェースは特定のパターンの実装に再利用可能である。

フレームワーク 

サードパーティのアプリケーションやフレームワークを通してソフトウェアの大きな部分を再利用することも多い。ただしフレームワークは通常ドメイン固有で、ある範囲の応用にしか適用できない。

　上記、コードレベルでの再利用のほか、要件定義、設計、運用まで含めたソフトウェア再利用の取り組みがある。

ソフトウエアプロダクトライン 
　派生開発を整理し、コア資産を作成する開発手法。コア資産が、再利用可能なソフトウェア資産である。

　コア資産から製品群が導出可能であることをバリアビリティと呼ぶ。

　バリアビリティを表現する最も一般的な方法はフィーチャモデリングであり、フィーチャモデルはプロダクトラインエンジニアリングの重要な特徴である。

アセットベースド開発 
　オブジェクト指向技術を土台に、広義のソフトウェアの再利用を実現する試みである。

　アセットベースド開発（Asset-based Development）というプロセス体系が、ラショナルソフトウェア（現IBM）が主導する、RAS（Reusable Asset Specification) コンソーシアムで提言されている。

関連項目 
Don't repeat yourself
継承
手続き型プログラミング
ポリモーフィズム
仮想継承
ソフトウェアコンポーネント
車輪の再発明
NIH症候群

外部リンク 
 Software Reuse NASA
 RiSE - Reuse in Software Engineering
 ReNews - SoftwareReuse and Domain Engineering
 Koders Open Source Search Engine
 merobase - a Search Engine for Software Components

ソフトウェア工学
プログラミング原則