Elixir アンチパターンを読んでみる
exception for control-flowを読んでみます
Exceptionを使う事自体はアンチパターンではないけど、
- Exceptionではなく、パターンマッチで記述する方法を好んだほうが良い
- ライブラリー開発の側の場合、Exceptionでしか異常時の処理を行えないライブラリーはアンチパターン。
Exceptionを使うコード
defmodule MyModule do
def print_file(file) do
try do
IO.puts(File.read!(file))
rescue
e -> IO.puts(:stderr, Exception.message(e))
end
end
end
パターンマッチを使うコード
defmodule MyModule do
def print_file(file) do
case File.read(file) do
{:ok, binary} -> IO.puts(binary)
{:error, reason} -> IO.puts(:stderr, "could not read file #{file}: #{reason}")
end
end
end
ファイルから読み込む関数はFile.read!とFile.readの二つがあり、前者はExceptionを発生させる。後者は、エラー時には{:error, reason}を返します。
Elixirのライブラリーなので当然、パターンマッチで判定できるタイプFile.read()が提供されていますね。
Pythonだと、戻ってくる値がエラーかどうかの判定の記述はせず、異常系の処理は例外で記述してみやすくなるので例外処理はよく使います。
Elixirでは、戻り値の判定がパターンマッチを使うことで、正常系の記述の邪魔する事なく書けるので事情が違いますね。
Exceptionは、Pythonのbreak的な事がしたくて、Exceptionを使った例を以前書きました。
https://qiita.com/GeekMasahiro/items/260b823e8defa42ccc15
Exceptionは、手続き型の言語に慣れてる人(私含む)には結構便利なんですよね。なにか処理を中断するときに使えたりして。
でもこの例外の発想は関数型と相性が悪いんだと思います。
パターンマッチを使いましょう。