ユーザーがログインするときのメソッドを実装してくれ、と依頼されたと考えよう。
メソッド名は LoginUser() だ。
このメソッドは、既に実装済みのデータアクセスメソッドを呼び出す。
データアクセスメソッドは、「データベースに接続できなかった」、「該当データが存在しない」の2つの例外を送出する。
「該当データが存在しない」は例外として扱うべきではない、と思ったので、実装者に文句を言ってやった。データが存在しない事は例外状況でないと。
ひと悶着あったが、結局、広く使われてるので今更変更できないと言われた。
自分はそんな間抜けな実装は絶対にしない。そう誓った。
LoginUser() はどのような例外を送出すべきなのか。
ログイン名が違う、パスワードが違う等は例外として扱いたくないので、戻り値で返すようにしたい。そこで「該当データが存在しない」の例外は catch して、戻り値を false として返すようにした。他の例外はそのままスルーだ。
bool LoginUser( string userName, string password )
{
try
{
データアクセスメソッド();
}
catch( 該当データが存在しない )
{
return false;
}
}
存分に使ってくれ、と LoginUser() を自信満々にクライアントに提供した。
しばらくして、LoginUser() のクライアントから「データベースに接続できなかった」という例外が出る、と文句を言われた。
そりゃそうだ。データベースに接続できなかったら例外が出る。そのように実装しているのだ。何が不満なんだ?
クライアントは、「ログインするときに、データベースを参照しているのか、ファイルを参照しているか、レジストリを参照しているかなんていう実装の詳細は知りたくないんだ」と言った。
一理ある。
そこでクライアントの不満を真摯に受け止め、LoginUser() を修正することにした。
つまり、データアクセスメソッドで発生する可能性のあるほかの例外「データベースに接続できなかった」を catch し、LoginUser() は「ログインエラー」という例外を送出することにした。
bool LoginUser( string userName, string password )
{
try
{
データアクセスメソッド();
}
catch( 該当データが存在しない )
{
return false;
}
catch( データベースに接続できなかった )
{
throw new ログインエラー();
}
}
ふむ。確かにこれはいい。実装の詳細は綺麗に隠されている。将来、データベースからファイルを使用するようになっても LoginUser() からスローする例外の種類を変更しなくていい。
存分に使ってくれ、と LoginUser() を自信満々にクライアントに提供した。
すぐに、クライアントから文句を言われた。
「ログイン失敗は、戻り値で見ればいいの?例外を捕まえればいいの?」
何てことだ。うっかりしていた。さらに、LoginUser() を修正することにした。
bool LoginUser( string userName, string password )
{
try
{
データアクセスメソッド();
}
catch( 該当データが存在しない )
{
return false;
}
catch( データベースに接続できなかった )
{
return false;
}
}
存分に使ってくれ、と LoginUser() を自信満々にクライアントに提供した。
しばらくして、クライアントから文句を言われた。
「ユーザー名もパスワードもあっているのに、何故か必ず戻り値が false になる」
デバックして原因を調べた結果、データアクセスメソッドから、「データベースに接続できなかった」例外がスローされている。
なるほど、例外を潰してしまったらエラーの原因が分らない。さらに、LoginUser() を修正することにした。
void LoginUser( string userName, string password )
{
try
{
データアクセスメソッド();
}
catch( 該当データが存在しない )
{
throw new ログインエラー( 該当データが存在しない );
}
catch( データベースに接続できなかった )
{
throw new ログインエラー( データベースに接続できなかった );
}
}
「ログインエラー」だけだと真の例外が分らないので、内部例外として真の例外の情報を持たせた。
存分に使ってくれ、と LoginUser() を自信満々にクライアントに提供した。
すぐに、クライアントから文句を言われた。
「ログインエラーは例外として扱うべきではないでしょ?」
データアクセスメソッドの作者の顔を思い出した…。