由Resharper代码build议使代码不易读?
当试图达到所有绿色,我收到了Resharper以下build议。
原始码:
static public string ToNonNullString(this XmlAttribute attr) { if (attr != null) return attr.Value; else return string.Empty; }
build议:删除多余的“其他”导致以下内容:
static public string ToNonNullString(this XmlAttribute attr) { if (attr != null) return attr.Value; return string.Empty; }
对我来说,build议的版本似乎不如原来的可读性。 Resharper的build议是否反映了良好可维护代码的定义?
技术上来说,Resharper是正确的,因为“其他”是不必要的,我更喜欢以前的版本,但意图更明显。
话虽如此,我宁愿与:
return attr != null ? attr.Value : string.Empty;
啊,代码美学。 圣战时间。 (鸭)
我会用一个?:expression式去:
return attr != null ? attr.Value : String.Empty
或者反转if并删除换行符以产生一个警戒子句 :
if (attr == null) return String.Empty; return attr.Value;
如果你反转if,我认为新版本好多了
static public string ToNonNullString(this XmlAttribute attr) { if (attr == null) return string.Empty; return attr.Value; }
由于您的原始版本太对称,而空案例是一个特例。
新版本在“大部分时间返回什么”方面更具可读性。
我同意你的代码的第一个版本更具可读性。
在这些案例中,我发现了Resharper的build议并不总是有帮助的,尽pipe有时它可以清理干净。 这就是为什么我已经configuration了Resharper,以显示更改为“提示”而不是“build议”。 这会导致绿色下划线变得不可见,并且不会在右侧边栏突出显示。
如果您不喜欢ReSharperbuild议的方式, 只需禁用特定的build议 (斜杠警告斜线提示)。 编码风格也是如此,我认为这是相当高度可configuration的 。 声称ReSharper是无法使用的(引用“我很高兴地说,它没有生存,没有人在这里使用它了”),只是因为你不花5分钟才能知道如何configuration它只是简单的愚蠢 。
当然,你不应该让某些工具指定你的编码风格的一部分,如果你不告诉它,ReSharper是不会这么做的。 就这么简单。
您的原始代码更具可读性和可理解性 – 一眼就可以看到导致string.Empty
返回的条件。 没有else
,你必须看到,在这之前, if
区块有一个回报。
只要记住,你是一个人,比机器本身更聪明。 如果它告诉你一些更好,你不同意,那么不要听它。
我的编码标准总是使用括号(即使if命令后只有一个指令)
这需要一些努力(更多的打字),但我经常相信,这是非常值得的!
最常见的错误之一(矛盾地难以find)是在if语句之后添加额外的指令并忘记添加括号。
所以我喜欢Resharper提出的。 特别是当嵌套if语句时:
假设我们有这样的代码:
if (condition1) { instruction1; } else { if (condition2) { instruction2; } }
它可以改变看起来像这样:
if (condition1) { instruction1; } else if (condition2) { instruction2; }
而且这对我来说更可读。
(当你有两个以上的嵌套语句时,它也会更明显)
我注意到了ReSharper的相同的东西,所以我很欣赏它能够closures某些项目或降级警告级别。 我也对这个build议感到困惑:
SomeClass varName = new SomeClass();
build议更改为:
var varName = new SomeClass();
是的,我知道我不需要最初的声明types,但是觉得这个var的forms比另一个更好 。 有人对这个build议背后的理由有所了解吗,或者你是否同意我的看法呢?
当您使用小样本大小时,经典的例外情况会蔓延到一切。 将一个巨大的if-elseif-else块重构成一个guard子句布局使得代码更具可读性,但是,正如你所说的,如果你将相同的规则应用于单个if-else,那么它就不是那么有用。 我甚至可以说这是一个(轻微)缺乏远见的,而不是跳过像这样的非常小的块,这是无害的。
成为C#的noob,更习惯于C和Java我还是不习惯在C#.NET和VS中使用尖括号。 把所有这一切放在一边,我同意安德烈在反转“如果”更可读。 另一方面,我个人发现,省略“其他”会降低可读性(略)。 我会亲自去:
static public string ToNonNullString(this XmlAttribute attr) { if (attr == null) return string.Empty; else return attr.Value; }
我所添加的唯一的东西将不得不涉及expression式的长度。 就我个人而言,我喜欢三元expression式的紧凑性,但是转向类似的东西
if (testDateTime > BaseDateTime) return item.TransactionDate <= testDateTime && item.TransactionDate >= BaseDateTime; return item.TransactionDate >= testDateTime && item.TransactionDate <= BaseDateTime;
变成类似的东西
return testDateTime > BaseDateTime ? item.TransactionDate <= testDateTime && item.TransactionDate >= BaseDateTime : item.TransactionDate >= testDateTime && item.TransactionDate <= BaseDateTime;
对我来说真的不是很有帮助
当谈到最佳实践和编码标准时,它总是有争议的。 其中一个原因是无法使用Visual Studio等IDE轻松实施。 有像FxCop和StyleCop这样的工具可以用来分析标准的代码。 FxCop用于编译代码分析,StyleCop用于源代码分析。
您可以将StyleCopconfiguration为一个分钟级别,以确定要应用于代码的格式。 还有一个名为StyleCop的插件,用于在Visual Studio中提供Suggessions。 在http://nileshgule.blogspot.com/2010/10/refactoring-clean-code-using-resharper.html上有详细的博客文章;
resharper版本更好,因为'attr!= null'条件可以被看作是一个早期的救援(或用例exceptionpath),允许函数继续执行其主要任务。 (既不赢得高五,我讨厌多重回报)。
在这种情况下,我会说MrWiggles单线是最好的select。
我的一些同事从那个时候开始在他们编辑的页面上使用了Resharper,在布局和可读性方面都很糟糕。 我很高兴地说,它没有生存,没有人在这里使用它了。
关于手头上的声明,我同意Jeffrey Hantin,内联 – 如果这样的声明非常好,Whatsit的解决scheme是非常适合的。 除了一些例外,我(personaly)说,方法/函数应该只有1个返回语句。
另外,如果你(几乎)总是用你的if来实现else(即使它只是一个注释行,说明你对else语句没有做任何事情),它会迫使你考虑这种情况,通常它可以防止错误。
这两种说法都应该用作“思考”,不像大多数这样的问题,总是用你的大脑:)大多数错误发生在你不这样做的时候。
总之:对Resharper说不! (是的,我真的不喜欢Resharper,对不起。)