问题标签 [guard-clause]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
70 浏览

ruby - Guard Clauses and the Single Responsibility Principle (SRP)

Currently reading the fantastic book 'Practical Object Orientated Design In Ruby' and working through a simple kata to really practice some of the principals it discusses.

I have a method that does the following:

This 'releases a bike object' from my DockingStation class (I am aware that the bike object should be an argument, but for the time being I just want the method to return the bike object, not remove it).

The #capacity_empty_error does the following:

And #empty? looks like:

Where bike is a wrapper method for my instance variable @bike. The current capacity of the the DockingStation class is therefore 1, since the code assumes it is full when #bike is set to something (I plan to add proper capacity later).

So hopefully that explains my code, please ask questions and suggest improvements if not, the question I want to ask is:

I feel that the guard clause line in #release_bike:

capacity_empty_error if empty?

is one responsibility for the method and the return of bike on the next line down is a second responsibility. Tis then obviously breaks SRP, but I cannot see how to use a guard clause except as adding it to an existing method as a second responsibility.

Can it be done? How have others achieved it?

0 投票
3 回答
9535 浏览

ruby - 提前返回 vs if 在 ruby​​ 代码中

我看到两种写同一件事的方式:

对比

哪一个更正确/更可取/遵循最佳实践?还是没关系?

0 投票
1 回答
174 浏览

c# - 保护检查 lambda

我通常像这样执行警卫检查:

我已经看到了这个额外的检查,它确保谓词实际上是一个 lambda:

ExpressionType枚举有很多可能性,但我不明白它们中的任何一个将如何应用,因为我假设编译器只允许 lambda 。

Q1:这样做有好处吗?我们对所有输入进行彻底的警戒检查,这是否增加了价值?

Q2:是否存在性能损失 - 即它是否比常规类型/边界/空检查花费更长的时间?

0 投票
4 回答
5301 浏览

f# - 与空序列匹配

我正在学习 F#,并且我已经开始使用序列和match表达式。

我正在编写一个网络爬虫,它通过类似于以下内容的 HTML 进行查看,并<span>在该类的父paging级中获取最后一个 URL。

我尝试获取最后一个 URL 如下:

但是,当我正在搜索的课程不在页面上时,我遇到了问题。特别是我得到 ArgumentExceptions 的消息:Additional information: The input sequence was empty.

paging我的第一个想法是构建另一个匹配空序列并在页面上找不到类时返回空字符串的函数。

我现在的问题是这Seq.Empty不是文字,不能在模式中使用。大多数具有模式匹配的示例[]在其模式中指定了空列表,所以我想知道:如何使用类似的方法来匹配空序列?

0 投票
2 回答
277 浏览

list - F#将函数作为匹配函数中的参数

我制作了一个函数,它接受一个列表和一个列表并返回一个新的列表列表。

validate 是一个返回两个元组整数的函数。示例 (1,1)

list 是四个整数的列表

SS 是具有四个整数的列表列表

theCode 是四个整数的列表

我收到错误“未定义模式鉴别器'验证'。”

也许这是一个愚蠢的问题,但我仍然不知道答案。

是否不允许在匹配表达式中使用函数作为参数。还是这里发生了完全不同的事情?

据我所知,这两个验证函数将返回两个元组整数,因此应该能够匹配。

0 投票
2 回答
399 浏览

f# - 当两个模式共享一个“when”子句时,模式匹配不完整

对于 F# 初学者来说,一个常见的惊喜是以下内容不完全匹配:

但我刚刚遇到了一个让我吃惊的情况。下面是一小段示例代码来演示它:

这个版本的describe函数产生了“在这个表达式上不完整的模式匹配”警告,即使模式匹配实际上是完整的。没有可能的树不会被该模式匹配匹配,这可以通过删除when其中包含表达式的匹配的特定分支来看出:

此版本为和树describe返回“普通树”字符串。saplingtwoLeafTree

match表达式只包含when表达式的情况下(如第一个示例,其中xy正在被比较),F# 编译器可能无法判断匹配是否完成是合理的。毕竟,x并且y 可能是具有比较和相等的“奇怪”实现的类型,其中这三个分支都不为真。 *

但是在像我的describe函数这样的情况下,为什么 F# 编译器不查看模式,说“如果所有when表达式评估为false,仍然会有完全匹配”并跳过“不完全模式匹配”警告?此处出现此警告是否有某些特定原因,或者只是 F# 编译器在这里有点简单化并给出误报警告,因为它的代码不够复杂?

* 事实上,可以设置xy的值,使x < yx = yx > y都为假,不会超出标准 .Net 类型系统的“正常”界限。x作为一个特殊的奖励问题/谜题,和的这些值是y什么?不需要自定义类型来回答这个难题;您所需要的只是标准.Net 中提供的类型。

0 投票
2 回答
1930 浏览

haskell - 保护语法中的逗号有什么作用?

在我正在阅读的代码库中,我发现了这样的函数声明(缺少某些部分):

逗号在这里有什么作用?

(只是作为奖励,如果有人很容易知道这一点:Haskell Programming from first principle中是否提到了这种语法,如果是,在哪里?因为我不记得读过它。)

0 投票
1 回答
833 浏览

design-patterns - 抛出异常的“守卫”方法是一种好习惯吗?

下面的代码会被认为是“好”的做法吗?

它是包的 RPC 端点的控制器。这个想法是轻松覆盖/扩展包含该包的特定项目的验证或授权。

你能说这些是保护条款或方法吗?拥有一个唯一目的是检查某些东西并在出现问题时抛出异常的方法是个好主意吗?

代码对我来说看起来很干净,但我想得到一些建议:)

0 投票
4 回答
527 浏览

scala - Raku 中的模式匹配是否有保护条款?

在 scala 中,pattern matchguard pattern

Raku版本是这样的吗?

这是正确的吗?

更新:正如jjmerelo 所建议的,我将我的结果发布如下,签名版本也很有趣。

0 投票
2 回答
146 浏览

elixir - 使用保护子句自省函数

给定一个具有两个具有相同数量但不同保护子句的函数的模块,我如何(理想情况下)查看这些子句是什么,或者至少有两个函数?

Test.__info__(:functions)不起作用,因为它只会返回[greet: 1]