<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          50 萬(wàn)行代碼喂出來(lái)的一些編程經(jīng)驗(yàn)

          共 1721字,需瀏覽 4分鐘

           ·

          2022-06-10 05:11

          踏入職場(chǎng)后寫(xiě)代碼已經(jīng)有 14 個(gè)年頭,保守估計(jì)應(yīng)該壘了有 50 萬(wàn)行的代碼。尤其最近 1 年多從 0 開(kāi)始寫(xiě)起 Bytebase,日常也會(huì) review 同事的代碼。趁著端午也總結(jié)了一些經(jīng)驗(yàn),這些經(jīng)驗(yàn)聚焦在寫(xiě)代碼的具體細(xì)節(jié)上,在道,法,術(shù),技中更多歸之于技。首先聲明這些技是用來(lái)幫助寫(xiě)出更可維護(hù)的代碼,而不是更快地寫(xiě)出代碼,Enjoy。


          命名篇


          1. 字母使用小寫(xiě)。有些系統(tǒng)對(duì)大小寫(xiě)不敏感。

          2. 名詞使用單數(shù)。英文的復(fù)數(shù)規(guī)則比較復(fù)雜,尤其對(duì)于英語(yǔ)非母語(yǔ)程序員來(lái)說(shuō),用復(fù)數(shù)容易造成代碼命名不一致。如果是表示數(shù)組的話,可以加上 List 后綴。

          3. 動(dòng)詞使用一般時(shí)態(tài)。同樣英文的動(dòng)詞被動(dòng)時(shí)態(tài)規(guī)則也有好多種,使用被動(dòng)時(shí)態(tài)容易造成命名不一致。

          4. 使用 Reversed domain name notation (reverse-DNS) 來(lái)命名。比如在 Bytebase 里定義 issue 創(chuàng)建這個(gè)活動(dòng),我們可以用 bb.issue.create。而成員的創(chuàng)建可以用 bb.member.create。名字定義本身包含了結(jié)構(gòu),具備更好的可讀性,同時(shí)搜索的時(shí)候也可以使用 bb.member 這樣的前綴搜索。


          范式篇


          1. 使用 Command Pattern,把每一個(gè)變更的行為都包裝成一個(gè) Command,具體 Command 的名字定義使用前面提到的 reversed domain name notation。這樣的好處是我們能提取出一個(gè)中央的組件來(lái)處理這些命令,像 undo/redo, logging 這些就變得相當(dāng)容易。絕大多數(shù)應(yīng)用框架其實(shí)都有 Command Pattern 的身影。

          2. 考慮使用 Soft Delete 而不是 Hard Delete,通常在數(shù)據(jù)庫(kù)表結(jié)構(gòu)里加上一列 status, 其中一個(gè)值是 PENDING_DELETE,可以有效防止誤操作,讓 undo 的實(shí)現(xiàn)也變得簡(jiǎn)單。

          3. 除非有必須的理由,盡量避免持久化狀態(tài)。持久化狀態(tài)會(huì)大大增加將來(lái)遷移和升級(jí)的復(fù)雜度。


          架構(gòu)設(shè)計(jì)篇


          1. 先設(shè)計(jì) Schema / 領(lǐng)域建模,再設(shè)計(jì) API,再其他。

          2. Schema / 領(lǐng)域建模設(shè)計(jì)的 4 個(gè)要點(diǎn),對(duì)象本身,對(duì)象的行為,對(duì)象的約束以及對(duì)象間的關(guān)系。

          3. 培養(yǎng)使用 namespace 的意識(shí)。namespace 能幫助更好地做模塊設(shè)計(jì),前面提到的 reversed domain name notation 就是 namespace 的一種運(yùn)用。

          4. 大型項(xiàng)目需要盡早采用 Plugin 架構(gòu),區(qū)分 Core 和 Plugin 部分。Linux 的 Core 其實(shí)不大,絕大多數(shù)都是 Driver 代碼 (Plugin 的一種類(lèi)型)。Bytebase 的代碼也做了類(lèi)似的拆分。


          ?

          技術(shù)選型篇


          ?

          1. 使用 Restful 而不是 GraphQL。

            1. RESTful 是更成熟的技術(shù),有成熟的生態(tài)。

            2. RESTful 幫助團(tuán)隊(duì)更早關(guān)注領(lǐng)域建模,因?yàn)樾枰R(shí)別出對(duì)象以及對(duì)象上的行為。

            3. RESTful 幫助架構(gòu)做更好的分層。RESTful 定義了更加克制的接口,界定了前后端的邊界。而 GraphQL 很容易穿透界定的邊界和抽象。

          2. 使用關(guān)系型數(shù)據(jù)庫(kù)而不是 NoSQL。

          3. 想走得快用 MySQL,要走得遠(yuǎn)用 PostgreSQL。

          4. 除非業(yè)務(wù)本身需要對(duì)接多種數(shù)據(jù)庫(kù),否則謹(jǐn)慎考慮使用 ORM。ORM 通常只支持所有數(shù)據(jù)庫(kù)功能的最大公約數(shù),一些特色功能要么不支持,要么要用晦澀的語(yǔ)法。而且你無(wú)法精確控制生成的 SQL,影響代碼可讀性。

          5. 新的后端項(xiàng)目?jī)?yōu)先考慮使用 Go

          ?

          最后


          寫(xiě)代碼,正確性是第一位的,可讀性是第二位的,性能是最末位的。糟糕的程序員也能寫(xiě)出機(jī)器能執(zhí)行的代碼,合格的程序員要寫(xiě)別人能理解的代碼。


          代碼寫(xiě)得好用處本身并不大。技術(shù)總是服務(wù)于業(yè)務(wù)的,要結(jié)合業(yè)務(wù)理解寫(xiě)代碼。最好的解法是不加任何額外的代碼就能解決業(yè)務(wù)問(wèn)題,而能勝過(guò)這個(gè)解法的則是通過(guò)減少代碼來(lái)解決問(wèn)題。


          Deleted code is debugged code.




          上面提到的觀點(diǎn)在 Bytebase 中也有不少實(shí)踐,感興趣可以翻閱我們的代碼:

          https://github.com/bytebase/bytebase

          瀏覽 85
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  蜜桃av噜噜一区二区三区麻豆 | 毛片在线看片 | аⅴ资源天堂资源库在线 | 成人做爰www看视频软件 | 爱爱网免费视频 |