プログラミングの学習中の方や、実際の業務でプログラミングをしている方であれば、「ハードコーディング」という言葉を耳にしたことがあるかもしれません。
このハードコーディングとは、別名「プログラミング初心者の証」とも呼ばれ、実際のコード規約の中で禁止されている場合がほとんど―。「やってしまうと恥ずかしい初歩的ミス」です。
このページでは、ハードコーディングとは何か?なぜハードコーディングをしてはいけないのかを解説し、その回避方法についてざっくり解説します。
プログラマーであれば、知らないと恥ずかしい基本知識ですので、是非この機会に理解しておきましょう。
それでは、早速解説を始めます。
ハードコーディングとは?
ハードコーディングとは、ソースコードの中に固定値をそのまま書き込んでしまうことです。
技術的な言い方をすれば、「本来、別の場所に保存しておくべき値を、ソースコードの中に直接記述してしまう」こととなります。
言葉ではわかりにくい部分もあるので、具体例で考えてみましょう。
実例)ハードコーディング:消費税計算
身の回りでよく見かける、ハードコーティングの例を紹介します。以下は消費税を計算するロジックです。
(税込み額)=(金額)×1.08
including_tax_amount = price*1.08 ;
消費税率「1.08」というのが、ソースコード中に直接書かれています。これがまさに、ハードコーティングです。固定値がそのまま、プログラムのソースの中に保存されている状態です。
体感でいえば、消費税率のように基本的に固定値として扱われそうなもの(元号や、IDなど)がハードコーディングされてしまうことが多いようです。
対義語:ソフトコーディング(Soft Coding)
ハードコーディングの反対はソフトコーディング(英:Soft Coding)と呼ばれます。
先ほどの消費税のプログラムを、ソフトコーディングで記述してみましょう。
(消費税率)= 1.08
(税込み額)=(金額)×(消費税率)
const tax_rate = 1.08; including_tax_amount = price*tax_rate ;
何が違うかと言えば、消費税率を事前に定数として定義しているということだけです。
もちろん、どちらも計算結果は同じですが、ソフトコーディングしておけば、何度か利用されそうな値を別の場所に保存しておく形になるため、後からの変更が容易になりそうですね。
これだけでは、またハードコーディングの悪質性がピンとこない方もいるかもしれません。ここからは、ハードコーディングの罠について具体的な用語を用いながら解説していきます。
①マジックナンバー
ハードコーティングをした際に、実際に埋め込まれた値(プログラム中に直接記述された値)をマジックナンバーと呼びます。
先ほどの消費税額の計算プログラムを見てみましょう。
(税込み額)=(金額)×1.08
including_tax_amount = price*1.08 ;
上記の例でいえば、「1.08」がマジックナンバーということになります。
マジックナンバーと呼ばれる理由は、その値が「何の値なのかがわからなくなってしまう」場合が多いためです。「1.08」といえば消費税率である、というのは常識のように思えますが、これが「1.33」などの数字であればどうでしょうか?
(税込み額)=(金額)×1.33
この瞬間、(税込み額)の「税」とは一体何の税金なのか、初めてこのコードを見るあなたにわかるでしょうか?
このように、値の意味が分からなくなってしまうことを皮肉って呼びだしたのが「マジックナンバー」なのです。
もし、これをソフトコーディングで記述し、下記のようにしたらどうでしょうか?
(所得税率)= 1.33
(税込み額)=(金額)×(所得税率)
マジックナンバーではなくなりました。
だれがどう見ても、「なるほど。1.33というのは所得税率のことなんだな」というのが分かります。
システムを新規開発するタイミングでは、問題ないかもしれませんが、もしこのプログラムでバグが発生し、保守を引き継いだ担当者が
(税込み額)=(金額)×1.33
をみたら、全く意味が分かりませんよね。何の税額だ・・・?そもそも、この数字があっているのか、あっていないのか?この数字があっているとして、計算が間違っているのか・・・?完全に混乱のもとです。
マジックナンバーを避けるという点でも、ソフトコーディングは有効なコーディング方法であると言えます。
ただし、まだ疑問が残る人はいるでしょう。
「コメント」を付与しておけばいいじゃないか!
こんな疑問には、次の章で解説する「保守性」という観点から反論することができます。コメントアウトしても、ハードコーディングしている限り「保守性」が劇的に低下してしまします。
②保守性
ハードコーディングをしてはいけない大きな理由の2つ目が「保守性の低下」です。
多くのプログラマーが、これを理由にハードコーディングをさけるべきだと主張します。
先ほどの例でいえば、
(税込み額)=(金額)×1.08
というコードが、プログラムのあちこちに散りばめられているのを想像してみてください。
①(税込み額)=(金額)×1.08
②(支払い額)=(金額)×1.08
・・・・
⑳(売上額)=(金額)×1.08
考えただけでもぞっとします。
何がぞっとしてしまうかと言うと、消費税が変わっただけで何か所も何か所もプログラムを修正する必要が出てきてしまうという点です。もし以下のようにソフトコーディングされていればどうでしょうか。
①(税込み額)=(金額)× (消費税率)
②(支払い額)=(金額)× (消費税率)
・・・・
⑳(売上額)=(金額)× (消費税率)
上記のように、ソフトコーディングされていれば、
(消費税率)= 1.08
を
(消費税率)= 1.10
に変更するだけで、他の箇所に記載されている計算式も変更することができます。
このように保守性の観点からも、共通の値は固定値として1か所にまとめておくソフトコーディングが優れていると言えます。ハードコーディングをしてしまうと変更時に後悔するでしょう。
ハードコーディングは、変更が大変!というだけではありません。
実は、一番怖いのは「変更漏れ」によるバグの発生です。プログラムをコーディングするのは人間ですので、ハードコーディングされたコードを完璧に修正しきるのは至難の技です。
ソフトコーディングの「ソフト」は「変更の柔軟性」の意味ですので、変更ありきのプログラムの場合は必ずソフトコーディングで作成しましょう。
③セキュリティ保護
ハードコーディングー。してはいけない3つ目の理由は、セキュリティに脆弱性を生んでしまうということです。
これは、ユーザ登録やフォルダ操作などのプログラムで起こりがちです。
IF(入力されたパスワード)= "pass091827346"
このようにハードコーディングした場合、パスワードが外部に駄々洩れです。以下のように、ソフトコーディングをして、セキュリティを保護しなければなりません。
(パスワード)= DBから取得
IF(入力されたパスワード)=(パスワード)
上記のようにコーディングしていれば、DBにアクセスすることができる場合を除いて、パスワードを外部から閲覧することはできません。
このように、ハードコーディングをすることには多くの弊害があります。特に近年3つ目のセキュリティ保護の観点からハードコーディングが話題になることが多くあります。
ハードコーディングをしていると、プログラムの基礎を知らないとみなされ初心者のレッテルを張られてしまうため、ソフトコーディングでプログラミングを行うことを心がけましょう。
プログラミングの独学に限界を感じたら
プログラミングをより実践的に学びたい―。実際にコーディングをしながら学びたい―。独学に限界を感じている―。
そんな方には、無料体験/オンライン完結もあるプログラミングスクールで学ぶのがおすすめです。都度検索しながら知識を補完していくのではなく、1から体系立てて学ぶことで短時間・かつ効率的にスキルハックすることが可能です。
各プログラミングスクールの特徴をまとめた記事をこちらに記載しておきますので、是非ご覧ください。