警卫声明被低估

前几天,当我与一个朋友谈论函数式编程时,我意识到我们经常只喜欢讨论性感的东西,而对其他简单的东西没有给予足够的重视。 在Swift中, guard声明是我认为功能非常强大但没有得到编程社区足够重视的小功能之一。

Guard不仅是if !condition语句的语法糖。 考虑以下代码。

 如果!loading { 
加载()
}

如果当前状态未加载,它将加载。 但是我们可以更好地编写如下:

 如果正在加载{return} load() 

当前状态加载时返回。 它更干净,我们能够从花括号中取出load() 。 并且请注意,上面的if语句不只是if 。 如果是特殊的,用于提早返回。 它应该拥有自己的语法。 从版本2开始,Swift为此提供了guard声明。

 警卫!loading else {return} load() 

确保当前状态未加载,否则返回。 如果错过了return ,编译器将抱怨。 与使用if语句的版本相比,它更容易理解,因为它使用特殊的条件语法。 我们马上就知道那条线是干什么的。

警卫队要早日返回。 通常,我们将它们放在函数的顶部。 但是, guard声明并不公平,因为对我们大多数人来说,这只是一个条件声明。 但是我认为, guard应该得到更多的荣誉。 考虑以下代码。

 守护!loading else {return} 
警卫!渲染其他{返回}
卫队个人资料已加载其他{返回}
警卫文章已加载其他{返回}
警卫评论加载其他(返回)
守卫likesLoaded else {return}
render()

以上代码在控制器中非常常见。 控制器通常是最复杂,最难阅读的。 想象一下:当控制器从服务器加载数据时,可能会发生很多事情,例如,推送通知到达,按下后退按钮,按下主屏幕按钮进入背景,设备旋转,无意间轻按了随机按钮,网络中断等等。 所有这些都应该得到妥善管理,这非常困难。 这就是为什么控制器非常丑陋的原因。 但是guard声明使它更令人恶心!

说到尽早返回,它将使您想起REST服务器中熟悉的中间件模式。 HTTP请求通过服务器上的几个中间件进行。 假设请求带有签名GET /users 。 首先,路由中间件将其拾取以检查/users端点是否存在。 如果不是,则以404 Not Found状态返回。 但是,如果存在,请继续验证中间件。 如果身份验证失败,则返回401 Unauthorized 。 但是,如果成功,请继续授权中间件。 以此类推,直到最后一个中间件从数据库加载用户列表并返回时为止。

还有其他几种实现了guard语法的语言。 我不确定它们是否具有相同的语义。 但是,如果您的语言没有guard声明,我会对您不利。


最初发布在 www.texthard.com