作者AmosYang (泛用人型编码器)
看板Soft_Job
标题[心得][英文] 刷 LeetCode 练习命名
时间Sun Nov 8 12:25:54 2020
# 刷 LeetCode 练习命名
过去几个月,《程式英文》把焦点放在「分享知识」;例如,变数名称样板、单字
使用情景、等等。对学习者来可说是「输入」的动作。
这次试个不同的方向,做了个实验,把焦点换到「演练技巧」,希望能帮助学习者
改善输入与输出的平衡。
* Google 文件
https://bit.ly/2GIyLtk
* GitHub 讨论区
https://bit.ly/321ResR
# 先说结论
* 实验内容:用 C# 刷 20 题「解题率最高、 Easy 等级」的 LeetCode
* 题目列表:
https://github.com/EngTW/English-for-Programmers/issues/69
* 所有 20 题 LeetCode 英文题目(含提示)总共约 2841 字。
* 其中 2434 字 (86%) 包含在「高中英文 7000 字」内。
* 可还原成约 394 个单字原型;例如, am, are, is 的单字原型为 be 。
* 其中 285 个单字原型 (72%) 包含在「高中英文 7000 字」内。
* 所有 20 题 LeetCode 解答内「自订变数」用了约 119 英文字。
* 其中 105 字 (88%) 包含在「高中英文 7000 字」内。
* 可还原成约 44 个单字原型。
* 其中 36 个单字原型 (81%) 包含在「高中英文 7000 字」内。
以下是一些观察与心得。
# 堆叠( stack )字
在英文语法中,可以把多个字「堆叠( stack )」起来来表达意思,例如,程式
设计师熟知的 API: Application Programming Interface 。
这样的语法也可以应用在命名变数上,但要小心拿捏资讯量与复杂度的平衡;例如:
* 在有 1 个字的时候,例如, Name, 只有 1 种读法,没有问题。
* 在有 2 个字的时候,例如, ManagerName, 仍只有 1 种读法,没有问题。
* 在有 3 个字的时候,例如, StoreManagerName, 就有 2 种可能的读法要去辨别:
* StoreManager Name
* Store ManagerName
* 在有 4 个字的时候,例如, DollarStoreManagerName, 就有 (4-1)! = 6 种可
能的读法要去辨别。
* 在有 5 个字的时候,例如, CentralDollarStoreManagerName, 就有
(5-1)! = 24 种可能的读法要去辨别。
每多一个字的确会加入新的资讯,但也会提高阅读的困难度(复杂度超过工作记忆
区的容量,使得资讯变成了杂讯)。
我个人经验是「用 3 个字以下的变数名称」,如果要用到超过 3 个字,或许可以
想想否是能用其它方法(程式码架构、型别、注解、规格书、等等)来提供读者理
解程式码所需的上下文脉络。
# 是什麽( what )、为什麽( why )
以下这个案例很有趣:
*
https://github.com/EngTW/English-for-Programmers/issues/89
*
https://leetcode.com/problems/sum-of-all-odd-length-subarrays/
程式码本身是在实作从题目要求推导出来的解答算式。
在这个案例中,我发现要描述「这个变数『是什麽』」并不难,难的是让读者了解
「为什麽要有这个变数」。
最後我选择用注解的方式提示推导解答算式的方向,读者需要先了解解答算式,程
式码才会比较好懂。
相对之下,其它案例的变数的名称与实际使用情形多半可以说明该变数「是什麽」
及「为什麽」。
# 英文语法资料
## 位数
案例:
https://github.com/EngTW/English-for-Programmers/issues/79
* 个位: ones place 或 units place
* 个位数: ones digit 或 units digit
* 十位: tens place
* 十位数: tens digit
* 十分位: tenths place
* 十分位数: tenths digit
参考资料
*
https://en.wikipedia.org/wiki/Numerical_digit#Computation_of_place_values
## 上限、下限、包含、不含
案例:
https://github.com/EngTW/English-for-Programmers/issues/88
* 上限: upper bound 或 majorant
* 下限: lower bound 或 minorant
* 包含: inclusive
* 不含: exclusive
* 参考资料
*
https://en.wikipedia.org/wiki/Upper_and_lower_bounds
*
https://www.lexico.com/en/definition/inclusive
*
https://www.lexico.com/en/definition/exclusive
# 结语
* 因为是第一次进行这样的实验,所以选了 LeetCode 是 Easy 级解题率最高的
20 题。
* 从简单题目开始,容易掌控问题复杂度,适合新手学习者入门。
* 对进阶学习者来说, LeetCode 的程式架构变化少,学习效果可能有限。
* 题目定义明确,有共通的讨论基础。
* 就现今软体业求职面试文化来看,学习者投入「刷 LeetCode 」的成本容易回收。
* LeetCode 题目是以英文写成,也是练习英文的机会。
* 解答的首项要求是正确,再来是可读性,最後是效能(时间、空间)、程式码语
法的精练度。
读者如果有兴趣的话,可以 code review 一下这里列出来的 20 题 LeetCode 解
答,尤其是其「命名可读性」;或着,对 LeetCode 题目或解答中的任何英文用字
、语文解读有疑问的,也欢迎提出来讨论。
*
https://github.com/EngTW/English-for-Programmers/issues/69
在此感谢所有参与讨论的网友 :)
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 136.56.13.184 (美国)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Soft_Job/M.1604809565.A.3F9.html
1F:推 ucrxzero: 是说linux跟windows的命名浅规则也不同 这有考虑ㄇ 11/08 15:02
2F:→ ucrxzero: linux:my_name Windows:MyName 11/08 15:02
3F:→ x246libra: 微软有这个浅规则?那为什麽os大小写没区分,用git还 11/08 15:27
4F:→ x246libra: 需要另外设定 11/08 15:27
5F:推 ucrxzero: while Microsoft have always used capital letters for 11/08 15:47
6F:→ ucrxzero: the functions and classes 11/08 15:47
7F:→ ucrxzero: 我本身没再写Windows但Linux平田丰的书前面讲规则有提到 11/08 15:49
8F:→ ucrxzero: 一些命名差别,只是想问楼主的讨论有没有包括这部分 11/08 15:49
9F:→ ucrxzero: 我也没用小乌龟还是git bash都用linux command下的所以 11/08 15:50
10F:→ ucrxzero: 你说的我也听不懂 11/08 15:50
11F:推 wulouise: 档案命名规则跟实作不一样很正常吧 11/08 17:54
12F:推 wulouise: c#通常是camelCase, linux比较习惯 snake_case 11/08 17:58
13F:推 Bencrie: 潜规则 11/08 20:30
14F:推 CoNsTaR: 这篇重点完全不在名称格式的 convention 上吧... 11/08 21:02
15F:推 ucrxzero: 问问而已 11/08 21:15
我目前的研究方向倾向「命名的语意」 :)
例如,假设这里有个变数是用来表达「上限值,而且包含该上限值」,那麽,要怎
麽命名这个变数?我会用 "inclusive upper bound" 这三个字。
确定了 "inclusive upper bound" 这三个字後,再来是「命名的语法」;这里就
类似 ucrxzero 提到的「各社群、生态圈、专案会有它的潜规则」,
* 在 C# 专案里会写成 inclusiveUpperBound
* 在 Python 专案里会写成 inclusive_upper_bound
我个人的感觉是「命名的语法」比「命名的语意」容易掌握,因为「命名的语法」
的规则相对的单纯。
「命名的语意」倚重「对美式英语的语感」,是母语为中文的我们相对不熟的部分
,是故,我整理这类资料的方向倾向「命名的语意」,觉得那比较能帮到学习者 :)
※ 编辑: AmosYang (136.56.13.184 美国), 11/09/2020 06:09:50
公告一下 :)
https://github.com/EngTW/English-for-Programmers/issues/91
# 启用「释出(Release)」功能以减少通知信
以後主要的内容更新会以「释出(Release)」的方式通知,例如:
*
https://github.com/EngTW/English-for-Programmers/releases/tag/2020-11-07
这样子使用者可以选择 "Releases only" 的追踪(watch)选项,减少通知信。
---
很抱歉给有追踪 EngTW/English-for-Programmers 的各位带来了困扰 orz
※ 编辑: AmosYang (136.56.13.184 美国), 11/09/2020 06:44:47
16F:推 x246libra: 推 11/09 07:29
17F:推 kangan987: 推 11/09 07:53
18F:推 Ouranos: 必推,谢谢分享! 11/09 11:53
19F:推 jasonwung: 推 11/09 13:27
20F:推 y956403: 推 11/09 13:47
21F:推 mirror0227: 推 11/09 14:08
谢谢各位的欣赏 :)
※ 编辑: AmosYang (136.56.13.184 美国), 11/10/2020 04:13:28
22F:推 rei0: 推 11/10 13:00
23F:推 alimamado: 推 11/11 14:07
24F:推 Lhmstu: 推推 11/12 16:11
谢谢 :)
※ 编辑: AmosYang (136.56.13.184 美国), 11/17/2020 07:58:59
25F:推 showgunLa: 推推 11/21 08:56
26F:推 billy8407: 推,命名很重要 11/21 17:09
27F:推 iwillbehere: 推 12/01 17:13