为什么在while语句中不鼓励在Java语言中赋值?

问题描述 投票:3回答:3

我刚刚编码了下面的循环,效果很好:

let position = 0;
// tslint:disable-next-line:no-conditional-assignment
while ((position = source.indexOf('something interesting', position)) > 0) {
    // do something interesting with something interesting
  position += 1;
}

但是请注意,我必须添加tslint例外。显然有人决定不允许在内部使用赋值语句while有条件。但这是我所知道的最直接的代码模式特殊情况。

如果这不是“允许的”(或者我应该说“受挫的”),那该怎么办驾驶此代码的人认为正确的代码模式是?

javascript typescript tslint
3个回答
5
投票

这使代码的意图更加难以确定。将赋值用作表达式是unusual-如果在条件中看到赋值,您如何sure打算使用赋值的代码编写者,或者它是拼写错误?如果代码的编写者打算对值进行[[compare怎么办? EG

while ((position = source.indexOf('something interesting', position)) > 0) {
vs

while ((position == source.indexOf('something interesting', position)) > 0) {

这两个是

非常不同

。 (在这种特殊情况下,Typescript会警告您,将布尔值和数字进行比较可能是一个错误,但这在Javascript中不会发生,在其他情况下也不会发生。)对于上面的代码,不是在条件内分配,在条件外分配,甚至更好,您可以

可能

使用正则表达式(尽管在不知道// do something interesting with something interesting的内容的情况下无法确定地说) )。不幸的是,它看起来是重复的,但替代方法是

let position = 0; const getPos = () => { position = source.indexOf('something interesting', position); }; getPos(); while (position > 0) { // do something interesting with something interesting getPos(); }


3
投票
正如在亚当的示例中,无条件赋值的替代方案可能看起来像这样:

let position = 0; while (true) { position = source.indexOf('something interesting', position); if (position < 0) { break; } // do something interesting with something interesting position += 1; }

如果禁用curly,语法可能会变得更加紧凑,即使K&R Ch 3完全不要求使用这些花括号,该语法也会在curly /if/for/ do语句上加上花括号。总的来说,这需要就这些规则的动机进行很好的比较。 TSLint在while上定义其用途:

TSLint是可扩展的静态分析工具,用于检查TypeScript代码的可读性,可维护性和功能性错误。

是否完全可以正确使用无花括号its homepage语句,特别是如果您对缩进和格式进行了认真的研究?当然。但是,也完全有可能以一种微妙的方式

misuse该功能if

like in the docs for curly
您的问题假设“显然有人认为这是不可取的”,但更准确的说法是

此模式是跨代码库的重要bug来源,足以使curly的作者拥有为特定模式提供了内置的检测和反馈。该模式不是“不希望的”,“不是'允许的'”或“不鼓励使用的”,而只是足够少且容易被误用的模式,足以对其进行检测[默认为[打开]]。if (foo === bar) foo++; bar++; 中的所有规则一样,您可以使用tslinttslintconfigure the default rule set,并且您和您的团队可以选择禁用tslint.jsontslint.yaml之类的规则。如果这种情况在您的编码样式中常常是误报(似乎如此),或者将curly应用于该模式是常见且正确使用的现有代码库,则这可能特别有用。但是,我认为一个团队声称该模式容易出现no-conditional-assignment / tslint错别字和其他错误,并且正确使用不足以证明允许使用该模式是合理的(就像其他人在这个问题上所做的那样)。模式在他们的代码库中。

**:尽管K&R不需要大括号,但它确实在p56上指出:“缩进明确地显示了您想要的内容,但是编译器没有收到消息,并将=与内部==关联这种错误可能很难找到;在嵌套else时使用花括号是个好主意。”这表明,即使原始K&R文本也支持合理的样式规则或超出其语法支持范围的限制。


2
投票
然而,对于这种特殊情况,这是我所知道的最直接的代码模式。
© www.soinside.com 2019 - 2024. All rights reserved.