我一直认为明确命名我的集合变量是“最佳实践”。所以,如果我有一个Car对象的集合,我通常会命名为Car[]
carArray
和List<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
仍然是var
而cars
仍然是cars
。这似乎对我非常有吸引力,而且我很难看到很多劣势。
所以,只是为了确保我的问题清楚:你如何命名你的收集变量以及为什么?仅仅“复制”该项目的名称是否存在严重的可读性或清晰度成本?
答案 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)
我个人尽可能避免在变量名中使用集合的类型。它可能看起来不错,但这是一个不可执行的约束,其他开发人员将随着时间的推移而陷入困境。如果变量的类型对于特定操作非常重要,我会考虑将代码重写为...
或者换句话说,我不喜欢匈牙利的乐谱。
答案 4 :(得分:12)
我通常从多元化(例如汽车)开始。通常你也会有一个单数形式的局部变量(例如汽车),有时用两个非常相似的变量名读取代码会很尴尬,在这种情况下我会为其中一个变量找到一个新名称。
我几乎从不使用carArray,更可能是allCars,或者选择适当的汽车或其他适当的东西。
答案 5 :(得分:12)
喜欢汽车停放汽车,但汽车可能不是你想要的。哪辆车?
除了少数几种情况(总是有那些讨厌的例外),像汽车这样的变量名称不够具有描述性。
答案 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”之间的区别在于代码的自我记录性质。如果它被内置到名称中,则无需确定您正在使用的集合类型。在一个简单的程序中,它并不重要,但在更重要的事情上节省时间是重要的。