关于算法竞赛中标识符命名的几点建议

发布时间 2023-10-11 15:43:16作者: qkhm

头图

一张头图

 

引言

标识符命名,一个 OIer 每天都在做,却基本从未在意过的操作。

好的命名,既可以提高自己的调试效率,也可以提高代码可读性。

方便自己,也方便别人。

如果你觉得自己的代码不是很美观,又觉得码风已经定型,不如继续往下看,说不定可以让你的码风更进一步。

欢迎 @ 你身边有需要的朋友。

(注:本文仅为建议,具体还请结合自身习惯)

 

变量,常量及数组命名

一、选择长度适当的命名

如果命名太短,无法表示太多含义。因为缩写的重复率过高,导致变量或函数的具体含义很难区分。

如果命名太长,含义确实足够丰富,但会大大增加编码长度及调试难度,且不知道哪里会打错一部分。

一般选择 2 - 3 个字母的命名为宜。

以三个字母为例,可以选择一个英文单词的前三个字母,比如 col(color), num(number), ans(answer), tot(total) ……

还可以将一个长单词中的元音及重复字母删去,或者保留你喜欢的字母,比如 cnt(count), tmp(template), rmb(remember), knd(kind)……

二、尽量不要选择中文拼音

原因有几点:

  1. 中文中同音字过多,且前后鼻音,平翘舌音,对特殊地域 OIer 不太友好。(本人就不太能分清前后鼻音)
  2. 如果使用中文缩写,会出现许多歧义,例如 zdz 你能很快反应过来它是 最大值 的意思吗
  3. 同时,因为使用中文缩写的人很少,如果你这么写的话,其他人很难理解你的代码。

三、尽量减少无意义命名

例如 a, b, c, d 这样的命名,因为是按顺序延续,所以具体含义每个题都不一样,尽量不要使用,避免混淆。

不过,一些临时中转变量,因为本身就没有含义,那么这时候还是简单为好。

或者自己在稿纸上推算时便是如此写的,那么落实在代码上还是不要更改为好。

请记住,满篇 y, w, v, c, o 很让人崩溃(无论你是否知道它们都是什么含义)。

四、有一些表示固定含义的变量

有一些算法和数据结构中用到的特殊变量,你可以给他们分配一个不容易冲突,且含义明确的名字。

永远只有这一个变量可以起这样的名字。

比如分块中的块长,你可以给它命名为 block, 因为使用的次数很少,可以定长一些。

邻接表存图中的计数器,可以命名为 cnte, 显然其他地方很少会用到这样的名字。

同时,类似的,一些含义非常多的,给它加一个特殊后缀区分是一个好方法

五、小 trick

  1. 善用 for 语句临时变量,不止可以有 i, j, k 这几种,枚举不同的量可以用 u, v, w, d 之类的首字母。
  2. 给数字常量起名字,如数据的最大值可以叫 Maxn, 0/1 之类的下标可以用 ls,rs 之类(可以了解 enum)。
  3. 不要使用多个相同字母,可以通过添加后缀区分,如 ans1, ans2, 而不是 ans, anss。
  4. 可以使用一些大写的单个字母,如 N, M, K, T, Q 等

函数命名

 六、与数组名有关联

例如有一个数组名为 dis, 那么处理此数组的函数就可以叫 GetDis() 或 solveDis()。

七、使用不同后缀区分

有时候多个函数实现的是相似的功能,比如查询函数。

此时需要不同的后缀(也可以是前缀,后缀更常见)来区分。

例: query_ct(),  query_pt(), query_nd() 分别是查询子树内信息,查询路径上信息,查询单点信息。

八、同上

和 变量,常量及数组命名 类似,函数命名也需要注意

  1. 长度,此时以 3 - 7 个字符为宜。
  2. 不适用中文拼音。
  3. 保持有意义命名。

等问题

 

其他

九、驼峰命名法

在一个命名中,根据意义常常会分为若干个部分, 如 get dis(), push up(), push down(), l mx, r mx 等等。

那么,为了提高区分度,以及增添美感,我们可以将每个部分的首字母大写,称为 大驼峰命名法,例如上面的名字,我们可以改为

  GetDis(), PushUp(), PushDown(), LMx, RMx

如果整个单词的首字母不大写,则称为 小驼峰命名法。那么上面的名字,我们可以改为

  getDis(), pushUp(), pushDown(), lMx, rMx

十、下划线分割命名法

与上面类似,只不过部分之间以下划线分割。

仍然是上面的例子

  get_dis(), push_up(), push_down(), l_mx, r_mx

 

可以同时使用不同的命名法,以增加命名美感及区分度。
具体采用哪种可以根据个人习惯。

 

结语

实际上,无论使用哪种命名,最重要的是代码逻辑。

名字只是锦上添花,切不可本末倒置,过分追求命名。

祝大家都能拥有人见人懂的码风,感谢。

 

如对文章有任何问题请私信作者 @qkhm .