ソフトコーディング

ソフトコーディングとは、コンピュータプログラミングにおいて、使用する値や機能などを外部のリソースから取得することを言う。外部のリソースとしては、プリプロセッサマクロ、プログラム外部の定数、設定ファイル、コマンドライン引数、データベースのテーブルなどが挙げられる。ハードコーディング（使用する値や関数をソースコード中に直接コーディングする）の対義語にあたる。

 プログラミングにおける習慣 

ソフトウェア中によく変更される値がある場合には、ハードコーディングを避けるのが好ましい習慣とされている。これは、そのような値は、ソフトウェアのユーザーが自身のニーズに合わせ、プログラムのソースコードを編集することなくカスタマイズできた方がよいという考えに基づいている。また同様に、注意深いプログラマはコード中にマジックナンバーが残らないようにする。これはコードの可読性を高めてメンテナンスを容易にするためである。通常、こういった習慣がソフトコーディングと呼ばれることはない。

ソフトコーディングという語が使われるのは通常、ソフトコーディングがアンチパターンとなっている場合である。抽象化された値や機能が多すぎると、変更が必要になったときに、コードを直接修正するよりも、余計に複雑になったりメンテナンスが困難になったりする。この意味でのソフトコーディングは、The Daily WTFの記事で取り上げられたことがある。Softcoding from The Daily WTF

 潜在的な問題点 

究極的には、ソフトコーディングを続けると、設計・実装に問題のある自作のスクリプト言語と、編集にプログラミングのスキルが必要な設定ファイルとを開発してしまうことになる。この結果、そのプログラムの設定を支援するユーティリティを開発する羽目になり、さらにはそのユーティリティ自体がソフトコーディングによって開発されることもある。

適切なコンフィギュラビリティと、問題のあるソフトコーディングとの境界線は、プログラム開発のスタイルや、プログラムの性質によって異なる。たとえば、クローズドソースのプログラムはコンフィギュラビリティを高くする必要がある。これは、エンドユーザーはソースコードにアクセスしたり変更を加えたりすることが一切できないためである。内製のソフトウェアや、限られた範囲にしか配布されないソフトウェアであれば、変更を加えて配布することが比較的容易なため、コンフィギュラビリティは多少低くてもよい。カスタムメイドのWebアプリケーションではコンフィギュラビリティを制限した方がよい場合もある。これは、設定ファイルを変更するよりスクリプトを変更する方が容易なケースがほとんどであることに起因する。

ソフトコーディングを避けるには、ソフトウェアの柔軟性が増すことでエンドユーザーが得る利益と、コンフィギュラビリティを高めたことに起因して発生する複雑性やそれに関連したメンテナンスコストとを比較検討することが肝要と言える。

 柔軟性の実現 

ソフトコーディングが実現しようとしている柔軟性は、適切なデザインパターンを用いることでも達成できる。設定ファイルよりも高い柔軟性が必要であれば、スクリプト言語を統合することでうまくいく可能性がある。多くの場合、既存のスクリプト言語にドメイン固有言語を統合するのが適切な設計である。他にも、アプリケーションの機能の大半をライブラリ化した上で、関連アプリケーションを簡単に作れるようにAPIを提供する方法が考えられる。

 その他の意味 

特徴設計では、'ソフトコーディング'という語は別の意味で用いられる。

 ハードコーディング: 特徴がシステム中にコードされていて、変更できない。
 パラメトリック: テーブルやプロパティファイルにパラメタ値を書くことで、限られた範囲で特徴を変更できる。
 ソフトコーディング: 特徴がエンジンを使って実装されており、任意個数のパラメタを元に結果を取得できる（ビジネスルールエンジンにおけるビジネスルールのようなもの）。スクリプト言語の形で書かれたルールを、システムのパラメタとして使用している。

 関連項目 

 Inner-platform effect
 Rule of least power

 参考文献 

Category:プログラミング
Category:アンチパターン