可读性a = b = c或a = c; B = C;?

Yua*_*uan 26 c# c++

比方说,我有一个有一组整数的类

foo()
{
  int a;
  int b;
  int c;
  int d;
  ....
  string s;
}
Run Code Online (Sandbox Code Playgroud)

现在的问题是最好的可读性,foo()的init()函数,如果它看起来像

void init()
{
  a=b=c=d=1; //for some reason they are init to 1;
  s = "abc";
}
Run Code Online (Sandbox Code Playgroud)

要么

void init()
{
  a=1;
  b=1;
  c=1;
  d=1;
  s = "abc";
}
Run Code Online (Sandbox Code Playgroud)

类中字符串的原因是可能存在其他相同类型的组的提示,当然,类可能会随着需求的变化而增长

编辑:在这个问题走得太远之前,这个问题的意图很简单:在Effective C++第12项中(更喜欢初始化到构造函数中的赋值),Scott使用链赋值而不是a = c; B = C; 我确定他知道什么时候使用什么,但我也记得我读过的书也建议使用int a; int b; 在类似的作业情况下.在我的程序中我有一个类似的情况,需要初始化一组相关的单个内置类型,我发现通过使链分配确实使它更容易阅读,特别是如果类有许多其他不同类型的实例变量.它似乎与我读过的书和我的记忆相矛盾,因此这个问题.

Ben*_*igt 40

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

但请注意

a = b = c = 0;
Run Code Online (Sandbox Code Playgroud)

相当于:

c = 0;
b = c;
a = b;
Run Code Online (Sandbox Code Playgroud)

并不是

a = 0;
b = 0;
c = 0;
Run Code Online (Sandbox Code Playgroud)

(并不是说你先决定哪个分配对你来说很重要)

  • 严格来说,`a = b = c = d;`在C#中与写'c = d; b = c; a = b;`; 当`c`是一个属性时,这是显而易见的(它的`get`不会被调用`a = b = c = d;`但是它将带有`c = d; b = c; a = b`). (3认同)
  • 好的,(a = b)= c在c ++中是完全合法的 (2认同)
  • 如果您对多语言问题进行此类断言,请指明它们的有效语言.我认为在Java中它将是`c = 0; b = 0; a = 0;`相反.(但是,如果使用volatile变量,则只能观察到差异.) (2认同)

Ste*_*ung 27

我个人的偏好是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通常不会造成问题.

编辑:我的建议可能违反已发布的指南.查看评论.

  • 为什么储蓄线是好事?清晰是王道.每个作业一行.您不需要付费使其变得紧凑,您可以获得可理解/强大且可维护的报酬.清晰是王道.@Stephen Chung:谁建议分配任务?我读过的每个编码指南建议完全相反(我已经阅读了很多). (6认同)

Ste*_*n C 6

我想这是一个最具可读性的意见问题.(显然是这样......否则你不会问.)

但是Oracle的"Java TM编程语言代码约定"明确表示要使用单独的赋值语句:

10.4变量分配."避免在一个语句中将多个变量分配给相同的值.这很难读."

我的看法?

  1. 遵循您项目的规定/约定的样式规则,即使您不喜欢它们1.
  2. 如果您的项目(尚未)已订明/约定的样式规则:
    • 尝试说服其他成员采用最广泛使用的适用样式规则.
    • 如果你无法说服他们/达成共识,那么就为你为项目编写的主要代码块非正式地做这件事1.

1 ...或者出去