「がんばれない」けど「がんばりたい」

ITエンジニアの仕事のこと。AI、機械学習、ディープラーニング。地頭力。車のこと。

I like the with statement | Elixir

f:id:studio23c:20190304005349j:plain
It's been 3 months since I've start to write codes with Elixir.
Elixir itself is still minor language in Japan, So I'm feeling that I do not have anyone knows what is the best practice of the way in writing with Elixir.

Actually, just because it's for "job" make us being conscious to finish speedy first and we can not make some time for refactor our codes.
However, I personally want to write down about my knowledge that I currently think it is better or best way.

If you are also a Elixir Programmer or something, please comment me !

Elixirでコードを書き始めて3ヶ月。
まだまだ、マイナーなためか、
正しいベストプラクティスな書き方を共有できる人がいない。

実際、仕事なので、どうしても実装のスピードをあげるがために、
リファクタや、このあたりを考える時間が避けない・・

が、リファクタや、こういう観点のことって、
日時が経てば、変化していく。

今の時点で、こう書きたい・書いた方がいいよね。と、個人的に思うことを、
備忘のために書いていこうと思う。
世の中のElixirプログラマの方、情報よろしくです。

First blog about Elixir is "With Statement". My colleague started to study Elixir before I join this project, she often use if statement a lot, and that makes some nests.

まず第一弾は、with.

最初は、どういうところで使うのか、わからなかったが、
今となっては、これがないと、Elixirでコード書きたくなくなるくらい必要。

上述したように、先に勉強してくれてたベトナムの女性が書いてくれてたんだけど、
そのコードを見て真似するところからElixirを学び始めたんです。

ただ、福岡のコミュニティ( fukuoka.ex )で、ちょいちょい、
「for文やif文は、ほとんど使わない」ような話を耳にしていたんだが、
彼女のコードを見ていると結構使われてた。
まぁ、開発の方が優先なのでリファクタは後回しってことで、
やってくれてたので、仕方ないんですが・・

こんな感じでネストのあらしなんですね、

[だめコード]

def some_api(conn, param) do
    data = Repo(Table, id)
    if data != nil do
      hoge_id = Map.get(data, :hode_id)
      if hoge_id != nil do
        (will do something.)
      end
    else
      conn
      |> render "error.json", error: %{error_code: 10, message: "error message"}
    end
end


Yes, I know someone like this way....
But we use Elixir, so I personally do not like to use "Control or Condition Syntax" as possible.

Elixir has the with statement. ( I did not understand what for it at first. )
But now, I always use with statement when do something which needs some conditions passed.

否、こっちの方が、わかりやすい!っていう人も多いかもしれない。。
だけど、せっかく、関数型なんだし、制御構造は、あまり使いたくない。

そこで、僕は、こういう、何か条件が揃わないと結局、仕事が出来ない!みたいなものは、guard節が並べられるwithを使うようにしてます。


[おれ流]

def some_api(conn, param) do
  with data    when not is_nil(data)    <- Repo.get(Table, id),
       hoge_id when not is_nil(hoge_id) <- Map.get(data, :hoge_id)
  do
      (will do something)
  else
    _ ->
      conn
      |> render "error.json", error: %{error_code: 10, message: "error message"}
  end
end

あぁ、スッキリ。