今日覚えたことを今日使ってみた。
「もし必要なら」という場面はプログラミングをする上で頻繁に発生します。「もし必要なら〜する」という関数を作るときには DoSomethingIfNecessary() あるいは MaybeDoSomething() と命名するという慣習が広く見られます。
仕事で2種類のプロトコルを切り替えて通信するプログラムを書いていた。「初期化」→「通信」→「後始末」という流れの中で 「通信」にプロトコル A と B が存在しどちらも交換可能という仕様。A と B をアルゴリズムの違いと捉え Strategy パターンで設計を進めていた。しかし「初期化」の部分に A にだけ必要な差分処理があることに気づいた。
初期化は共通にしたかった。初期化の中で if(A) ならば…と書きたくない。Strategy の違いがカプセル化されてないじゃんとなってしまうからだ。かといって A の中に含めるのもしっくりこない。初期化だからだ。そんなとき今日読んだばかりの上記の if need be を思い出した。結局初期化を2つに分け片方を DoSomethingIfNecessary とすることでしっくりきた。
実は Strategy パターンを無理に当てはめるべきではない問題だったのかもしれない。Strategy パターンと IfNecessary。一見矛盾するがでもなぜかしっくりきた。