strstr不区分大小写_中文命名标识符如何区分类型和变量

刚收到的私信问题:

java英文标识符中,是用大小写来区分是类型还是变量的,但使用了中文,就没法这么做了,有什么好的建议么?比如我定义一个状态枚举,再用这个类型定义一个变量,也是叫状态。英文中,类型是State,变量是state。中文下就不行了。

问题感觉比较有代表性,此文作一阶段小结。并不针对枚举类型,而是所有类型/接口。各人命名风格不同,此文仅对本人习惯作一介绍(主要以 Java 代码为例)。

最早开始与同好切磋这个问题是在两年多前的这帖:中文命名的特定问题, 相关风格及规范 · Issue #45 · program-in-chinese/overview

重名是否恰当

应该是首先考虑的问题。英文经常仅用大小写区分,并不意味着应该/必须照搬直译。以薛定谔的猫为例:

public class Cat {

  enum State {
    Dead,
    Alive
  }
  
  State state;
}

假定这里枚举类型 State 的含义是打开箱子观测时的状态,可以用“下场”,“结局”等等更能体现语义的词汇命名枚举类型。

这取决于代码的语义,以及设计。感觉比较难一概而论(如有具体实例欢迎在上面的 issue 跟帖/下面留言/私信继续探讨),但最好在采用其他手段区分之前,先认真考虑一下。因为这往往可以使语义更加明确,开发者也在推敲过程中能对代码目的有个更清晰的概念。

写到这里时,看了一下两年前的 中英文代码对比系列之Java一例,突感当时的思维僵化,请见最后增补。这与本文主题并不直接相关,但直译之弊可见一斑。

下面是如果避无可避,或者不愿在推敲上花过多功夫的一些权宜之计:

方法一

使用后缀突出属性。比如 class 后缀“类”,interface 后缀“接口”,enum 后缀“种类”(这个没有实践过)等等。比如这些小项目:

吴烜:烂尾工程: Java实现的汇编语言编译器​zhuanlan.zhihu.com
吴烜:在Maven Central发布中文API的Java库​zhuanlan.zhihu.com

一个好处是,几乎可以杜绝和变量重名的情况出现。但贯彻风格也是个额外负担。

方法二

有时,项目写到一半才发现这个问题,而大多数类名已经写好,不带后缀。又懒得重命名所有类,那么就在这个重命名的地方对变量加前缀,比如这里的“某词条”:

      词条 某词条 = 英汉词典.查词(词条[0]);

这对偶尔出现的情况比较适用。

【先想到这么多】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现一个不区分大小写strstr函数可以通过以下步骤来完成: 1. 首先,将目标字符串和模式字符串都转换为小写或大写字母,以便进行大小写不敏感的比较。 2. 使用两个指针,一个指向目标字符串,一个指向模式字符串。 3. 在目标字符串中循环遍历,直到找到与模式字符串的第一个字符相等的字符。 4. 从当前位置开始,比较目标字符串和模式字符串中的字符,如果不相等,则继续遍历目标字符串。 5. 如果找到了与模式字符串匹配的子串,则返回该子串在目标字符串中的起始位置。 6. 如果遍历完整个目标字符串都没有找到匹配的子串,则返回NULL。 下面是一个示例代码实现: ```c++ #include <iostream> #include <cstring> #include <cctype> char* stristr(const char* haystack, const char* needle) { if (haystack == nullptr || needle == nullptr) { return nullptr; } int haystackLen = strlen(haystack); int needleLen = strlen(needle); for (int i = 0; i <= haystackLen - needleLen; i++) { int j; for (j = 0; j < needleLen; j++) { if (tolower(haystack[i + j]) != tolower(needle[j])) { break; } } if (j == needleLen) { return const_cast<char*>(&haystack[i]); } } return nullptr; } int main() { const char* haystack = "Hello, World!"; const char* needle = "world"; char* result = stristr(haystack, needle); if (result != nullptr) { std::cout << "Found at position: " << result - haystack << std::endl; } else { std::cout << "Not found." << std::endl; } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值