吟安一個(gè)字,捻斷數(shù)莖須。
Two hard things :
- cache invalidate
- naming

一些個(gè)階段:
- 功能 work 的代碼
- 天花亂墜, 炫技的代碼
- 優(yōu)雅的代碼
- 易被讀懂的代碼
代碼功底亦是一種修行, 摸索階段總是琢磨著將功能實(shí)現(xiàn)了
后面開始接觸各大分支技術(shù), 有了一定沉淀, 閱讀了一些源碼, 優(yōu)秀框架后
會(huì)寫一些過度設(shè)計(jì), 天花亂墜, 炫技的代碼
而后大成, 寫的是 優(yōu)雅口口傳頌, 易被讀懂的代碼。
若將代碼比作武學(xué), 命名就是好內(nèi)功
張無忌獨(dú)步武林, 天賦異稟, 正是有九陽神功內(nèi)功加持打底
如果你也開始為一個(gè)命名思考了很久 ?
文言翻譯講究: 信達(dá)雅, 命名類似。
信
信: 信服
命名起碼應(yīng)該是準(zhǔn)確的。
如果寫一個(gè) 回調(diào), 我們會(huì)命名為 XXXListener, 然后定義 一個(gè) onXXX方法
而不會(huì)寫一個(gè) XXXResponser, XXXReactor
命名是要傳達(dá) context 的, 要遵傳彼此的習(xí)慣。
| 類型 | 類名可選后綴 |
|---|---|
| 控制類 | Processor、Manager、Engine、Center、Core、Reaper |
| 生產(chǎn)類 | Factory、Pool、Maker、Builder |
| 工具類 | Util、Helper |
| 數(shù)據(jù)類 | Bean、Request、Response、Query(名次表意即可) |
| 回調(diào)類 | Callback、Trigger、Listener、Handler |
| 監(jiān)控類 | Reporter、Metric、Tracker |
| 結(jié)構(gòu)類 | Wrapper、Iterator、Batch |
| 設(shè)計(jì)模式 | Adapter、Action、Command、Event、Delegate、Builder、Factory、Template、Proxy、Delegate |
以上是一些常見的命名習(xí)慣, 可以讓程序員心心相通
InsertCommend : 立刻明白這是一個(gè)命令模式, 是一個(gè) insert 的原子操作,整套架構(gòu)應(yīng)該是設(shè)計(jì)為一些 commend 來驅(qū)動(dòng)執(zhí)行
除了這些常用的后綴, 也要注意命名的詞性講究:
方法常用動(dòng)詞, 變量 :名詞/形容詞
如果是一個(gè)開關(guān):
這里可選表達(dá)很多, 很多情況根據(jù)語境, 最好使用形成規(guī)范, 統(tǒng)一個(gè)人風(fēng)格,閱讀起來爽很多
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 語句開關(guān)語境很合適的通用表達(dá),
理論上以上都可以, 但是 個(gè)人代碼風(fēng)格一致性尤為重要, 習(xí)慣統(tǒng)一尤為重要。
最好形成固定的表達(dá)方式, 來寫代碼。
請(qǐng)不要在 if 中寫很多邏輯, 取很多反
達(dá)
達(dá): 不拘,通達(dá)明白
達(dá)這里有一點(diǎn), 最小化信息傳遞原則, 如果你也害怕接受很多信息。
信息傳遞越多決策越難
我們的思維是 層層封裝,暴露最少信息, 彼此隔離, 借口層業(yè)務(wù)層。
怎么在代碼中做到傳遞最少信息:
比如: project aa; module: bb; 包目錄: article/query/ 下
寫請(qǐng)求相關(guān)Bean 類:
AABBArticleQuery
AABBArticleResponse
AABBArticleRequest
這就是浪費(fèi): 直接寫:
Query
Response
Request
project 包目錄 會(huì)傳遞很多 context
不要在命名中傳遞很多無用信息:
AABBArticleQuery
一個(gè) Bean 類, 長(zhǎng)命名, 導(dǎo)致的是對(duì)Bean類中成員的 調(diào)用 變得很惡心
表現(xiàn)在: 很長(zhǎng)串, 產(chǎn)生 厭煩
保持 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.
韻腳
枯藤老樹昏鴉,
小橋流水人家,
古道西風(fēng)瘦馬。
夕陽西下,
斷腸人在天涯。
每句末尾均壓一個(gè) a 韻
寫一個(gè)分支可以這樣:
feature_feed_fling_flavor
這個(gè)是意識(shí)形態(tài)的培養(yǎng), 并不是需要在代碼中這樣做。
用詞
組件, 開源組件命名可以具像化, 具像化的實(shí)物
飛書命名: Lark 云雀
Kotlin: 一個(gè)島名: Kotlin Island
sladar: 斯拉達(dá)(Slardar)是Dota2中的一位力量英雄。(字節(jié)系組件,網(wǎng)上可搜到避免敏感不闡述)
libra: 天秤座(字節(jié)系組件,網(wǎng)上可搜到避免敏感不闡述)
仔細(xì)品味下這幾個(gè)命名, 感覺還是很妙, 很有巧思。
動(dòng)植物、地點(diǎn)、人物名字、名畫 等
這里貼上 古希臘眾神:
古希臘眾神:
宙斯:(羅馬又稱朱庇特)Zeus,天神之父,地上萬物的最高統(tǒng)治者。
赫拉:(羅馬又稱朱諾)Hera,宙斯的姐姐與妻子。是女性的代表,掌管婚姻和生育。性格特征是嫉妒。
波塞冬:(羅馬又稱尼普東)Poseidon,海王,海洋和水域的一切主宰。
得墨忒耳:(羅馬又稱賽爾斯)Demeter,大地女神,司豐收。
哈底斯:(羅馬又稱普魯通)Hades,冥王,司掌冥界,統(tǒng)治陰暗的世界。
雅典娜:(羅馬又稱米諾娃)Athena,起初被視為女戰(zhàn)神,后逐漸變?yōu)橹腔叟窈脱诺涑堑氖刈o(hù)女神。
阿波羅:(羅馬也稱阿波羅)Apollo,在詩與藝術(shù)中表現(xiàn)為光明、青春和音樂之神,又是太陽神,與阿爾忒彌斯是孿生姐弟。
阿爾忒彌斯:(羅馬又稱狄安娜)Artemis ,月神,又是狩獵之神、婦女之神,是女性純潔的化身,與阿波羅是孿生姐弟。
狄俄尼索斯:(羅馬又稱巴克科斯)Dionysus,酒神與狂飲歡樂之神。
阿佛洛狄德:(羅馬又稱維納斯)Aphrodite,愛情女神。她的忠實(shí)隨從小愛神愛羅斯Eros(羅馬又稱邱比特)手持弓箭,被其金箭射中者即與隨后見到的第一個(gè)人墜入情網(wǎng),而被其鉛箭射中者會(huì)對(duì)另一個(gè)人產(chǎn)生莫名的仇恨。
赫斐斯托斯:(羅馬又稱烏爾肯)Hephaestus,火神和鍛冶之神。
阿瑞斯:(羅馬又稱瑪爾斯)Ares ,戰(zhàn)神。
星座
水瓶座 ? 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
最后, 命名是一個(gè)過程,是 life long journey 。