【问题标题】:What's the benefit of case-sensitivity in a program language? [duplicate]在程序语言中区分大小写有什么好处? [复制]
【发布时间】:2011-03-04 12:59:49
【问题描述】:

可能重复:
Is there any advantage of being a case-sensitive programming language?

我第一次使用 Basic 系列(MSX Basix、Q-basic、VB)进行编程。 这些都不区分大小写。现在,这可能是因为这些初体验,但我从未领会语言区分大小写的好处。相反,我认为这是不必要的开销和错误的来源,当我使用例如它时它仍然让我烦恼。 Java 或 C。

现在,我刚刚阅读了 Clojure(一种 Lisp 方言)并注意到 - 令我惊讶的是 - 与 Lisp 的区别之一是 case-sensitivity

那么:使用区分大小写的语言(对程序员)实际上有什么好处?

我能想到的只有:

  • 符号数量翻倍
  • 使用像 CamelCase 等技术的复杂变量的视觉反馈和更容易阅读,例如HopCount

但是,第一个参数不成立,因为它是错误的主要来源(在一个方法中使用 hopcount 和 HopCount 是一种不好的做法)。

第二个参数也不成立,因为一个不错的 IDE 也可以通过其他方式提供这一点。一个很好的例子是 VBA IDE,它有一个非常好的方法:语言不区分大小写,但只要你输入一个变量,它就会将其更改为定义中使用的大小写。例如,如果您定义了Dim thisIsMyVariable as string,它会将任何出现的thisismyvariable 更改为thisIsMyVariable)。这为程序员提供了一个直接的线索,即变量实际上是正确输入的(因为它改变了外观)。

编辑:添加 ... 对程序员的好处 ...

【问题讨论】:

  • 从技术上讲,它不是符号数量的两倍。假设最大符号长度为 32 个字符,不区分大小写可能类似于 38 个字符 (a-z0-9_$),具有 38 ^ 32 = 3.57e+50 排列。在区分大小写时再添加 26 个字符,我们有 64 ^ 32 = 6.28e+57 排列,这大约是 1.76e+7 倍的符号,而不仅仅是符号的两倍。并不重要。
  • 我认为可读性是主要的。也使编译器做的工作略少。考虑String string = new String();
  • 是的,就其价值而言,我完全同意区分大小写是为了计算机而不是程序员的利益。不幸的是,这似乎是一个主观/争论的问题,没有明确的答案。因此,我认为它不适合 Stack Overflow。我真的不知道programmers.stackexchange.com 的政策结束了,但我认为在那里进行讨论会很有趣。
  • 语言是区分大小写的,因为现在它们可以了。 VT50 终端只有大写字母。旧的 printronix 打印机只能打印大写字母。但任何比这更近的东西都允许同时使用这两种情况。

标签: language-design language-features case-sensitive case-insensitive


【解决方案1】:

正如您所说,有一点是视觉辅助。大多数编程语言(甚至框架)都有关于如何大写变量、名称等的约定。 此外,它强制在任何地方使用统一名称,因此您不会对称为“var”、“Var”甚至“VaR”的同一个变量感到困惑。

我不记得曾经有过与大写相关的错误,所以这一点对我来说似乎有点做作。 对我来说,使用 2 个同名但大小写不同的变量听起来像是有意识地尝试在脚上开枪。不同的大小写约定几乎在所有地方都表示完全不同类型的对象(类、变量、方法等),因此由于语义完全不同,所以很难犯这样的错误。

我想这样想:不区分大小写有什么好处? 我们引入歧义,鼓励草率和不良风格。

这当然是一个有点主观的问题。

【讨论】:

    【解决方案2】:

    许多命名约定要求表示来自不同语义类(类型、函数、变量)的对象的符号有自己的名称大小写规则。例如,在 Java 中,类型名称总是以大写字母开头,而变量、成员函数名称等则以小写字母开头。这有效地将类型名称放在不同的命名空间中并且 提供了一个视觉线索,即语句的实际含义。

    // declare and initialize a new Point
    Point point=new Point();
    // calls a static member function of type Point
    Point.fooBar();
    // calls a member function of Point
    point.moveTo(x,y);
    

    【讨论】:

    • 我打算发布一个非常相似的答案。因为我经常使用 MainModel mainmodel = new MainModel() {foo=1, bar=0};
    • 我不喜欢 both 使用仅区分大小写的标识符的做法(在 C# 中允许),在引用时使用不一致的大小写标识符(在 VB.NET 中允许)。如果我有我的 druthers,如果 Foo 在一个范围内声明,foo 在嵌套范围内声明,那么在该嵌套范围内 Foo 既不会引用外部名称,也不会引用内部名称,而只是被禁止。这样的规则将使 IDE 更容易纠正任何问题 [我发现 C# IDE 在这方面不是很有帮助]。
    猜你喜欢
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 2014-11-16
    • 1970-01-01
    • 2012-12-01
    • 1970-01-01
    相关资源
    最近更新 更多