有没有一种方法可以在Elixir中进行重构以使其更具可读性?
def validate(params) do
Repo.start_link
if validate_oauth_params(params) === true do
oauth_client = Repo.get_by(OauthClient, random_id: params["client_id"], secret: params["secret"])
if oauth_client != nil do
allowed_grant_types = Poison.Parser.parse!(oauth_client.allowed_grant_types)
if Map.has_key?(allowed_grant_types, params["grant_type"]) do
case params["grant_type"] do
"password" ->
process_password_grant(params, oauth_client)
"refresh_token" ->
process_refresh_token_grant(params["refresh_token"], oauth_client)
"client_credentials" ->
process_client_credentials_grant(oauth_client)
nil ->
%{message: "Invalid oauth credentials", code: 400}
end
end
else
%{message: "Invalid oauth credentials", code: 400}
end
else
%{message: "Invalid oauth credentials", code: 400}
end
end
Elixir的处理方式是什么,因为此代码看起来像PHP。我没有写。
最佳答案
您是对的,它看起来像PHP。不使用长生不老药的好处,例如模式匹配。
重构这一部分非常困难,因为似乎还应该重构其他方法,以使其更加简洁。例如,validate_oauth_params
函数“可以”返回一个元组而不是布尔值,因此您将对其进行模式匹配,并且将完成如下操作:
def validate(params) do
case validate_oauth_params(params) do
{:ok, params} -> choose_oauth_method params
{:error} -> handle_error "Invalid params"
end
end
defp choose_oauth_method(%{"grant_type" => "password"} = params) do
process_password_grant(params)
end
defp choose_oauth_method(%{"grant_type" => nil}) do
handle_error "Method undefined"
end
defp handle_error(msg), do: %{message: msg, code: 400}
defp handle_error(msg, code), do: %{message: msg, code: code}
defp handle_error(), do: %{message: "Default error massage", code: 400}
像这样,这根本不是工作代码,只是提供一个想法,模式匹配如何工作及其好处
关于elixir - 如何避免Elixir中的嵌套if语句?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37484862/