ハードコーディング

ハードコーディング（）とは、本来プログラム中に記述すべきでないリソース（エラーメッセージなど）を、直接ソースコード中に埋め込むことである。これらは本来、外部ソースから取得するか、実行時に生成するべきものであり、これをソフトコーディング（）という。

ハードコーディングされたデータを変更するには、ソースコードを編集して実行可能ファイルを再コンパイルするか、バイナリエディタを用いてメモリ上またはディスク上のプログラムを書き換える必要がある。

ハードコーディングされたデータは、物理定数、バージョン番号、静的テキスト要素などの不変な情報を表す。一方、ソフトコーディングされたデータは、ユーザ入力、HTTPサーバーからの応答、構成ファイルの内容などの任意の情報であり、実行時に決定される。

具体例としては、固定された付加価値税が設定された電卓や地球の重力加速度が設定された体重計がある。それらは付加価値税率が異なる共同体や地球以外の重力の場所では正常な値が取得できない。

 概要 
ハードコーディングでは、入力データや期待する形式が変更されるたびに、プログラムのソースコードを変更する必要がある。エンドユーザーにとっては、プログラムの外部で何らかの方法で詳細を変更する方が便利である。ハードコーディングが必要な場合もしばしばあるが、通常はアンチパターンと見なされる。プログラマは、エンドユーザのために、動的なユーザインターフェイスではないにしても、ソースコードなしに変更が可能な機能を提供しなければならない。

「ハードコーディングされた」(hard-coded)という言葉は、当初はハード配線による回路のアナロジーとして使用されており、それに対するソフトウェアの使用による設計・実装の柔軟性を表現することを意図していた。

なお、実行時に拡張可能なにおいては、ハードコーディングは、低レベルのタスクを担当しスクリプトを実行するシステムのコアエンジンを開発することを指す。それに対し、ソフトコーディングは、実行時にシステムによって解釈されるスクリプトを開発することを指す。この場合、この用語には軽蔑的な意味はなく、一般的な開発手法を指す。

 ハードコーディングとバックドア 
ハードコーディングされた証明書は、バックドアを作成する一般的な方法である。ハードコーディングされた証明書は通常、構成ファイルやユーザ列挙コマンドの出力には表示されず、ユーザーが簡単にバイパスすることはできない。

 ハードコーディングとDRM 
デジタル著作権管理の手段として、ソフトウェア開発者は一意のシリアル番号をプログラムに直接ハードコーディングすることがある。あるいは、公開鍵をハードコードし、鍵生成を実行することが不可能なDRMを作成するのが一般的である。

逆に、ソフトウェアクラッカーは、有効なシリアル番号をプログラムにハードコーディングし、有効な番号を入力する必要のない無許可のコピーを再配布する。ハードコーディングされているため、それらは全て同じ鍵を持っている。

 インストールパスの固定 
C:¥Program Files¥Appname にインストールされていると想定してインストールパスをハードコーディングしたプログラムは、ディスクの空き容量や組織上の理由で別のドライブにインストールしようとした場合に、インストールに失敗するか、インストール後に実行に失敗する可能性がある。標準的なユーザーはデフォルトのドライブ・ディレクトリにインストールし、テストにはインストールディレクトリを変更したケースが含まれていない可能性があるため、テスト工程でこの問題が検出されないことがある。

初期のコンピュータのマイクロプロセッサには、メモリ内の固定アドレスで実行を開始するという同様の問題があった。

 起動ディスク 
一部のコピープロテクトされたプログラムは、起動時にフロッピーディスクやフラッシュドライブ上の特定のファイルの存在によって不正なコピーではないことを確認する。フロッピードライブが搭載されていない新しいコンピュータに交換すると、フロッピーディスクが挿入されていないため、プログラムを実行することができない。

この例は、ハードコーディングが完全に機能するように見えても、実際にはそうではない場合があるということを示している。1990年代まではほとんどのPCにフロッピーディスクドライブが搭載されていたが、それ以降のPCには搭載されなくなった。1990年代以前にフロッピーディスクドライブの存在を前提としてハードコードされたプログラムは、更新されなければ問題に直面する可能性がある。

 特殊フォルダ 
一部のWindowsオペレーティングシステムには、ファイルを論理的にハードディスクに整理すると呼ばれるものがある。特殊フォルダに関連して、ハードコーディングに関連する問題がある。

 プロファイルのパス 
一部のWindowsプログラムでは、C:\Documents and Settings\UsernameUsernameなどの開発者が定義した場所にプロファイルのパスをハードコードしている。これはWindows 2000以降のWindowsの標準のパスであるが、プロファイルがネットワーク上に格納されている場合や他の場所に移動している場合は、エラーが発生する。プロファイルのパスを取得する適切な方法は、GetUserProfileDirectory関数を呼び出すか、%userprofile%環境変数を参照することである。

 マイドキュメントフォルダのパス 
一部のWindowsプログラムでは、のパスをProfilePath\My Documentsとしてハードコーディングしている。このようなプログラムは、英語版を実行しているPCでは動作するが、ローカライズされたバージョンのWindowsでは、通常このフォルダの名前は異なる。例えば、イタリア語版ではマイドキュメントフォルダの名前はDocumentiである。また、Windows 2000以降では、グループポリシーでフォルダリダイレクトを使用してマイドキュメントを再配置することもできる。マイドキュメントフォルダのパスを取得する適切な方法は、SHGetFolderPath関数を呼び出すことである。

 関連項目 
リテラル
マジックナンバー (プログラム)

 脚注 

Category:アンチパターン