为什么许多编程语言对大小写敏感?
这只是继承的问题吗?C++对大小写敏感是因为C对大小写敏感,Java对大小写敏感是因为C++对大小写敏感等等?还是有更实际的原因呢?
为什么许多编程语言对大小写敏感?
这只是继承的问题吗?C++对大小写敏感是因为C对大小写敏感,Java对大小写敏感是因为C++对大小写敏感等等?还是有更实际的原因呢?
这里有很多人认为,对于同一事物使用不同的大写方式会导致问题,例如:
person
perSoN
PERSON
如果这些都指向代码中的不同对象,那将是非常糟糕的。如果你有变量person、perSoN和PERSON分别指向不同的东西,那么你就有了一个问题。
学习总是以实例为基础,下面就是一个示例:
C#(区分大小写但可从不区分大小写的VB.NET中使用):
CONSTANT_NAME
IInterfaceName // Uses I prefix in all case sensitive and insensitive languages
ClassName // Readable in both case sensitive and insensitive languages
_classMember // sometimes m_classMember or just classMember
DoSomething(someParam) // Method with action name, params can be _someParam
PropertyName // Same style in case sensitive and insensitive languages
localVariable // Never using prefix
Java和JS使用类似于C#的风格,但方法/函数/事件的声明方式类似于变量doSomething、onEvent。
ObjectPascal(Delphi和Lazarus/FPC不区分大小写,类似于ADA和VB.NET)
CConstantName // One can use Def or no prefix, not a standard
IInterfaceName
TClassName // Non-atomic types/classes have T prefix e.g. TStructRecordName
PSomePointer // Pointers have types, safer low level stuff
FClassFieldMember // F means Field member similar to m
DoSomething(Parameter) // Older code uses prefix A for parameters instead
PropertyName
LLocalVariable // Older code uses prefix for parameters not local vars
只使用OneCase和每种类型的前缀在所有语言中都是有意义的。即使是没有前缀的语言也有像接口这样的新构造,它们不依赖于大小写而使用前缀。
因此,一个语言是否区分大小写并不重要。对于那些过于复杂以至于仅靠大小写难以表达的新概念,需要使用前缀。
既然区分大小写的语言开始使用前缀,就有理由停止使用相同标识符名称的大小写形式,例如someIdentifier,SomeIdentifier,SOME_IDENTIFIER,ISomeIdentifier,而是在合适的地方使用前缀。
考虑以下问题: 您有一个名为something的类成员、一个名为something的方法/函数参数和一个名为something的本地变量,哪种大小写约定可以轻松区分它们? 使用最一致的大小写风格并添加前缀不是更容易吗?
大小写不敏感语言的支持者关心代码质量,他们只想要一种风格。有时,他们会接受一个库编写得很差但使用严格风格的事实,而该库可能没有风格或代码质量较差。
无论是区分大小写的还是不区分大小写的语言都需要严格的纪律,使用相同的风格更有意义。如果我们有一种只使用StrictCase、在任何地方都使用一种风格和前缀的语言,那么会更好。
有很多质量较差的C代码,大小写敏感使其难以阅读,而且你无法做任何改变。在一个不区分大小写的语言中,你可以强制执行良好的代码风格,而无需重写库。 在一个严格区分大小写的语言中,这种语言目前还不存在,所有代码都将具有良好的质量 :)
因为许多人认为employeeSocailSecurityNumber和employee_social_security_number一样易读,而且更短。
关于那个提到所谓方便的技巧"MyClass myClass"的人 - 为什么,为什么,为什么?你故意让人难以一眼看出使用的方法是类方法还是实例方法。
此外,你失去了向下一个阅读你代码的人更多地介绍该类特定实例的机会。
例如:
Customer PreviousCustomer
Customer NewCustomer
Customer CorporateCustomer
你的实例名称最好能告诉同事更多信息,而不仅仅是它所基于的类!
你也可以(愚蠢地)为所有类、变量、函数和方法使用单个字母(“a”、“b”和“c”)。
但是,为什么要这样做呢?
使用有意义的名称,而不是:
function a(a)
{
int a = a.a;
return a
}
因为人们经常过度思考问题。
当大小写不敏感性与类型和变量命名空间的分离相结合时,它的效果最佳。这意味着:
如果您将一个类声明为“TextureImage
”,然后尝试将其用作“textureImage
”,IDE 可以自动更正您。这使您具有优势,即除非您正在声明标识符或使用下划线,否则永远不必按 Shift 键。
就像在 Java 和其他几种语言中一样;键入“MyClass myClass
”是完全有效的。IDE 和编译器应该没有问题区分类型和变量的使用。
此外,大小写不敏感性保证了“o
”和“O
”永远不会引用不同的对象。常见的争论包括:
"sOmEoNe wIlL tYpE cOdE lIkE tHiS
"; => 而且那些人将永远不被允许加入编程团队,所以这是一个伪命题的论点。即使他们设法这样做了,大小写不敏感更多是解决方案而不是问题,因为这意味着您不必记住他们使用的任何疯狂的大写/小写组合。
"you can't internationalize case insensitivity easily!"; => 超过95%的编程语言都是用英语编写的,原因很简单。没有竞争的字符编码,地球上绝大多数键盘都是基于英语的(部分或全部)。支持Unicode标识符可能是21世纪任何人想出的最愚蠢的想法;因为好几个Unicode字符是见鬼的不可见代理,读代码足够难了,而不必使用谷歌翻译,编写代码足够难了,而不必复制和粘贴标识符或使用字符映射。
"but case sensitive languages have more identifiers!"; => 不,它们具有语法上重载的标识符,这相当糟糕。
我不使用任何不区分大小写的编程语言,但是如果你认真思考这种事情,优点是显而易见的。
编程语言区分大小写的另一个原因是,ID可能存储在哈希表中,而哈希表依赖于哈希函数,对于不同大小写的ID会产生不同的哈希值。在运行它们通过哈希函数之前,将所有ID转换为全大写或全小写可能并不方便。当我编写自己的编译器时,我遇到了这个问题。将我的语言声明为区分大小写更加简单(懒惰)。