【发布时间】:2010-01-23 21:48:57
【问题描述】:
几年前曾经有过一场比赛,看谁能产生最模糊的 C 代码,其中一些结果非常难以理解。 C是这样的。你真的可以用预处理器搞砸事情。
但是,C# 的许多新功能为混淆代码提供了绝佳的机会。我想知道是否有人对在代码的简洁和清晰之间找到正确的平衡有意见。让我举一个例子来讨论,将项目填入ListView 的任务。 (是的,我知道您可以通过数据绑定来做到这一点,但请跟我来。)
控件是两列要填充的数组
struct Person
{
public string name;
public string address;
};
一个简单明了的方法是这样的:
private void Fill(Person[] people)
{
foreach(Person person in people)
{
string[] columns = new string[2];
columns[0] = person.name;
columns[1] = person.address;
ListViewItem item = new ListViewItem(columns);
listView1.items.Add(item);
}
}
清晰易懂。
我也可以这样写:
private void Fill(Person[] people)
{
foreach(Person person in people)
{
string[] columns = new string[] { person.name, person.address };
ListViewItem item = new ListViewItem(columns);
listView1.items.Add(item);
}
}
甚至:
private void Fill(Person[] people)
{
foreach(var person in people) // Note use implicit typing here
{
listView1.items.Add(new ListViewItem(
new string[] { person.name, person.address }));
}
}
最后,我也可以这样写:
private void Fill(Person[] people)
{
Array.ForEach(people, item =>
listView1.items.Add(new ListViewItem(
new string[] { person.name, person.address}));
}
每个人都或多或少地使用了该语言的各种新功能。您如何在简洁和清晰之间找到平衡?我们应该每年举办一次混淆 C# 比赛吗?
【问题讨论】:
-
不,但如果你想参加一场混淆的 perl 比赛,那可能会很有趣。
-
和“函数式编程”“最佳实践”标签适用于什么?
-
对不起,看不出有什么混淆,可能是我太习惯这种语言了
-
哦,我现在明白了。你认为这是“函数式编程”,因为
=>是一个活页夹。你刚刚绑定了item,后来又使用了person。 -
使用 lambda 函数是函数式编程的精髓。也许我可以写更多的例子,但 C# 3.0 的功能特性是经常出现复杂性和简洁性的地方之一。最佳实践,因为我的问题不是关于混淆(尽管有标题),而是关于在简洁和简单之间找到平衡。
标签: readability