私は最近Elixirを学び始めましたが、私は本当にそれを楽しんでいますが、これまでに使ったことのある最初の関数型プログラミング言語です。私が直面している問題は、私がチュートリアルを通して読んでいたことと、LearnElixirでスクリーンキャストを見ていることが、IF
タイプのステートメントの使用を避けるべきだということです。早期返品の代わりに関数型プログラミング言語で関数を使用する方法
しかし、私は自分自身常にその先のコードが実行されませんように私は、ただの早期復帰ともしなステートメントを使用してGolangやJavaScriptなどの他の言語でこれらのソリューションを解決するだろうcond
またはcase
をネスト見つけ、これにより、99%の時間が、偽の値をチェックして戻って条件文を入れ子にしなければならなくなりました。
したがって、Elixir
(または他の関数型プログラミング言語)では、ネストを使用せずに、言語の機能を利用して、適切な方法で以下のような記述をどうしますか?
def loginPost(conn, %{"user" => user_params}) do
# Look for user in database
query = from u in User,
where: u.email == ^user_params["email"],
select: [u.email, u.username, u.password]
data = Repo.all(query)
# Check to see if a user had been found
case (length data) == 0 do
true -> # No user was found, send an error message
conn
|> json(%{ success: false, errors: ["Wrong username or password"]})
false -> # A user was found, compare password
[[email, username, db_password]] = data
case Comeonin.Bcrypt.checkpw(user_params["password"], db_password) do
true -> # Password was correct, set session and return a json response
conn
|> put_session(:authenticated, true)
|> put_session(:username, username)
|> put_session(:email, email)
|> json(%{success: true}) # Send json response and redirect on client side
false -> # Password was incorrect, send an error message
conn
|> json(%{success: false, errors: ["Wrong username or password"]})
end
end
end
end
私はなぜ避けなければならないのかについてより興味があります。ただ単に意味をなさないのです。どの言語でも、分岐はプログラムのビルディングブロックです。重要なプログラムのどこかに何らかの分岐が発生している必要があります。 – HuStmpHrrr
@HuStmpHrrr私がElixirのIRC/Slackで話したことのある人は、たいていネストしすぎると、ある機能であまりにも多くのことをやろうとしていて、別のものを書こうと思っているのです。 – Datsik
。すべての言語で適用されます。つまり、ネストされた構造を避けるためです。 fpでは、ループ構造がないので、批評家はすべて分岐を指します。私はポイントを参照してください。それはモジュール性に関するものです。何らかの理由で特定の構造を避けるだけでなく、私は 'if'が使われればこのコードが良くなると思います。 – HuStmpHrrr