缩进组变量函数调用的代码约定

6

我有这样一种习惯,像这样缩进一组函数调用:

List <Dog> dogs = new ArrayList<>();
   dogs.add(new Dog(1));
   dogs.add(new Dog(2));
   dogs.add(new Dog(3));
   dogs.add(new Dog(4));
   dogs.add(new Dog(5));
System.out.println("list of dogs: " + dogs);
Cat cat1 = new Cat(1);
   cat.meow();
   cat.startsRunningFrom(dogs);
Dog d1 = dogs.get(1);
d1.catches(cat1);

这些是否真的是代码规范中的不良实践,或者这些实践并没有被广泛讨论?因为我尝试寻找一些代码规范,会建议在从某些变量/类调用函数时进行此类缩进。

对我来说,上面的代码比没有缩进的代码更易读:

List<Dog> dogs = new ArrayList<>();
dogs.add(new Dog(1));
dogs.add(new Dog(2));
dogs.add(new Dog(3));
dogs.add(new Dog(4));
dogs.add(new Dog(5));
System.out.println("list of dogs: " + dogs);
Cat cat1 = new Cat(1);
cat.meow();
cat.startsRunningFrom(dogs);
Dog d1 = dogs.get(1);
d1.catches(cat1);

对我来说,缩进可以清晰地区分变量声明和其他函数操作,紧接着是与该变量紧密相关的后续操作。

有人能否就为什么这是一种不好的做法发表评论,或者是否通常可接受(在提供的代码之外,例如列表操作)。

3个回答

2
我很欣赏你的想法,我不认为你所做的事情本质上有什么不好的地方。但事实上,在多个开发人员将在同一代码上工作的组织中,拥有一致的样式规则非常重要。具体规则会因组织而异,或者在组织内的团队之间也可能有所不同(在我工作的地方,不同的团队可能采用不同的样式,尽管它们不会有根本性的不同)。但是,当涉及到缩进、空格、换行等问题时,一致的风格通常比你认为更合理的方式带来的任何好处都更有益。我有时不喜欢强加给我的样式选择,但在这种情况下争论并不值得。但是,如果你在一个团队中,你可以试着说服他们你的样式更好。然而,按照你的方式做的一个缺点是,IDE可以编程一个更简单的规则集,然后根据你的团队的样式自动排版。
在这种情况下,如果你试图使用缩进来表示某些代码块彼此相连,我建议你将它们移动到它们自己的辅助方法中。这将实现我认为你想要做的事情。
此外,如果您有一个列表并向其添加多个项目的情况下,您应该考虑使用Google Guava,它具有一些方法可以通过调用带有可变数量参数的函数来设置列表(例如Lists中的newArrayList)。

2
这些是代码规范中的不良实践,还是这些实际上没有被讨论过?这要看情况!如果你在开源项目上工作,那么你必须遵守准则。除非你的同事认可,否则没有好坏之分。事实上,我们团队所有人都使用代码格式化程序,并有一套预定义的注释和空格等规则。我们试图遵循相同的规则,以便在将代码合并回主存储库时易于发现差异。另一件事是,我已经习惯了看到普遍接受的约定,下面的代码片段误导我假设一个块的开始和结束。
List<Dog> dogs = new ArrayList<>();
----> dogs.add(new Dog(1));
      dogs.add(new Dog(2));
      dogs.add(new Dog(3));
      dogs.add(new Dog(4));
      dogs.add(new Dog(5)); <----
System.out.println("list of dogs: " + dogs);

使用这样的惯例并没有什么坏处,但正如我之前所说的那样,它应该被你所工作的环境中的同行所接受。


我同意这是一个基于观点的问题,但我只是想知道它是否真的是一种应该在几乎所有情况下避免的不良实践。你关于它看起来像是在代码块中的评论正是我所需要的,无论它是否真的低效或可能导致错误。 我认为我的缩进就像虚拟代码块一样。所以我想这并没有什么大问题。谢谢。 - gnomeria

1

这有点是个观点问题/由团队决定。然而,我同意你的缩进比没有缩进好。我认为两者都不是最好的解决方案。这样怎么样:

List<Dog> dogs = initializeDogs();
System.out.println("list of dogs: " + dogs);
initializeCat(dogs);
Dog d1 = dogs.get(1);
d1.catches(cat1);

接下来声明辅助方法以完成所需的操作:

private ArrayList<Dog> initializeDogs() {
 ArrayList<Dog> dogs = new ArrayList<>();
 dogs.add(new Dog(1));
 dogs.add(new Dog(2));
 dogs.add(new Dog(3));
 dogs.add(new Dog(4));
 dogs.add(new Dog(5));
 return dogs;
}

private void initializeCat(List<Dog> dogs) {
 Cat cat1 = new Cat(1);
 cat.meow();
 cat.startsRunningFrom(dogs);
}

重点在于如果您使用最佳实践封装方法,可能不需要您的缩进约定。

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