【问题标题】:Readability a=b=c or a=c; b=c;?可读性 a=b=c 或 a=c; b=c;?
【发布时间】:2011-03-21 02:12:01
【问题描述】:

我有一个类,它有一组整数,比如说

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;诠释 b;在类似的分配情况下。在我的程序中,我有类似的情况需要初始化一组相关的单个内置类型,我发现通过进行链式赋值确实更容易阅读,特别是如果该类有许多其他不同类型的实例变量。这似乎与我读过的书和我的记忆相矛盾,因此提出了这个问题。

【问题讨论】:

  • 为什么不在构造函数中做赋值呢?
  • 哪种语言?你不是在这三个方面都在编程。也许abcd 应该是数组中的元素。
  • @Kaleb ,这是因为例如在 c++ 中,初始化内置类型不会获得任何性能,并且如果类成员的数量很大,它将变得难以阅读并且容易出错。还是您的意思是在构造函数中调用了 init()?
  • @GMan 出于某种原因,他们不喜欢在数组中,因此问题:) 也许我选择标签过于激进,但你明白了 :)
  • @Yuan:是的,他们太激进了,请修复他们。

标签: c# c++


【解决方案1】:

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

但请注意,

a = b = c = 0;

相当于:

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

而不是

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

(并不是说首先发生哪个分配对您来说很重要)

【讨论】:

  • 如果您对多语言问题进行此类断言,请指定它们对哪种语言有效。我认为在 Java 中应该是 c = 0; b = 0; a = 0;。 (不过,只有使用 volatile 变量才能观察到差异。)
  • @Paulo:好点。我专门列出了 C++ 的行为,但我认为其他语言在这方面保持兼容性。你说得对,b=cb=0 仅在某些变量是 volatile 时才重要,我的主要观点是 ca 之前被分配,尽管除了 volatile 之外这应该会有所不同,因为编译器可以对普通变量的写入进行重新排序。
  • 必须指出分配顺序不明显,建议不要使用。
  • @Martin:同样,除非某些变量是易失的,否则编译可以重新排序分配。因此,哪种顺序真正“等价”更像是迂腐的问题。
  • 严格来说,C#中​​的a=b=c=d;和写c=d;b=c;a=b;是不一样的;当c 是一个属性时,这一点很明显(它的get 不会被a=b=c=d; 调用,但它会被c=d;b=c;a=b 调用)。
【解决方案2】:

我个人的偏好是a=b=c=d,原因如下:

  1. 简洁,省线
  2. 它传达了一个概念,即 (a/b/c/d) 被初始化为相同的事物,它们是相关的

但是,请注意:

  1. 如果 a/b/c/d 不相关(并且恰好被初始化为 1),请不要这样做。您将降低代码的可读性。示例:

    a=c=1; // Foo-function related

    b=d=1; // Bar-function related

  2. 像这样的链式赋值会降低您将来为变量分配不同初始值的灵活性——因为那样您就必须再次分解它们。

不过,我个人的建议是在概念/用法上相关的变量上进行链式赋值。在实际实践中,更改分配的需求通常不会经常出现,因此警告 #2 通常不会造成问题。

编辑:我的建议可能会违反已发布的指南。见 cmets。

【讨论】:

  • 我更喜欢 a=b=c=d 但我记得当我声明变量时,说 int a; 很好;诠释 b;而不是 int a,b;没有?
  • 我一般是每行声明一个变量,否则一目了然每个变量的类型是什么。然而,链式赋值传达了变量相关的信息,这在可读性方面可能是值得的。
  • 为什么省线是件好事?清晰为王。每个作业一行。您无需支付报酬以使其紧凑,而是支付报酬以使其易于理解/健壮和可维护。清晰为王。 @Stephen Chung:谁建议链接作业?我读过的每条编码指南都建议完全相反(我读过很多)。
  • @Martin,我只是自己提倡。我没有说它是按任何标准推荐的。我个人认为 related 变量上的链接赋值比每一行上的一个赋值提供了更多的清晰度/可读性,因为它传达了这些变量是相关的(或类似用法)的事实。
  • @Stephen Chung:关于杀戮的评论。那只是一个愚蠢的虚构。有很多关于使函数/方法简短的指南。在单行上使用多个赋值几乎不会在更大的上下文中产生影响。将这一点与代码清晰度的降低相权衡,额外的一页纸实际上将花费世界更多的资源,因为要花费额外的电力来保持终端调试可能与之相关的问题。请参阅我对 Ben Voigt 问题的评论,了解它为什么会导致问题。
【解决方案3】:

我想这是一个最易读的意见问题。 (显然是这样......否则你就不会问了。)

但是 Oracle 的 "Code Conventions for the Java TM Programming Language" 明确表示要使用单独的赋值语句:

10.4 变量赋值。 “避免在单个语句中将多个变量分配给相同的值。这很难阅读。”

我的意见?

  1. 即使您不喜欢它们,也要遵循项目规定/约定的样式规则1
  2. 如果您的项目(还)没有规定/同意的样式规则:
    • 尝试说服其他成员采用最广泛使用适用的样式规则。
    • 如果您无法说服他们/达成共识,那么只需非正式地为您为项目编写的主要代码块执行此操作1

1 ... 或者滚出去。

【讨论】:

  • +1 遵循规定的样式规则或遵循最广泛使用的规则。可读性始终是一个意见问题,一致性优于多样性。最终,人们对一致性的熟悉度变得更易读。