久々のレビューで指摘された内容をそのまま放流するシリーズ。まとめページ もあります。
実装をしていると「今回はロジック部分を実装しないけどメソッドだけは用意しておく」のような場面はないでしょうか?
例えば、テンプレートメソッドパターンで実装する必要があるが現時点でテンプレート側にあるメソッドをすぐに使うことがないケースなどが考えられます。
例(メソッド自体が微妙なのはご了承ください。良い例が思い浮かばず…)
// 抽象クラス
abstract class AbstractClass
{
// コンソールに何らかの情報を表示するメソッド
// 実装はサブクラスに任せる
protected abstract void Print();
// ログを記録するメソッド
// 実装はサブクラスに任せる
protected abstract void Log();
}
// サブクラス
class SubClass : AbstractClass
{
protected override void Print()
{
Console.WriteLine("ここは実装したよ");
}
protected override void Log()
{
// 現状使っていません。後々実装予定です。
}
}
上記のように、今まで私はロジック部分の実装がないときは、コメントで「現状使っていません。後々実装予定です。」のように書いていました。また、返り値を返すメソッドの場合は通常取りえないダミー値を返していました。
そんなコードを書いていたら、 NotImplementedException を教えてもらいました。
NotImplementedException をスローすれば未実装であることが明確に分かる例外が発生するので、万が一中身を実装していないメソッドが使われた場合に気づくことができます。
NotImplementedException を使った場合
// サブクラス
class SubClass : AbstractClass
{
protected override void Print()
{
Console.WriteLine("ここは実装したよ");
}
protected override void Log()
{
// 現状使っていません。後々実装予定です。呼び出すとエラーが発生します。
throw new NotImplementedException();
}
}
余談
この記事を書くために NotImplementedException について調べていたら、VisualStudio の機能でメソッドを生成すると、デフォルトで NotImplementedException をスローするコードが作成されることを知りました。
なので普段から VisualStudio を使っている人からすると、この記事の内容はすごく当たり前の内容なっているかもしれません。
私は VisualStudio から逃げた人間なので知りませんでした…。(neovim で実装しています。)さすがにC#を生業とするなら VisualStudio を使えないのはまずいだろうと感じている今日このごろです。