PoEAA ch18 Special Case
Special Case
A subclass that provides special behavior for particular cases.
- null撲滅委員会
- nullが来そうなところはnullチェックで囲む?
- コード重複しまくりになる
- この種の問題を引き起こすのはnullだけではない
- 浮動小数点数型の特殊な値
- infinity
- NaN
- 誰だかわからない顧客を表す
"occupant"
- 浮動小数点数型の特殊な値
- nullや変な値を返す代わりにSpecial Case使え
How It Works
- 特殊なケースを表すサブクラスを生やす
class NullCustomer extends Customer
って感じ
- 本家の振る舞いを無害な振る舞いでオーバライドする
- 【補】何もしないsetter
- Special Caseを返すgetter
getLastBill()
がnew UnknownBill()
を返すとか
Customer customer
にnull
を代入していた局面で代わりにNullCustomer
インスタンスを代入するようにする- 複数の
Null Customer
インスタンスを区別する必要が無い場合は、GoFのFlyweight Patternを適用できる - nullの意味するところ
- 存在しない
- 【補】Not Applicable (N/A)
- 存在するが、わからない
- 【補】Unknown
- これらを混同しないためにもSpecial Caseの適用を検討せよ
- 存在しない
When to Use It
- 同じ「条件分岐->振る舞い」が散らばっているとき
- 条件分岐にはnullチェックも含まれる
Further Reading
- 本書執筆時点でSpecial Caseをパターンとして挙げている書籍はない
- [Woolf]のNull ObjectはSpecial Caseのspecial caseであるといえる
Example: A Simple Null Object (C#)
class Employee... class NullEmployee : Employee, INull...
- nullではないが本質的にnullであること(nullness)を明示的にチェックしたい場合、下記いずれかを行えば良い
isNull()
メソッドを生やす- 【補】基底に
isNull() { return true; }
を生やし、- NullObjectでは
return false;
でオーバライドして、ポリモーフィックに真偽を得る
- NullObjectでは
- 【補】基底に
INull
インタフェースを実装させ、型チェックを行うcustomer instanceOf INull
的なやつ