52
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[Ruby]ありえない分岐には雑にraise NotImplementedErrorを置いておくと便利

Last updated at Posted at 2022-02-03

2024/04/30追記

下記の記事にもある通り、 NotImplementedErrorは役割として適切ではないようです。
NoMethodErrorなどStandardErrorを継承したエラーを状況にあわせて適切に選択するのが良さそうです。

---追記ここまで---

下記の実装を見てください。
type1、またはtype2の2種類のタイプを持つhogeインスタンスがあり、タイプごとに処理を分岐しています。

case
when hoge.type1?
  # type1の処理
when hoge.type2?
  # type2の処理
end

タイプが2種類なのでこの実装で問題はないのですが、私はこういう分岐のelseにraise NotImplementedErrorを書いておくことが多いです。

case
when hoge.type1?
  # type1の処理
when hoge.type2?
  # type2の処理
else
  raise NotImplementedError
end

こうしておくと何が良いのか?
のちにtype3というタイプが増えたとします。
その時にtype3のテストパターンを追加すると思いますが、type3の場合はelseに入るためここを修正しないとテストが必ず落ちます。
最初の実装ではcase文がスルーされるのでテストの書き方次第ではここを修正しなくてもテストが成功してしまうかもしれません。

コードベースの大きなプロダクトでは、隅々まで影響範囲を調べるのは難しく、見落としてしまうことが多々あります。
そういう時に、後者の実装のようにテストで機械的に見つけやすくしておくことで、実装漏れを防ぎやすくなります。

おまけ: NotImplementedErrorとは?

現在のプラットフォームで実装されていない機能が呼び出されたときに発生します。

52
20
14

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
52
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?