Resharper提出让我转一圈:
foreach (JObject obj in arr)
{
var id = (string)obj["Id"];
var accountId = (double)obj["AccountId"];
var departmentName = (string)obj["DeptName"];
i++;
}...into a LINQ语句.我默许了,这产生了这样的结果:
int i = 1 + (from JObject obj in arr let id = (string) obj["Id"] let accountId = (double) obj["AccountId"] select (string) obj["DeptName"]).Count();天啊,把约沙法和天堂跳到摩尔加特!
这让我想知道,机器人变得比我聪明是否是件好事;这有多容易维护?答:它不是,因为我无法理解它;R#可能也把它转换成机器代码,尽管我能找到它。
不过,我不得不承认,这“很酷”。
在这种情况下,完美会在什么时候成为善的敌人?
在第二次遍历时,R#告诉我这行LINQ,“局部变量”"i“从未使用过
让它移除它,这条线变成:
var arr = JsonConvert.DeserializeObject<JArray>(s);嗯!这是不可能的;我以前把这些元素分解成单独的vars的原因是为了让我能够看到它们里面有什么:
MessageBox.Show(string.Format("Object {0} in JSON array: id == {1}, accountId == {2}, deptName == {3}", i, id, accountId, departmentName));...but用那个消息框评论掉了,我想上面的内容还是更好的。
发布于 2014-01-16 22:47:39
林克很强大。但是,我们应该时刻小心,不要跳下去。别误会我,我喜欢LINQ,在很多情况下,它是一个漂亮的工具。在你的例子中,你的代码是完全可读的,但是LINQ版本混淆了你的意图,程序员突然必须弄清楚到底是怎么回事。
你的版本是清晰的,简洁的,充满意图的。
相比之下,LINQ版本是一个令人厌恶的版本。
发布于 2014-01-16 22:43:39
我使用的一条经验法则是:“这段代码更容易阅读吗?”
重构可能一开始看起来很酷,它可能使用与您通常所做的不同的东西。然而,在一天结束时,你最好使用比计算机给你的“热”更容易理解的代码。
所以,如果一台电脑给我的代码是我很难快速摸索的,我可能会拒绝它的建议。
发布于 2014-01-17 05:58:16
自动重构工具不是自动化思维工具。仅仅因为您可以在一段代码上应用一些重构(您总是可以),并不意味着您应该这样做。千万不要仅仅因为工具暗示你就应该去做一些事情。您和您的团队负责决定哪些是可维护的,哪些是不可维护的。
尽管如此,自动化重构是很棒的,ReSharper可能是我使用过的最好的工具。重构工具可以节省大量时间,但它们不能使您免于思考:)
https://softwareengineering.stackexchange.com/questions/224448
复制相似问题