繁体   English   中英

与IntelliSense配合使用的命名约定

[英]A naming convention that works with IntelliSense

我开始命名我的类即时变量,如下所示:

    Car car;

原因是我认为汽车是变量的完美描述,我不需要添加额外的信息。

这对我很有用,我很高兴,但有一个问题让我发疯。 如果我想做私有变量的类型,反之亦然,它会与IntelliSense混淆。

我见过人们这样做:

    Car myCar;

我并不为此疯狂,但它可能会奏效。

关于如何做得更好的任何想法?

我想补充一点,这主要适用于在方法内创建的类的实例。

在看到这样的代码时,我会指出两件事。

你显然没有变量的命名约定 我认为这样的约定非常有用,特别是用于区分属性,成员变量和局部变量。

.NET生态系统中的常见约定是:

  • _privateVariable (由Microsoft和很多设计器生成的代码使用,例如linq2sql)

  • m_privateVariable (也是微软使用的,我认为TypedDatasets是使用这个约定生成的,但我不确定。)

  • 属性始终使用PascalCaseAndNoExtras
  • loacl varaibles总是camelcaseAndNoExtras

第二件事是关于命名类似于类的变量。 我认为最好不要将类的名称用作变量名。 一个好的变量名称应该在变量存在的范围内传达变量类型含义

例如,如果您想显示客户喜欢租用的汽车信息,您宁愿将变量m_CarToRentm_Car而不是m_Car

您也可以使用this关键字this.car 它将解决你的intellisense问题。 我自己更喜欢丹尼尔建议使用像_car这样的_car

像我一样,有些人使用_Car作为私有成员变量。

其中一个好的做法是:

public class Driver
{
 private Car _car;
 public Car Car { get { return _car; } }
 public Driver(Car car)
 {
  _car = car;
 }
}

_意味着,班级的客户看不到这个,并且它比'm_'更好,因为它不会向'_'或'my'添加任何东西,因为“my”已经是使用假设。

作为指导,您可以尝试安装Resharper http://www.jetbrains.com/resharper/ ,您很快就会习惯于一个好的命名约定。

在我尝试之前,我一直在改变我的命名约定风格,并且无法在这里和那里摆脱尴尬的'this'关键字。

第一种方法是使用前缀。 我使用m,e,v,i,p(MemberVariable,Event,Volatile,Index / Iterator,Pointer)等前缀,这使我能够在intellisense列表中看到这些不同的变量用法 ,并立即理解如何从名称中使用变量。 我真的不明白为什么有些人不这样做 - 这是一种经过长期验证的方法,可以加快编码速度,使编程更容易,更不易出错(特别是指针和指针指针)。 多年来,我看到团队中程序员拒绝遵循这些简单约定的许多可避免的错误。

第二是更好地区分类型名称和实例。 使用Car car ,甚至更糟糕的是,一辆房产: Car Car {get;set;}正如你正确指出的那样令人困惑。 人们早就认识到,仅根据案例区分名称是件坏事,而且两个名称相同(类型,属性)的名称更差。

但是有一些方法可以应用于避免这种情况(特别是对于你可能没有使用前缀的参数/本地):

  • 使用同义词: Vehicle car;
  • 使用通用(类型)和特定于上下文(实例)的术语Vehicle licensedVehicle 这有助于您的实例代码描述的不仅仅是汽车,而是您期望的汽车形式

最后,随着您将来扩充代码,事情会变得更糟。 请记住在构建具有模糊(有效“不可伸缩”)命名的类层次结构时会发生什么:

你从像Vehicle.Type这样的名字开始。 这似乎是合乎逻辑的:车辆的类型(私人,乘客,轻货,重货)。 然后你添加派生类Car,Bus,Truck。 对于公共汽车(类型=乘客),您想要添加“类型”(小巴,长途汽车,双层)。 所以现在你有了基类Vehicle.Type和派生类Bus.Type,这意味着完全不同的东西。 通过调用它们来避免在两种情况下使用通用术语“类型”(例如)Vehicle.VehicleType和Bus.BusType极大地澄清了事情,并消除了程序员混淆它们的任何机会。

(这不是一个很好的例子,因为我基于汽车命名理念,但希望它能够跨越一般点 - 良好,具体,描述性的命名可以最大限度地减少您的类用户和代码维护者的困惑。面对未来)

我通常会在(local)变量前面使用“current”,特别是如果它在循环中。

Car currentCar = new Car();

foreach( var currentCar in CarList ) {
   currentCar.Xxxx();
}

我发现这有助于提高可读性,但它完全是主观的。

这不仅令VS感到困惑,而且在概念上也令人困惑。 Car应该是AccordCelicaMini以及myCarcar1等实例:-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM