Markdown展開

2012年2月23日木曜日

Nullless型

Scalaやらの関数型言語にはOptionという「値が入ってるか入っていないかはっきりしない」というすんばらしいジェネリッククラスがあります。

C++なんかにもBoostライブラリにOptionalの実装があったりします。
(C#にも一応Nullableという型がありますが、これはstructにnullを入れるようにするだけの機能しかありません。)


近代的なプログラミングだとこれらとNullクラスパターンでnullポインタと無効値をキッチリ切り分けることが出来るわけです。





ところが実務だとそんなことお構いなしで
ガンガンnull値を返してnullチェックを強要するわ、明らかにnullを返さないパスだろうが「nullチェックを入れろ」とか言ってくるわけです。嘆かわしい限りですね。


そこで、そんなら参照型でも絶対にnullが入ってないことを保証することは出来ないもんか、という発想に至ります。


こんな感じで。
// null禁止型
class Nullless<T>
{
  public T Instance { get; private set; }

  // 引数なしコンストラクタは持たない(初期化時に必ずインスタンスがセットされる)
  public Nullless(T instance)
  {
    if (instance == null)
      // nullを入れようとするとexception
      throw new ArgumentNullException();
    Instance = instance;
  }

  // 他にcastとかも定義する
}


これをこんな感じで使います。

//生のクラスをそのまま突っ込める
Nullless<Hoge> hoge1 = new Hoge();

// nullを挿したらException
Nullless<Hoge> hoge2 = null; <-- ArgumentNullException

//挿し替えはOK
hoge2 = new Hoge();

// メソッドはInstanceプロパティを介して
hoge.Instance.method();


で、Nullableのごとく

//生のクラスをそのまま突っ込める
Hoge! hoge1 = new Hoge();

// nullを挿したらException
Hoge! hoge2 = null; <-- ArgumentNullException

//挿し替えはOK
hoge2 = new Hoge();

// そのままメソッド叩けたら素敵
hoge.method();


こんな感じで使えたら素敵かなと。


自分で使った事無いので実用性は実際のところわからないですけどね。


以上、思うことを適当に書き綴りました。

0 件のコメント:

コメントを投稿