9
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ElixirAdvent Calendar 2023

Day 22

【Elixir アンチパターン】 Exceptionより、パターンマッチ

Last updated at Posted at 2023-12-21

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は、手続き型の言語に慣れてる人(私含む)には結構便利なんですよね。なにか処理を中断するときに使えたりして。

でもこの例外の発想は関数型と相性が悪いんだと思います。
パターンマッチを使いましょう。

9
0
0

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
9
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?