我是不道德的使用一个variables名称,只有大小写不同的types?

例如,拿这段代码:

var person = new Person(); 

或为你Pythonistas:

 person = Person() 

我常常被告知这是多么糟糕,但还没有看到这两行代码不道德的例子。 对我来说,人是一个人,试图给它另一个名字是浪费时间。 我认为在语法突出的日子里,这将是一个大问题。 但是现在,除了variables名以外,很容易告诉types名称。 哎呀,在SO上看到这个区别很容易。

还是有什么我失踪? 如果是这样,如果你能提供一个导致问题的代码的例子,这将是有帮助的。

那些告诉你这个不好的原因是什么? 我一直这样做。 这是命名一个types的单个variables的最简单,富有performance力的方式。 如果你需要两个Person对象,那么你可以用有意义的形容词作为前缀

 fastPerson slowPerson 

否则只是

 person 

我很好。

我在方法签名中使用了这种模式。 如果我无法提供替代的描述性名称,那么恕我直言,这没有什么错。

如果你有两种types的人和人,那么错将是非常非常错误的。

我一直使用它来临时对象引用。 我会避免它像原始数据types的瘟疫。

 Person person = new Person(); // okay int Int = 42; // pure evil 

如果有人说这是邪恶的,问他们这是否更好:

 var abc = new Person(); 

如果人是上下文中的一般人,那么“人”就是一个非常好的名字。 当然,如果Person在代码中具有特定angular色,那么最好使用angular色来命名她。

我想我会因为这样说而低估,但是…

刚刚经过一个世纪,见证了史诗般的谋杀和贪婪,我们程序员真的很幸运,如果我们能做的最不道德的事情是命名variables。

我不认为这一定是“坏”,但显然如果你可以限定它给它更多的背景,就像它是一个什么样的人(你正在处理的只是大概可能的人中的一个),那么别人就会select它可能会更好理解。

杰森 – 我不确定谁告诉你这是坏事。 许多作者使用这个作为expression一个 (大写)的实例 (小写)的标准方式。

我经常使用它,因为我发现底层variables实际上告诉我不仅是一个实例,而且也是这个类的名字。

除非有人反对,否则我一定会继续这样做。

这被认为是不好的原因是,如果你将来需要有2个人,那么你最终可能会看到类似的代码。

Person person = new Person();

Person person2 = new Person();

那将会接近“坏”。 然而,在这种情况下,你应该重构你的原始人,以区分两者。

至于你的例子,variables名称“person”是对象“Person”的完全描述性名称。 所以没有什么问题。

我说这是什么名字:如果这个variables代表一个有两只狗的人,那就personWith2Dogs 。 它的variables有一个短的范围(就像一个循环var),那么人就很好。

我在代码中使用了很多,不要以为它有什么问题。 也就是说,我(可能)不会在比一个屏幕更长的方法中使用它,并且如果有多个Person类的实例。 绝对不要将他们命名为person1,person2,person3 …而是使用更具描述性的内容,比如person_to_del,person_to_ban,person_to_update等。

不是不道德的,但是如果你不能激活大小写敏感的话,全局search将会findPersonPerson 。 我更喜欢一个前缀,使全球search/replace更容易,但绝对不是匈牙利或长或复杂的东西。 所以,我用…

类的types/typesaPerson用于局部variablesthePerson用于方法参数myPerson用于实例variablesourPerson用于类variables

在罕见的情况下,我可能会在本地环境中使用p ,但是这通常只适用于循环索引等。

这取决于。

如果你有一个严格的大小写风格,所以variables开始小写(并且使用under_scores或者camelCase来进行分词),并且类从大写字母开始,那么很显然,person是variables,Person是类,当有人明白这个,他们似乎不会在重叠的命名空间。 (同样,人们几乎不会把动词或名词“polish”和形容词“Polish”混淆)。

如果你没有这样的风格,那么你有两个很容易混淆的名字,只有情况不同。 那很糟。

那些人使用的确切论点是什么?

如果他们不允许你使用人作为variables名,你可以考虑添加“a”前缀。

 aPerson = Person() 

我认为你在做什么是好的。 我认为总的来说,达成一致的编码标准是很重要的。

例如我使用lowerCamelCase实例,variables和UpperCamelCase的类等

编码标准应该消除这个问题。

当我看到成功的开源程序,他们通常有编码标准

http://drupal.org/coding-standards

http://help.joomla.org/content/view/826/125/

http://wiki.rubyonrails.org/rails/pages/CodingStandards

http://lxr.linux.no/linux/Documentation/CodingStyle

同意编码标准应该是你最后的战斗。

实际上看看维基百科条目(来自http://en.wikipedia.org/wiki/CamelCase

编程和编码风格

有时候build议使用内部大小写,以便根据编写源代码的编码风格准则(例如,Mesa编程语言和Java编程语言)来指示字的边界。 这些指导原则中的一些指导原则得到了静态分析工具的支持,这些工具可以检查源代码的遵守情况。

这些build议经常区分UpperCamelCase和lowerCamelCase,通常指定哪种变体应该用于特定types的实体:variables,logging字段,方法,过程,types等。

一种广泛使用的Java编码风格决定了UpperCamelCase用于类,而lowerCamelCase用于实例和方法[19]。 认识到这一用法,一些IDE(如Eclipse)实现了基于CamelCase的快捷方式。 例如,在Eclipse的内容辅助function中,input一个CamelCase字的大写字母将会提示任何匹配的类或方法名(例如,键入“NPE”并激活内容辅助可能会提示“NullPointerException”)。

原始的匈牙利编程符号指定“使用types”(不是数据types)的小写缩写应该在所有variables名称前面加上UpperCamelCase中剩余的名称; 因此它是一个lowerCamelCase的forms。 CamelCase是Java和Amiga个人计算机中文件名称的正式约定。

对于其他types的标识符,Microsoft .NETbuild议使用lowerCamelCase作为参数和非公开字段,UpperCamelCase(又名“Pascal样式”)。

Pythonbuild议UpperCamelCase用于类名。[21]

NIEMregistry要求XML数据元素使用UpperCamelCase,XML属性使用lowerCamelCase。

CamelCase名称中不包含大写缩写(主要是首字母缩略词和首字母缩写)。 方法包括以大写字母(例如“useHTTPConnection”)留下整个缩写,仅留下大写的第一个字母(如“useHttpConnection”)。

骆驼案件在计算中并不是普遍的。 几种现代编程语言的用户,特别是Lisp和Forth系列的用户,几乎总是使用连字符。 其中有些原因是因为这样做并不需要在大多数键盘上移动,当分开的时候这些单词更具可读性,并且在不区分大小写的情况下可以简单地保留骆驼情况, Common Lisp,尽pipe技术上区分大小写的语言,但默认情况下将标识符(折叠)标准化为大写)。

有可能作出更强有力的论证,即这种方法名称不仅无害而且可以成为高质量代码的一个指标。

  • 一个好的代码粒度的指标:如果你的方法是简短的,单用的,描述性的命名,你不需要大量的variables名称信息。 如果你有很长的方法做很多事情,需要跟踪大量的上下文和状态,那么你的variables名称需要更具描述性。

  • 通用计算的一个指标被推广到通用的方法中:如果在业务方法中对数据结构进行中间操作,例如必须对用户数组进行重复数据删除,则必须在范围与users[]deduplicatedUsers[] users[]名称。 如果将重复数据删除移到实用程序方法中,则可以调用方法Utils.dedup(array) ,并且可以调用重复数据删除arrays的deduplicatedArray或只是调用result

  • Java反编译器通常使用这样的命名方式来命名局部variables(实例和类variables通常在字节码中可用,但本地variables不可用),结果比您预期的更具可读性,事实上通常比原始来源。

  • 参见拉里·沃尔的“本地歧义行为”原则 – http://www.wall.org/~larry/natural.html

我会说,当你创build一个对象的时候,你可能有一些特定的用途。 这种types很less反映这种用途。

所以如果你想在地址簿应用程序中创build一个新的联系人,你可能需要调用variablesnewContact

如果你正在unit testing你的代码来检查没有设置名字的Person对象的行为,你可能需要调用他们的unnamedPerson或类似的东西。

简单地说, person放弃了使自己的代码自我logging的很大的机会。

只有当你在VB6编程。 在这种情况下 ,你所做的是非法的,但不是不道德的。

我也这样做,我也不明白为什么它应该是“不道德的”。 虽然我可以理解它可能有时会令人困惑,但是今天我们有IDE的intellisense和语法高亮,这将确保(如果你犯了一个错误,引用你的variables而不是你的类,反之亦然),你会看到你的错误相当快。 而且我们也有编译器。 🙂

我也没有看到这种做法有任何问题。 只要这个类只有一个variables,就很容易编写和读取。 伊莫,甚至适用于基本的文本编辑器。 我个人无法想起任何人称这种不好或甚至是不道德的。 只要继续这样做:)

我认为你可能会想到的“规则”更多是针对原始types,而类名称是一个很差的variables名称。

例如,如果您正在处理计算在线商店中特定商品的成本,则下面的代码将不是很好的forms:

 Decimal _decimal = item.BaseCost + item.Tax; 

相反,会build议一个更具描述性的名称,如“_total”或“_cost”。

我发现这种事情唯一的问题是,如果你想要私人成员和公共财产相同的名称。

如果这些只是在不同情况下有所不同,那么在C#等区分大小写的语言中工作正常,但在VB.NET中不会。

所以,例如,在VB中,我会写

 Private _name As String 

 Public Property Name() As String Get Return _name End Get Set(ByVal Value As String) _name = Value End Set End Property 

我会在C#中做同样的事情,这样从一个到另一个的翻译是无痛的。 这也使得它不太容易出错,因为它很容易被错误阅读,或者确实是错误的types的话,只是大小写不同。

不是不道德的,但如果你的variables的最好的名字是types的名字,错误的东西,或者你只是做一个概念certificate或类似的东西。 对我来说,一个variables名必须引用业务上下文中的含义,而不是编程语言。 这将是更难以理解的代码。

我经常使用Person person = new Person()我自己。 常用于Java / C#。

虽然我昨天最终想知道为什么

 private enum DataType {NEW, OLD} 

在C#中不起作用…

特别是看你如何在C#中随意使用StringstringDoubledouble …。

 Person person = new Person() 

在我的书里很好。

当你有以下情况时,它会变得可怕:

 string Person; string person; 

很容易混淆2。

对我来说,除了不符合我们的编码标准外,其他人都在阅读我的代码时避免了混淆。 我个人认为没有问题,只要意思是明确的。

至于CLRtypes(int,string等),你可以使用String或string(等)来声明types,所以我会避免使用类似

 int Int = 0; string String = "hi there"; 

使大写唯一的区别是危险的…继续做这个大项目,我保证你会遇到奇怪的错误,你似乎无法find。

像上面的fastPerson / slowPerson是好的…他们描述和区别于variablestypes的名字…但是对男人来说,调用一个int“Int”将是简单的懒惰。

我会说它从来不道德 – 它只是你的基线variables名称。 如果你不能想到一个更好的名字,那么在它的types之后命名它是一个很好的默认( 适用于复杂types – 对于内置types而言它是邪恶的 )而且很多时间真的不是一个更好的名字,不知道variables的其他内容。 就像这个方法一样

 void SaveToDatabase(Person person) {...} 

关于唯一可以合理调用的人是person_to_save或类似的东西似乎是多余的。

但是,在很多情况下,通过用更具描述性的名称replace人员,可以提高代码的可读性。 例如,这是不太具有描述性的

 void AddToAccount(Account account, Person person) {...} 

比这个

 void AddToAccount(Account account, Person dependent) {...} 

但是,请 – 请不要在types名称前加上“a”或“t”。 IE aPerson为'一个人'或tPerson为'人'。 它过于复杂,并没有增加太多,如果有任何价值。 此外,你开始污染你的范围与一个variables开始的一个或一个可以最小化智能感的价值。

我不会说这太可怕了。 我通常在这种东西前面加上'a'的variables名称来表明它是一个单一的types实例,所以我会做

 Person aPerson = new Person(); 

这使得代码阅读更自然,我认为。

绝对没有什么不对的,但要注意别人指出的注意事项(为方便起见,这里总结一下):不要用原始types来做,重新编写原始实例,如果以后添加另一个实例,不要用char-case来区分类名等。

我的经验法则? 代码中的语句应该像简单的英文句子一样阅读。

Person person = new Person();

Employee employee = person.getRole(EMPLOYEE);

父亲= person.getRole(PARENT);

person.getFullName();

employee.getSalary();

parent.getChildren();

parent.getFullName(); / /假设装饰模式在玩

if(person.hasRole(EMPLOYEE)){

}

等等。

如果variables的作用域是有限的(例如封装方法是10-15行),我甚至可以使用'p'而不是'person'。 当试图在你的头脑中保持上下文时,较短的variables名称不会让人分心。 避免无用的前缀,如“a”或(不寒而栗)的匈牙利符号及其旁枝。 (请注意,在适当的上下文中使用C ++ / COM / ATL / Win32 API代码等等,在保持作业/types转换的时候,我并没有反对这样的前缀)。

我的两个(!)位:-)