本記事では、
プログラミングにおけるハードコーディング(ハードコード)について解説を行っていく。
ハードコーディングは一般的にプログラムを記述する上ではやってはいけない行為なため、プログラミング初心者の方はぜひこの機会にその概念を理解してもらいたい。
ハードコーディング(ハードコード)とは
結論から言うと、ハードコーディング(ハードコード)とは、
ソースコードの中に固定値をそのまま書き込んでしまうことだ。
具体的に言うと、
本来、別の場所に変数などで保存しておくべき値を、ソースコードの中に直接記述してしまうことをハードコードと言う。
次では具体例をもとに解説していく。
ハードコーディングのサンプル:消費税計算
ハードコーティングのサンプルを実例を用いて紹介する。
以下は、消費税を計算する式だ。
(税込み額)=(金額)×1.08
実際にハードコーディングを用いてソースコードを記述すると以下のようになる。
including_tax_amount = price * 1.08;
消費税率「1.08」というのが、ソースコード中に直接記述されている。
これがまさに、ハードコーティングだ。
固定値がそのまま、プログラムのソースの中に保存されている状態になってしまっている。
一見すると何も問題ないかの様にも見えるが、ハードコーディングはデメリットがたくさんあるコーディング方法なので、次にそのデメリットを解説していく。
ハードコーディングのデメリット
ハードコーディングのデメリットはざっくり言うと以下の様なものがある。
- マジックナンバーになってしまう
- 保守性が悪くなる
- セキュリティが脆弱になる危険性がある
上記について順に解説していく。
①マジックナンバーになってしまう
マジックナンバーとは、ハードコーティングをした際に、実際にプログラム中に直接記述された値のことだ。先ほどの例で言うと消費税率の1.08がマジックナンバーに当たる。
先ほどの消費税額の計算式を振り返る。
including_tax_amount = price * 1.08 ;
上記の例でいえば、「1.08」がマジックナンバーということになる。
マジックナンバーがダメな理由
マジックナンバーを記述してはダメな理由は、
その値が「何の値なのかがわからなくなってしまう」場合が多いためだ。
「1.08」といえば消費税率である、というのは常識のように思えるのでパッと見でも理解できるが、
これが「1.33」などの数字であればどうだろう。
(税込み額)=(金額)×1.33
1.33という一般に身に覚えのない値が直接ソースコードに書き込まれているので、上記の式を始めてみた人は1.68が何を表しているのかおそらく予測不可能だろう。
このように、値の意味が予測不可能になってしまうことを皮肉って呼びだしたのが「マジックナンバー」だ。
変数を使って値に意味を持たせることで、マジックナンバーの出現を防ぐ
マジックナンバーは、変数を使うことで明確に防ぐことが可能であり、読み手もコードの可読性が一段と向上する。
以下の記述例を見てほしい。
(所得税率)= 1.33
(税込み額)=(金額)×(所得税率)
所得税率という変数に、1.33という値をあらかじめ格納しておくことで、だれがどう見ても、「1.33というのは所得税率のことなんだな」というのが分かるようになった。
この様に、ちょっとした一手間を加えることでマジックナンバーの出現を防ぐことができるので、初めは慣れないかもしれないが「マジックナンバーになってしまっていないか?」という注意を常に頭の片隅に入れてコーディングをすることでより優れたコードを書ける様になるだろう。
②保守性が悪くなる
ハードコーディングをしてはいけない大きな理由の2つ目が「保守性の低下」だ。
ハードコーディングをさけるべき理由で最大の理由はこれだといって良いだろう。。
ハードコーディングで保守性が低下しているコードの例
具体的にハードコーディングで保守性が低下しているコードを紹介する。
以下のコードを確認してほしい
(税込み額)=(金額)×1.08
(支払い額)=(金額)×1.08
(売上額)=(金額)×1.08
上記の何がいけないかと言うと、1.08というマジックナンバーがすでに合計で3ヶ所出現してしまっていることだ。これでは消費税が変更されたタイミングで、3ヶ所のコードの変更を行わなければいけない。
3ヶ所なら何とかなる気がするが、例えば100ヶ所に1.08という値を記述していた場合、100ヶ所を修正するという手間が発生するし、中には修正漏れが混在し、プログラムのバグになってしまう危険性も高まってしまう。
これが、ハードコーディングにおける保守性の悪さだ。
変数に格納して、値を使い回すことで保守性を向上させる
マジックナンバーになりそうな値は変数に格納して使い回すことで、保守性を向上することができる。
以下のコード例を確認してほしい。
(消費税率)= 1.08
(税込み額)=(金額)× (消費税率)
(支払い額)=(金額)× (消費税率)
(売上額)=(金額)× (消費税率)
消費税率1.08をあらかじめ変数として格納しておくことで、あとはその変数を使い回すだけのコードになっている。
このことによって、たとえ消費税率が変更になっても、変数定義の部分のみを変更すればよく、また修正漏れが発生する確率も格段に低くなるのが分かるだろう。
③セキュリティが脆弱になる危険性がある
ハードコーディングをしてはいけない3つ目の理由は、セキュリティに脆弱性を生んでしまうということが挙げられる。
ハードコーディングでセキュリティに脆弱性が発生している例
以下のコード記述例を見てほしい
IF(入力されたパスワード)= "p@ssW0rd2022"
上記のようにパスワードをハードコーディングしてしまった場合、パスワードが外部に洩れてしまうリスクがある。他にもIDや個人情報の特定につながるいかなるものは絶対にハードコーディングするべきではない。
データはハードコーディングせず、外部から読み込む
(パスワード)= DBから取得
IF(入力されたパスワード)=(パスワード)
上記ではDBから取得したパスワードをコード上で使用しているが、上記の様にデータはなるべくハードコーディングせず、外部から読み込んで使用することで赤キュリティ上の脆弱性を下げることが可能になる。
このように、ハードコーディングをすることには多くの弊害がある。
セキュリティだけでなくメンテナンスもしにくくなるなどハードコーディングをして良い面はほぼないといって過言ではない。
ハードコーディングをしていると、プログラムの基礎を知らないとみなされ初心者のレッテルを張られてしまうため、ソフトコーディングでプログラミングを行うことを心がけよう。
対義語:ソフトコーディング(Soft Coding)
ちなみに、ハードコーディングの反対はソフトコーディング(英:Soft Coding)と言う。
改めてにはなるが、消費税のプログラムを基に、ソフトコーディングで記述してみる。
const tax_rate = 1.08;
including_tax_amount = price*tax_rate ;
上記では、消費税率を事前に定数として定義した。
変数には定数と呼ばれる、プログラム上で一度定義したら値を変更できない変数がどのプログラミング言語にも存在するので、変数の種類を適宜使い分けることでより良いコードが書けることだろう。
関連記事
https://wa3.i-3-i.info/word12866.html
https://qiita.com/tetoralynx/items/5238d3a477f8fb9d2574