如果我将我的数组,集合,列表,枚举等命名为它们包含的复数,那么坏事会发生在我身上吗?

时间:2009-08-31 20:55:32

标签: c# linq naming-conventions naming

我一直认为明确命名我的集合变量是“最佳实践”。所以,如果我有一个Car对象的集合,我通常会命名为Car[] carArrayList<Car> carList

然后99%的时间,我最终只是做了......

foreach (Car car in carArray)
{
    ...
}

......我在想,我本来可以调用数组cars,但它没有任何区别。

现在我们有IEnumberable<T>,我实际上面临的问题是我是否可以考虑写一些像carIEnumerable这样的东西?或carEnumerable。到目前为止,答案一直是“不”。

我的想法是,常常的集合类型并不重要,如果将集合类型写入变量名称仍然无关紧要。我只是遇到了一个必须从IEnumerable<Car>切换到List<Car>的情况,因为我需要对这些项目进行“括号访问”(例如carList[3])。在这种情况下,两个集合类型的行为不一样,但是命名变量cars在这里是个问题吗?

不要在这个问题上添加另一层复杂性,如果我使用var会发生什么?如,

var cars = GetCars();

我当然可以告诉cars是某种集合。我可以迭代它。如果我使用LINQ,我可以使用扩展方法。更重要的是,如果我后来更改了集合的类型,那么代码就会少得多。 var仍然是varcars仍然是cars。这似乎对我非常有吸引力,而且我很难看到很多劣势。

所以,只是为了确保我的问题清楚:你如何命名你的收集变量以及为什么?仅仅“复制”该项目的名称是否存在严重的可读性或清晰度成本?

12 个答案:

答案 0 :(得分:36)

var car = cars.Where(c => c.Name == "Robin Reliant");

可读性获胜。

因此我选择多元化。

善,

答案 1 :(得分:20)

这种命名的问题在于它过分关注实际的实现而不是属性的目的。您可以使用CarArray代替OwnedCars,或者告诉用户为什么会有枚举。

我认为在一个小foreach循环中命名循环变量“car”就好了。

如果您编写var cars = GetCars(),编译器会查看赋值右侧的类型,在本例中可能是IEnumerable<Car>,并为cars提供该类型。如果用鼠标悬停在变量上,您甚至可以在变量的后续使用中看到它。

如果您更改了集合的类型而不必因为使用var而更改代码,请考虑这些不同类型的集合可能具有一些共同点,使您能够执行对他们进行相同的操作。 如果你在IEnumerable循环中使用它们,可能是foreach

所以你也可以将这些集合公开为IEnumerable,这样你班级的用户就不会过分依赖某个实现。

答案 2 :(得分:12)

我从不喜欢“将变量的类型放在其名称中”的方法 - 我真的认为它干扰了源的顺利读取。我认为代码应该像故事一样阅读,因此对我来说,一组汽车(我不在乎它是否实现为数组,链表,堆,集或其他)的命名是完全合理的。 “汽车”:

foreach (Car currentCar : ParkingLog.getCars()) {
    stolenCars.add(currentCar);    
}

fencer.cars = stolenCars;

适合我。

答案 3 :(得分:12)

我个人尽可能避免在变量名中使用集合的类型。它可能看起来不错,但这是一个不可执行的约束,其他开发人员随着时间的推移而陷入困境。如果变量的类型对于特定操作非常重要,我会考虑将代码重写为...

  1. 不太关心具体的集合实施
  2. 使代码更简洁/更简洁,使变量的类型明确无误
  3. 或者换句话说,我不喜欢匈牙利的乐谱。

答案 4 :(得分:12)

我通常从多元化(例如汽车)开始。通常你也会有一个单数形式的局部变量(例如汽车),有时用两个非常相似的变量名读取代码会很尴尬,在这种情况下我会为其中一个变量找到一个新名称。

我几乎从不使用carArray,更可能是allCars,或者选择适当的汽车或其他适当的东西。

答案 5 :(得分:12)

喜欢汽车停放汽车,但汽车可能不是你想要的。哪辆车?

  • allCars
  • redCars
  • brokenCars
  • carsWith3Axels

除了少数几种情况(总是有那些讨厌的例外),像汽车这样的变量名称不够具有描述性。

答案 6 :(得分:5)

您当然不应该将类型名称添加为变量名称的一部分 - 几乎就是您提到的原因。就个人而言,如果我有一个Car对象的集合,我只是称之为收集汽车 - 复数传达的事实是不止一个没有透露类型,这是不必要的。

答案 7 :(得分:5)

作为学习的一部分,我一直在将包含变量类型的变量命名为变量。我可以在代码中的某个地方看到carArray作为提示,它是数组。但是你的问题提出了一个非常有效的观点,即如果你以后改变它,那么你必须追查所有这些引用,这可能是一个很大的噩梦。根据Matthew Vines的回答,“allCars”,“brokenCars”,我看到了命名变量的智慧。我想我会从现在开始更频繁地做这件事,因为我的编码有所改进。

答案 8 :(得分:3)

当维护导致您更改类型时,将集合类型放在变量名称中是一个问题。使用复数或类似'carColl'这样的通用更简单。它得到了重点,而不是未来的变化需要影响的东西。

答案 9 :(得分:2)

  

我在想,我可以   称为阵列车,它不会   没有任何区别。

不,不会对编译器产生影响,但使用描述性名称有助于提高可读性,可维护性和重用性。

在Visual Studio中,我可以快速找到数据类型。因此,我使用完整的描述性名称。复数很好。如果复数似乎很尴尬,那么我会附加清单或任何需要表明该变量包含“集合”的内容。

例如,carArray对我没有任何意义。 car是缩写吗?如果将carArray的实现更改为IList或IEnumerable Car对象,该怎么办?这是否意味着您更改变量的名称,或保留名称原样?想太多了。然而,我会理解Cars,CarListing,CarList,CarsByModel等等。

答案 10 :(得分:1)

我认为使用复数形式非常有意义,这就是我在代码中通常使用的方法。我从来没有发现将数据类型作为变量名称的一部分是有用的。

答案 11 :(得分:-4)

“cars”和“carArray”之间的区别在于代码的自我记录性质。如果它被内置到名称中,则无需确定您正在使用的集合类型。在一个简单的程序中,它并不重要,但在更重要的事情上节省时间是重要的。