■ ハードコーディングとは
設定値やパラメータなど、プログラムの動作に関係する値を、プログラムコード内に直接記述することを指す。
以下に、ハードコーディングの例と、その問題点、解決策となるソフトコーディングの例を残す。
■ ハードコーディングとなっている例
下記ソース例では「1.1」という消費税の値がハードコーディングとなっている。
// 税込価格 = 税抜価格 * 消費税
double taxIncludedPrice = priceWithoutTax * 1.1 ;
■ ハードコーディングの問題点
①マジックナンバー
何を意味しているのか本人しか分からない値のこと。
先ほどの消費税計算でハードコーディングとなっている「1.1」の値がマジックナンバーである。これを全員が消費税だと理解するのは難しい。
また、何の値か分からないため安直に変更することができなく、属人的なソースとなってしまう。
②保守性
消費税が10%でなくなった場合、消費税を使っている全箇所の修正が必要になる。
下記例は2パターンのみだが、規模が大きくなった時にこのようなソースが複数あると修正に多くの時間がかかってしまう。
/**
* 税抜価格から税込価格を算出する場合
* 税込価格 = 税抜価格 * 消費税
*/
double taxIncludedPrice = priceWithoutTax * 1.1 ;
/**
* 税込価格から税抜価格を算出する場合
* 税抜価格 = 税込価格 ÷ 消費税率
*/
double priceWithoutTax = taxIncludedPrice / 1.1 ;
変更漏れや、記述ミスなど、保守性が低い。
③セキュリティ性
例えば認証処理を行うソースコードに、認証比較する値を直接記述していると外部に情報が漏れる可能性が高い。脆弱性の観点からも直接記述ではなくソフトコーディングでセキュリティの保護をする必要がある。
if (入力された値 == "password12345") {
System.out.println("認証成功");
} else {
System.out.println("認証失敗");
}
■ ソフトコーディングとは
ハードコーディングの対義語であり、柔軟に変更が可能な形でプログラムに取り込むことを指す。
設定値やパラメータなど、プログラムの動作に関係する値を、プログラムコード内に直接記述するのではなく、外部ファイルやデータベースに保存しておき、実行時に必要な値を取得するようにプログラムを作成することで、プログラムの変更や保守を容易にすることができる。
冒頭でハードコーディングとして例を挙げた消費税計算のソースをソフトコーディングにすると以下の形式になる。
// 消費税
final double TAX = 1.1 ;
// 税込価格 = 税抜価格 * 消費税
double taxIncludedPrice = priceWithoutTax * TAX ;
消費税を定数として宣言し、使用時は「TAX」を呼ぶだけで良いので、記述ミスがなくなる。
また、消費税が変わった時は、宣言している値1箇所のみの修正で良いので修正漏れも防げる。