V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Vinty
V2EX  ›  问与答

有没有人使用中文命名变量?

  •  
  •   Vinty · 2021-02-03 17:15:46 +08:00 · 1836 次点击
    这是一个创建于 1383 天前的主题,其中的信息可能已经有所发展或是发生改变。

    天天想变量名翻字典都头疼,想要尝试用中文命名变量。

    刚开始就遇到一个问题,英文下面我可以用OrderType表示类名,orderType表示变量。

    换到中文,我没想到有什么好的处理方法,有没有有经验的大佬可以讲讲一些经验。

    12 条回复    2021-02-03 22:16:29 +08:00
    kop1989
        1
    kop1989  
       2021-02-03 17:31:59 +08:00
    扫了眼易语言的语法。
    好像确实不好区分变量 /对象与类名。
    找到的例子:
    猜数字 猜 = 创建 猜数字();
    //猜数字 猜 = 创建 全自动猜数字();
    猜.猜();
    renmu123
        2
    renmu123  
       2021-02-03 18:09:34 +08:00 via Android
    动物类,xx 动物,xx 动物实例
    eason1874
        3
    eason1874  
       2021-02-03 18:27:15 +08:00
    这有啥好头疼的,直译就行了,不用在意英文语法,怕忘记就在注释写清楚用途
    lululau
        4
    lululau  
       2021-02-03 18:55:01 +08:00 via iPhone
    中文一样的,LeiXing leiXing
    lululau
        5
    lululau  
       2021-02-03 18:56:34 +08:00 via iPhone
    难道你说的中文是指汉字。。。切换输入法不累吗,你不累电脑还累呢
    wudicgi
        6
    wudicgi  
       2021-02-03 18:58:30 +08:00
    别想了,不好用,还是翻词典吧
    wudicgi
        7
    wudicgi  
       2021-02-03 19:02:01 +08:00
    英文名称即使用的不是太精确也比中文区分度好,像 type, genre; class, category; property, attribute; number, count 这些中文该用什么对应
    secondwtq
        8
    secondwtq  
       2021-02-03 19:09:53 +08:00   ❤️ 1
    我举两个类似的例子:

    引用 https://v2ex.com/t/612874#r_8089400 这里面的:
    > LLVM 一开始用了以 camelcase 为主的命名方案,具体来说是类型名,变量名(包括局部变量和成员变量),用 UpperCamelCase,函数名是 lowerCamelCase 。
    > 但是后来发现一个问题,比如我有一个变量的类型是 MemorySSAUpdater,那么按照命名规范,我不能把它命名成 MemorySSAUpdater,因为会和类型名冲突,现在的解决方案是取首字母 acronym 命名成 MSSAU 。这种情况在整个仓库里十分广泛: https://github.com/llvm/llvm-project/blob/734c74ba14be0f4421ccd9f720e5b9309248e0f7/llvm/lib/Transforms/Scalar/LoopLoadElimination.cpp#L709 感受一下
    > 但是这种命名多了就会十分奇怪,看代码必须先要熟悉这些奇怪的缩写才能看得下去

    > 于是现在有个 proposal 就是把变量命名从 UpperCamelCase 变成 lowerCamelCase,这样我就直接命名成 memorySSAUpdater 就行了: https://llvm.org/docs/Proposals/VariableNames.html

    当时这个事在邮件列表里面吵了半天 ...

    同一帖子上一楼提到,一些函数式编程语言强制要求某些结构使用特定的命名规范,比如在 OCaml 中,constructor 和 module 的名称必须以大写开头,而 Haskell 中类型和 constructor 必须以大写开头。刚开始学的时候感觉有点奇怪不过没太在意,后来也就习惯了。
    但是后来我自己写语言抄 OCaml 的时候就发现问题了,通过这种语言设计上的小动作,编译器实际省下了很多工作——正则一匹配就知道这个标识符到底是个值还是个 module,同样是命名空间的访问,value.field 肯定是访问一个 record 中的值,Module.value 肯定是访问模块中的值,Module.Submodule.value.field 肯定是嵌套模块访问 + record 访问。
    而类似的问题在 C++ 中的解决方案是引入两种语法结构: "::" 用于静态命名空间的访问,"." 用于实例命名空间的访问。
    现在我自己要解决这个问题,要么抄 OCaml 的,把命名规范搞得不像个“正常语言”,要么学 C++ 的,多占几个符号,多加几条规则,还有一种方法是我 parser 开洞,不通过任何语法层级的东西来 disambiguate,不过那样 parser 跟 C++ 的就差不多屎了。
    现在我已经放弃在文本层面解决这个问题了 ...
    agagega
        9
    agagega  
       2021-02-03 19:13:34 +08:00 via iPhone
    @secondwtq 对编译器来说 C 语言这样不在词法上区分标志符和类型的做法倒没啥,但对一些基于正则的语法高亮 /格式化工具就挺麻烦了
    secondwtq
        10
    secondwtq  
       2021-02-03 19:14:24 +08:00
    @agagega 很不幸"基于正则的语法高亮"在我这也是要淘汰的 ...
    handle233
        11
    handle233  
       2021-02-03 21:40:56 +08:00
    Visual C++早就支持中文标识符了,你也可以 typedef 一下用中文来表示 int,但是,英文写代码速度会快很多。
    Heartbleed
        12
    Heartbleed  
       2021-02-03 22:16:29 +08:00 via Android
    我觉得用拼音挺正常的,有些业务涉及的变量或字段太多,总不能一个个想对应的英文吧。比如股票交易系统...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3985 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 05:12 · PVG 13:12 · LAX 21:12 · JFK 00:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.