可读性 a=b=c 还是 a=c; b=c;?

31

我有一个类,里面有一组整数,例如:

foo()
{
  int a;
  int b;
  int c;
  int d;
  ....
  string s;
}

现在的问题是为了最佳可读性,foo()函数的init()函数应该长成这样:

void init()
{
  a=b=c=d=1; //for some reason they are init to 1;
  s = "abc";
}
或者
void init()
{
  a=1;
  b=1;
  c=1;
  d=1;
  s = "abc";
}

在类中使用字符串的原因是为了暗示可能存在相同类型的其他组,并且当需求发生变化时,类可能会增长。

编辑:在这个问题走得太远之前,这个问题的目的很简单:在Effective C++ item 12(构造函数中优先使用初始化而不是赋值)中,Scott使用链式赋值而不是a=c; b=c;。我相信他知道何时使用什么,但我也记得我读过的书籍建议使用int a; int b; 在类似赋值情况下。在我的程序中,我有一个类似的情况,需要初始化一组相关的内置类型,并且我发现通过进行链式赋值可以使代码更易于阅读,尤其是如果类具有许多其他不同类型的实例变量。它似乎与我所读和记忆中的书籍相矛盾,因此提出了这个问题。


为什么不直接在构造函数中完成赋值任务呢? - Kaleb Brasee
@Kaleb,这是因为例如在C++中,初始化内置类型不会获得任何性能提升,如果类成员数量很大,那么代码将变得难以阅读和容易出错。或者你是指在构造函数中调用init()函数吗? - Yuan
@GMan 由于某些原因,它们不被优先放在数组中,因此才会有这个问题 :) 也许我选择的标签过于激进了,但你明白我的意思 :) - Yuan
@Yuan:是的,它们太过激进了,请修复它们。 - GManNickG
我有一个观点(如下面对其他主观评论所表达的)。但实际上,真正的答案完全是主观的。这取决于用户根据上下文来决定。因此,这个问题应该被关闭为主观。 - Martin York
显示剩余2条评论
3个回答

49

我碰巧更喜欢链式版本,但这完全是个人偏好问题。

请注意,

a = b = c = 0;

等价于:

c = 0;
b = c;
a = b;

而不是

a = 0;
b = 0;
c = 0;

(虽然哪个赋值先执行并不影响你)


2
如果您在多语言问题上进行此类断言,请指定它们适用的语言。我认为在Java中应该是c = 0; b = 0; a = 0;。(但只有在使用volatile变量时才能观察到差异。) - Paŭlo Ebermann
@Paulo:说得好。我特别列出了C++的行为,但我认为其他语言在这个领域保持兼容性。你说得对,如果一些变量是易失性的,那么b=cb=0之间的区别只有在这种情况下才有意义。我想表达的主要观点是,在a之前赋值给c,尽管除了易失性之外,这应该没有什么区别,因为编译器可以重新排序对普通变量的写入。 - Ben Voigt
1
如果你不得不指出赋值顺序不明显的事实,那么这应该是不建议使用它的一个理由。 - Martin York
@Martin:POD 的特性与此无关。一个类型可以是 POD,但仍然具有用户定义的 operator=。无论如何,如果 operator= 是用户定义的且不是 inline,编译器就无法重新排序,但在常见情况下重新排序是可能的。 - Ben Voigt
4
严格来说,在C#中,a=b=c=d;写法并不等同于c=d;b=c;a=b;的写法;当c是属性时(使用a=b=c=d;将不会调用它的get方法,但使用c=d;b=c;a=b;则会调用),这一点显而易见。 - Mr. Smith
显示剩余3条评论

31

我个人的偏好是使用a=b=c=d以达到以下目的:

  1. 它简洁,节省代码行数。
  2. 它传达了一个概念,即(a/b/c/d)被初始化为同一值,它们是相关联的。

然而,需要注意以下几点:

  1. 如果a/b/c/d没有关联(只是恰好初始化为1),请勿这样做。这将降低您代码的可读性。例如:

    a=c=1; // 与Foo函数相关

    b=d=1; // 与Bar函数相关

  2. 像这样链接赋值会减少您在未来分配不同初始值给变量时的灵活性--因为这时您将不得不再次分开它们。

尽管如此,我的个人建议是链式赋值那些在概念/用法上相关的变量。实际上,需要更改赋值的情况通常不会经常发生,因此第二个警告通常不会成为问题。

编辑:我的建议可能与已发布的指南相矛盾。请参见评论。


1
我通常会将变量逐行声明,否则一眼看不清每个变量的类型。然而,链式赋值传达了这些变量相关的信息,在可读性方面可能会有所帮助。 - Stephen Chung
6
为什么节省代码行是一件好事?清晰易懂最重要。每个赋值语句只有一行。你的报酬不是为了使其紧凑,而是为了使其易于理解/健壮和可维护。清晰易懂最重要。@Stephen Chung: 谁建议链式赋值?我读过很多编码指南,每一个都推荐完全相反的做法。 - Martin York
1
@Martin,我只是自己提倡这种写法。我并没有说它是任何标准推荐的。我个人认为,在相关变量上链接赋值比每行一个赋值更清晰/易读,因为它传达了这些变量是相关的(或具有类似的用途)的事实。 - Stephen Chung
@Margin,同时节省行数也有一些好处。它使得在一个屏幕上阅读更多的代码变得更容易(而不必滚动)。对于那些仍然通过打印源代码来杀树的人来说,这可能意味着需要打印多页还是只需几页。 - Stephen Chung
1
@Stephen Chung:关于“砍树”评论,那只是一个愚蠢的臆想。有很多关于使函数/方法简短的指南。在单行上使用多个赋值几乎不会在更大的上下文中产生影响。将其与代码清晰度降低相比,额外的纸张实际上会通过花费额外的电力来保持终端调试问题,从而为世界带来更多资源成本。请参见我在Ben Voigt问题上的评论,了解它为什么会导致问题。 - Martin York
显示剩余3条评论

8
我认为哪种写法更易读是一个主观看法问题。(否则你也不会问了。) 然而,Oracle的"Java编程语言代码规范"明确建议使用单独的赋值语句:
10.4 变量赋值。"避免在单个语句中将多个变量分配给相同的值。这很难阅读。"
我的意见?
1. 遵循项目规定/约定的样式规则,即使您不喜欢它们1。 2. 如果您的项目尚未制定/达成约定的样式规则: - 尝试说服其他成员采用最广泛使用的适用样式规则。 - 如果无法说服他们/达成共识,则为您为项目编写的主要代码块非正式地执行此操作1

1 ...或者滚出去。


1
遵循以下规定的样式规则或其他最广泛使用的规则,仅返回翻译后的文本:阅读易懂性总是一个观点问题,一致性比多样性更好。最终,一致性的熟悉度对人们来说更容易阅读。 - WhiteFang34

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接