Null Objectパターン
初期状態など何も処理を行いたくない場合、その状態を管理しているオブジェクトにNull
(null, NULL
)を設定したり、判定に使う手法があります。昔からC言語に慣れている人がよく使いますね。
この場合、NullPointerException
(所謂ヌルポ(null pointer reference))を見たことがある人も少なくはないでしょう。Null Objectパターンはこの不具合の対策の一つとして有効です。
Nullableパターン
下記はNull
を設定するパターン(Nullableパターン)の簡単なソースコードです。(C#ですが、どの言語でも考え方は同じです)
class SampleState
{
public string GetName() {
return "SampleState";
}
}
private SampleState _state = null;
private void PutStateString() {
if (_state != null) {
string name = _state.GetName();
formTextBox.Text = name;
}
}
これだけなら大した事はありませんが、実際に_state
を使用する箇所が増えると、都度Null
チェックを書くことになります。
プロジェクトが大きくなると、Null
チェックを忘れることも。
個人的にはC#やJavaなど、クラスの概念がある言語でNullPointerException
を発生させるのは設計ミスだと思っています。
今まで経験したプロジェクトでは画面の表示部分で発生させるという何ともお粗末なものもありました。
Not-nullableパターン
以下はNull
を使用しないパターン(Not-nullableパターン)のソースコードです。
abstract class StateBase
{
public virtual bool IsNull() {
return false;
}
public virtual string GetName() {
return "StateBase";
}
}
class SampleState : StateBase
{
public override string GetName() {
return "SampleState";
}
}
class NullState : StateBase
{
public override bool IsNull() {
return true;
}
public override string GetName() {
return String.Empty;
}
}
private StateBase _state = new NullState();
private void PutStateString() {
string name = _state.GetName();
formTextBox.Text = name;
}
_state
のNull
チェックが無くなり、スッキリしたのが分かると思います。
IsNull()
メソッドは初期化状態かどうかを知る必要がある場合のみ使用します。
StateBase
クラスを抽象クラスではなく通常クラスとし、それをNullState
クラスの変わりに使用することも可能です。
その際は、各継承クラス毎にIsNull()
のオーバーライドなどが必要になります。
このようにNull
に相当する処理をオブジェクトとして定義してしまうパターンをNull Objectパターンと言います。
多態性についても知っておく必要がありますが、設計段階でNullPointerException
が潰せるのは、後の試験工数から見ても非常に有意義な設計パターンです。