http://martinfowler.com/bliki/FixedLengthString.html

アプリケーションプログラムとリレーショナルデータベースの間をやり取りするライブラリを見てみてください。すると、データベースの文字型( char や varchar )がプログラム言語の文字型にマッピングされていることに気付くでしょう。簡単です。そりゃそうですよね。でも、これが間違いってこともあるんです。

なぜこう思うかというと、SQL のvarchar型は固定の長さを持っているんですね。一方、ほとんどのアプリケーションの文字型は任意の長さを扱うことが出来ます。となると、データベースをアップデートするとき、文字が長すぎるといった問題が起こり得るんです。

これに対処するひとつの方法は、固定長の文字列型を定義し、インスタンスがその値と長さを把握できるようにすることです。 値をその文字列型に割り当てると、インスタンスはそれらの長さをチェックすることができます。 そうすることで、そのオブジェクトは、例外を出したり、文字列を短くしたりできます。 もちろん、長すぎる入力文字列に対する振る舞いを追加することも出来ますよ。

こういった文字型を使えば、UI 周りがよくなります。 UI の部品は、固定長の文字列をそのサイズ分だけとってきて、そのまま子ウィジットに流し込みます。 これが長すぎる文字列に対処するための今のところ一番うまいやり方です。けれどこの方法は、文字列の長さに関する情報をデータベースから持ってこなければ不可能です。こういった情報はたいていの場合消えてしまっています。

これは、一般的な設計問題に対する具体的な回答の例です。

  • データベースを切り離す。……のは良いことだが、制約はそのままであり、とばっちりはすべて自分に来る。
  • 物事が簡単になるのに、みんな簡単なバリュータイプを作りたがらない(詳しいことは When To Make a Type(PDF)で)。
  • 簡単なバリデーション機能を UI に入れることで、よりよいインターフェイスが出来る。バリデーションのロジックを重複させないようにするのがポイント。

文字列のチェックというのは、何も長さだけではありません。 正規表現に対するチェック機能もそこに含めることができます。 けれども長さのチェックというのはシンプルで、データベースの扱いを簡単にしてくれるので、今回例として挙げました。