引き続き、Elixir アンチパターンを読んでみます。
今日は、propagating-invalid-dataです。
エラーが発生してて、その個所はわかるんだけど、この原因がどこにあるのかわからない。こんな事ありますよね。
開発中なら、全体像がわかってるのですぐわかる場合も多いですが、運用中に発生したり、他の人が作ったものだったりするとほんと苦労します。安心して眠れません。
このアンチパターンは、そんな事態にならないようするのに役立つと思います。
foo()は引数をもっていて、この値をほかの関数に渡して、その結果を返しています。
defmodule MyLibrary do
def foo(invalid_data) do
# Some other code...
MyLibrary.Internal.sum(1, invalid_data)
end
end
foo渡すデータは整数である必要があるのに、文字列が渡されたとしたら、どうなるか。
MyLibrary.Internal.sumの中でエラーになります。
お勧めの実装は、
defmodule MyLibrary do
def foo(data) when is_integer(data) do
# Some other code
MyLibrary.Internal.sum(1, data)
end
end
foo()の引数の値が整数であることをguard節で明示しておきます。
これで、foo()を呼び出すところでエラーになります(fooでエラーが発生するのではなくその前の、本当の原因の所でエラーが発生します。
これで安心して眠れます。
契約プログラミングにつながる話でした。