当前位置:  开发笔记 > 编程语言 > 正文

我如何优雅地检查Erlang中的许多条件?

如何解决《我如何优雅地检查Erlang中的许多条件?》经验,为你挑选了1个好方法。

因此,当用户发送注册帐户的请求时,他们会发送用户名,密码,电子邮件和其他信息.注册功能必须验证其所有数据.一个例子是:

验证未使用的电子邮件

验证用户名未使用

验证用户名是字母数字

验证所有字段长度超过X个字符

验证所有字段长度小于Y个字符

现在我不希望有5级深度if或case语句,但我还有其他选择吗?将它拆分成单独的函数听起来是个好主意,但是我只需要在某种条件下检查函数的返回值,它就会回到原来的问题.

我可以将它们分成函数,然后调用一个if语句与所有条件OR一起,但这不会给我我想要的东西,因为我需要能够告诉用户具体的错误,如果有的话.

如何在erlang中处理这种情况?是否有一个等价的return语句,或者它必须是函数中作为返回值的最后一个可执行行?



1> Hynek -Pichi..:

Joe Armstrong的建议之一:程序成功案例代码与错误处理分开.你可以这样做

create_user(Email, UserName, Password) ->
  try
    ok = new_email(Email),
    ok = valid_user_name(UserName),
    ok = new_user(UserName),
    ok = strong_password(Password),
    ...
    _create_user(Email, UserName, Password)
  catch
    error:{badmatch, email_in_use} -> do_something();
    error:{badmatch, invalid_user_name} -> do_something();
    error:{badmatch, user_exists} -> do_something();
    error:{badmatch, weak_password} -> do_something();
    ...
  end.

请注意,您可以执行create_user函数中捕获的所有错误,这样做会更好.

create_user(Email, UserName, Password) ->
    ok = new_email(Email),
    ok = valid_user_name(UserName),
    ok = new_user(UserName),
    ok = strong_password(Password),
    ...
    _create_user(Email, UserName, Password).

main() ->
  try
    ...
    some_function_where_create_user_is_called(),
    ...
  catch
    ...
    error:{badmatch, email_in_use} -> do_something();
    error:{badmatch, invalid_user_name} -> do_something();
    error:{badmatch, user_exists} -> do_something();
    error:{badmatch, weak_password} -> do_something();
    ...
  end.

模式匹配是Erlang最酷的事情之一.请注意,您可以将标记与badmatch错误联系起来

{my_tag, ok} = {my_tag, my_call(X)}

和自定义数据

{my_tag, ok, X} = {my_tag, my_call(X), X}

如果异常足够快,则取决于您的期望.我的2.2GHz Core2 Duo Intel的速度:一秒钟内大约有2百万个异常(0.47us),而成功(外部)函数调用达到600万次(0.146us) - 人们可以猜测异常处理大约需要0.32us.在本机代码中,它是6.8对47每秒,处理大约需要0.125us.try-catch构造可能会有一些额外的成本,在本机代码和字节代码中成功函数调用大约是5-10%.


答案为+1:在两本erlang书籍上都没有明确表示你可以在try/catches上放置多个表达式.Ty的信息!
推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有