使用“?”是一种不好的做法。在 Racket 方法名称中?

Posted

技术标签:

【中文标题】使用“?”是一种不好的做法。在 Racket 方法名称中?【英文标题】:Is a bad practice to use "?" in a Racket method name? 【发布时间】:2021-05-31 06:39:13 【问题描述】:

上周我进行了一次球拍考试,我使用问号符号命名了一些考试方法(例如“属于?”、“发烧?”等)。但是当他们给我结果时,我的一位教授告诉我使用“?”是一种不好的做法。在方法中我使用它的方式,我不明白,因为球拍中的很多方法最初都是这样调用的。

所以我的问题是:这真的是一种不好的做法吗?如果这是一个不好的做法,为什么球拍要使用它?

【问题讨论】:

在没有提供理由的情况下说某事是一种不好的做法并不是一个真正有效的论点。问问你的教授为什么这是一种不好的做法。 你能解释一下你的方法是做什么的吗?正如 ad absurdum 所提到的,它们可能不是谓词。 【参考方案1】:

在 Scheme 和 Racket 中,谓词 过程都以? 结尾是惯用的。由于与此类程序相关的历史和惯例存在某些期望,因此偏离该惯例被认为是不好的做法。 Scheme 标准甚至有语言形式化了这种做法 (R6RS 6.7 Naming Conventions):

按照惯例,谓词的名称——总是返回一个 布尔值——以“?”结尾当名称包含任何字母时; 否则,谓词的名称不以问号结尾。

现在,在 Scheme 和 Racket 中,谓词 是一个始终返回布尔值的过程,即 #t#f。如果被批评的过程并不总是返回#t#f,那么它们不符合谓词命名约定的模型。如果不是这样,如果没有看到实际定义,就很难知道它们是如何不足的。

member 是一个可以用作“谓词”的 Racket 过程的示例,但实际上并不是按照惯例或规范语言的谓词。如果寻找的值不是列表的成员,此过程返回#f,但如果它是列表的成员,则返回以寻找的值开头的列表尾部(此列表尾部是真值,但不是布尔值#t)。请注意,member 不以问号结尾。如果 OP belongs? 的行为类似于 member,那么教授将这种命名归类为不好的做法当然是正确的。

请注意,其他 lisp 对谓词有不同的约定。例如,在 Common Lisp 中,在谓词名称中使用?传统的(并且不被认为是一种好的做法)。

【讨论】:

你是对的,我没有提到返回值是什么。而我只使用“?”当方法返回布尔值时,即#t 或#f。感谢您的观察。【参考方案2】:

根据 Racket 代码库自己的 Style Guide 谓词和布尔值函数应该以 ? 结尾。 belongs?has-fever? 似乎符合这个要求,所以我怀疑这取决于你教授的口味。

【讨论】:

以上是关于使用“?”是一种不好的做法。在 Racket 方法名称中?的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript:动态扩展原型是一种不好的做法吗?

使用没有花括号的 if 语句是一种不好的做法吗? [关闭]

Flutter BLoC:使用嵌套的 StreamBuilders 是一种不好的做法吗?

SQL-'08:多个 Replace 语句是一种不好的做法/是不是有另一种方法来编写此查询?

使用隐式枚举字段来表示数值是一种不好的做法吗?

在 C 中使用 short 是一种不好的做法