吟安一个字,捻断数茎须。
Two hard things :
- cache invalidate
- naming
一些个阶段:
- 功能 work 的代码
- 天花乱坠, 炫技的代码
- 优雅的代码
- 易被读懂的代码
代码功底亦是一种修行, 摸索阶段总是琢磨着将功能实现了
后面开始接触各大分支技术, 有了一定沉淀, 阅读了一些源码, 优秀框架后
会写一些过度设计, 天花乱坠, 炫技的代码
而后大成, 写的是 优雅口口传颂, 易被读懂的代码。
若将代码比作武学, 命名就是好内功
张无忌独步武林, 天赋异禀, 正是有九阳神功内功加持打底
如果你也开始为一个命名思考了很久 ?
文言翻译讲究: 信达雅, 命名类似。
信
信: 信服
命名起码应该是准确的。
如果写一个 回调, 我们会命名为 XXXListener, 然后定义 一个 onXXX方法
而不会写一个 XXXResponser, XXXReactor
命名是要传达 context 的, 要遵传彼此的习惯。
类型 | 类名可选后缀 |
---|---|
控制类 | Processor、Manager、Engine、Center、Core、Reaper |
生产类 | Factory、Pool、Maker、Builder |
工具类 | Util、Helper |
数据类 | Bean、Request、Response、Query(名次表意即可) |
回调类 | Callback、Trigger、Listener、Handler |
监控类 | Reporter、Metric、Tracker |
结构类 | Wrapper、Iterator、Batch |
设计模式 | Adapter、Action、Command、Event、Delegate、Builder、Factory、Template、Proxy、Delegate |
以上是一些常见的命名习惯, 可以让程序员心心相通
InsertCommend : 立刻明白这是一个命令模式, 是一个 insert 的原子操作,整套架构应该是设计为一些 commend 来驱动执行
除了这些常用的后缀, 也要注意命名的词性讲究:
方法常用动词, 变量 :名词/形容词
如果是一个开关:
这里可选表达很多, 很多情况根据语境, 最好使用形成规范, 统一个人风格,阅读起来爽很多
if (enableAFeature) {
doAThing();
}
if (aFeatureEnable) {
doAThing();
}
if (aFeatureValid) {
doAThing();
}
if (isAFeature) {
doAThing();
}
if (useAFeature) {
doAThing();
}
if (aFeatureSwitchOn) {
doAThing();
}
if (disableAFeature) {
doAThing();
}
if (aFeatureDisable) {
doAThing();
}
if (aFeatureInValid) {
doAThing();
}
if (notAFeature) {
doAThing();
}
if (aFeatureSwitchOff) {
doAThing();
}
相比之下 switchOn , switchOff 是 if 语句开关语境很合适的通用表达,
理论上以上都可以, 但是 个人代码风格一致性尤为重要, 习惯统一尤为重要。
最好形成固定的表达方式, 来写代码。
请不要在 if 中写很多逻辑, 取很多反
达
达: 不拘,通达明白
达这里有一点, 最小化信息传递原则, 如果你也害怕接受很多信息。
信息传递越多决策越难
我们的思维是 层层封装,暴露最少信息, 彼此隔离, 借口层业务层。
怎么在代码中做到传递最少信息:
比如: project aa; module: bb; 包目录: article/query/ 下
写请求相关Bean 类:
AABBArticleQuery
AABBArticleResponse
AABBArticleRequest
这就是浪费: 直接写:
Query
Response
Request
project 包目录 会传递很多 context
不要在命名中传递很多无用信息:
AABBArticleQuery
一个 Bean 类, 长命名, 导致的是对Bean类中成员的 调用 变得很恶心
表现在: 很长串, 产生 厌烦
保持 clean , 使代码看起来 清晰明了
雅
雅: 雅致
雅致的命名使得代码变得文雅, 读起来不容易 wtf
记得高中英语老师将莎士比亚十四行诗来作为大家晨读英语的材料
Shall I compare thee to a summer's day?
Thou art more lovely and more temperate.
Rough winds do shake the darling buds of May,
And summer's lease hath all too short a date.
韵脚
枯藤老树昏鸦,
小桥流水人家,
古道西风瘦马。
夕阳西下,
断肠人在天涯。
每句末尾均压一个 a 韵
写一个分支可以这样:
feature_feed_fling_flavor
这个是意识形态的培养, 并不是需要在代码中这样做。
用词
组件, 开源组件命名可以具像化, 具像化的实物
飞书命名: Lark 云雀
Kotlin: 一个岛名: Kotlin Island
sladar: 斯拉达(Slardar)是Dota2中的一位力量英雄。(字节系组件,网上可搜到避免敏感不阐述)
libra: 天秤座(字节系组件,网上可搜到避免敏感不阐述)
仔细品味下这几个命名, 感觉还是很妙, 很有巧思。
动植物、地点、人物名字、名画 等
这里贴上 古希腊众神:
古希腊众神:
宙斯:(罗马又称朱庇特)Zeus,天神之父,地上万物的最高统治者。
赫拉:(罗马又称朱诺)Hera,宙斯的姐姐与妻子。是女性的代表,掌管婚姻和生育。性格特征是嫉妒。
波塞冬:(罗马又称尼普东)Poseidon,海王,海洋和水域的一切主宰。
得墨忒耳:(罗马又称赛尔斯)Demeter,大地女神,司丰收。
哈底斯:(罗马又称普鲁通)Hades,冥王,司掌冥界,统治阴暗的世界。
雅典娜:(罗马又称米诺娃)Athena,起初被视为女战神,后逐渐变为智慧女神和雅典城的守护女神。
阿波罗:(罗马也称阿波罗)Apollo,在诗与艺术中表现为光明、青春和音乐之神,又是太阳神,与阿尔忒弥斯是孪生姐弟。
阿尔忒弥斯:(罗马又称狄安娜)Artemis ,月神,又是狩猎之神、妇女之神,是女性纯洁的化身,与阿波罗是孪生姐弟。
狄俄尼索斯:(罗马又称巴克科斯)Dionysus,酒神与狂饮欢乐之神。
阿佛洛狄德:(罗马又称维纳斯)Aphrodite,爱情女神。她的忠实随从小爱神爱罗斯Eros(罗马又称邱比特)手持弓箭,被其金箭射中者即与随后见到的第一个人坠入情网,而被其铅箭射中者会对另一个人产生莫名的仇恨。
赫斐斯托斯:(罗马又称乌尔肯)Hephaestus,火神和锻冶之神。
阿瑞斯:(罗马又称玛尔斯)Ares ,战神。
星座
水瓶座 ♒ Aquarius Water Carrier / Water Bearer
雙魚座 ♓ Pisces Fish / Fishes
牧羊座 ♈ Aries Ram
金牛座 ♉ Taurus Bull
雙子座 ♊ Gemini Twins
巨蟹座 ♋ Cancer Crab
獅子座 ♌ Leo Lion
處女座 ♍ Virgo Virgin
天秤座 ♎ Libra Scales / Balance
天蠍座 ♏ Scorpio Scorpion
射手座 ♐ Sagittarius Archer
摩羯座 ♑ Capricorn Goat / Sea Goat
参考: https://juejin.cn/post/6995342820512890893#heading-14
最后, 命名是一个过程,是 life long journey 。