<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>

          Go中面向包的設(shè)計(jì)

          共 4103字,需瀏覽 9分鐘

           ·

          2021-10-08 21:25

          目錄
          • 前言

          • 鏈接

          • 歷史

          • 語(yǔ)言機(jī)制

          • 包的設(shè)計(jì)哲學(xué)

          • 項(xiàng)目結(jié)構(gòu)

          • 驗(yàn)證

            • 驗(yàn)證包的位置

            • 驗(yàn)證依賴項(xiàng)

            • 驗(yàn)證正在實(shí)施的策略

            • 驗(yàn)證接受/返回?cái)?shù)據(jù)的方式

            • 驗(yàn)證如何處理錯(cuò)誤

            • 驗(yàn)證測(cè)試

            • 驗(yàn)證recover和panic

          前言

          文章翻譯自:https://github.com/ardanlabs/gotraining/tree/master/topics/go/design/packaging,屬于由于gotraining系列的design/packaging篇,本人翻譯水平,覺(jué)得翻譯不當(dāng)之處煩請(qǐng)指出。謝謝。

          面向包的設(shè)計(jì)允許開(kāi)發(fā)人員確定一個(gè)包在Go項(xiàng)目中的位置,并且該包必須遵守設(shè)計(jì)準(zhǔn)則。它定義了什么是Go項(xiàng)目以及Go項(xiàng)目是如何構(gòu)建起來(lái)的。最后,它增強(qiáng)了團(tuán)隊(duì)成員之間的溝通交流,促進(jìn)了整潔的包設(shè)計(jì)和項(xiàng)目架構(gòu)。

          鏈接

          可以參考閱讀下面文章

          包設(shè)計(jì)理念

          • Design Philosophy On Packaging[1]?- William Kennedy

          面向包設(shè)計(jì)

          • Package Oriented Design[2]?- William Kennedy

          歷史

          在2000年 Mihai Budiu 對(duì) Brian Kernighan 的采訪中,Brian 被問(wèn)到以下問(wèn)題:

          “Can you tell us about the worse features of C, from your point of view”?

          “從你的角度來(lái)看,你能告訴我們 c 語(yǔ)言最糟糕的特性是什么嗎?”?

          以下是Brian的回答:

          I think that the real problem with C is that it doesn’t give you enough mechanisms for structuring really big programs, for creating "firewalls" within programs so you can keep the various pieces apart. It’s not that you can’t do all of these things, that you can’t simulate object-oriented programming or other methodology you want in C. You can simulate it, but the compiler, the language itself isn’t giving you any help.”

          我認(rèn)為 c 語(yǔ)言的真正問(wèn)題在于它沒(méi)有提供足夠的機(jī)制來(lái)構(gòu)造真正的大型程序,在程序中創(chuàng)建“防火墻”,這樣就可以將各個(gè)部分分開(kāi)。并不是說(shuō)你不能做所有這些事情,也不是說(shuō)你不能在 c 語(yǔ)言中模擬面向?qū)ο蟪绦蛟O(shè)計(jì)或者其他你想要的方法。你可以模擬它,但是編譯器,語(yǔ)言本身不會(huì)給你任何幫助。

          語(yǔ)言機(jī)制

          • 直接使用包與我們學(xué)習(xí)如何用其他語(yǔ)言組織源代碼相沖突
          • 在其他語(yǔ)言中,包的設(shè)計(jì)是一種可以選擇使用或忽略的特性
          • 您可以將包的設(shè)計(jì)看作是在源代碼樹(shù)上應(yīng)用微服務(wù)的思想
          • 所有包都是“ first class”,唯一的層次結(jié)構(gòu)是在項(xiàng)目的源代碼樹(shù)中定義的內(nèi)容
          • 需要有一種方式將包的一部分“暴露”給外面
          • 兩個(gè)軟件包不能相互交叉引入。引入是單向的。

          包的設(shè)計(jì)哲學(xué)

          • 為了達(dá)到目的,包是需要提供其他使用的,而不是包含
            • 包的命名必須帶有描述它所提供的內(nèi)容的意圖
            • 包決不能成為各種不同問(wèn)題的傾倒場(chǎng)
          • 為了便于使用,包必須以使用者為中心來(lái)設(shè)計(jì)封裝
            • 包必須是直觀的和簡(jiǎn)單的使用
            • 包必須尊重它們對(duì)資源和性能的影響
            • 包必須保護(hù)用戶的應(yīng)用程序不受級(jí)聯(lián)更改帶來(lái)的影響
            • 包必須防止對(duì)具體類型斷言的需要
            • 包必須減少、最小化和簡(jiǎn)化其代碼庫(kù)
          • 為了便于移植,包的設(shè)計(jì)必須考慮到可重用性
            • 包必須追求最高級(jí)別的可移植性
            • 包必須減少設(shè)置策略,當(dāng)它是合理的且實(shí)用
            • 不能成為單一的依賴點(diǎn)

          項(xiàng)目結(jié)構(gòu)

          Kit?????????????????????Application

          ├──?CONTRIBUTORS????????├──?cmd/
          ├──?LICENSE?????????????├──?internal/
          ├──?README.md???????????│???└──?platform/
          ├──?cfg/????????????????└──?vendor/
          ├──?examples/
          ├──?log/
          ├──?pool/
          ├──?tcp/
          ├──?timezone/
          ├──?udp/
          └──?web/
          • vendor/

            vendor文件夾的比較好的參考文檔可以在 Daniel Theophanes 的 Gopher Academy 文章?Understanding and using the vendor folder[3]中找到。為了這篇文章的目的,第三方軟件包的所有源代碼都需要轉(zhuǎn)移(或復(fù)制)到vendor文件夾中。包括將從公司 Kit 項(xiàng)目中使用的包。也會(huì)將 Kit 項(xiàng)目中的軟件包視為第三方軟件包。

          • cmd/

            cmd/這個(gè)項(xiàng)目擁有的所有程序都在cmd/文件夾下。cmd/下的文件夾總是會(huì)為將要生成的每個(gè)程序命名。使用程序文件夾末尾的字母 d 表示它為守護(hù)進(jìn)程。每個(gè)文件夾都有一個(gè)包含main包的相匹配的源代碼文件。

          • internal/

            需要由項(xiàng)目中的多個(gè)程序?qū)氲?code style="font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-top-left-radius: 4px;border-top-right-radius: 4px;border-bottom-right-radius: 4px;border-bottom-left-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(60, 112, 198);">internal/包屬于internal/文件夾。使用internal/這個(gè)名稱的一個(gè)好處是,項(xiàng)目從編譯器那里得到了額外的保護(hù)。這個(gè)項(xiàng)目之外的任何包都不能從internal/導(dǎo)入包。因此,這些軟件包只屬于這個(gè)項(xiàng)目的內(nèi)部。

          • internal/platform/

            基礎(chǔ)的但對(duì)于項(xiàng)目來(lái)說(shuō)是特定的它會(huì)歸為internal/platform/?文件夾。這些包可以為數(shù)據(jù)庫(kù)、身份驗(yàn)證甚至序列化處理等提供支持。

          驗(yàn)證

          面向包設(shè)計(jì)的一個(gè)重要方面是去驗(yàn)證包設(shè)計(jì)的能力。這是可能的,因?yàn)楦鶕?jù)包在項(xiàng)目中的位置與包相關(guān)聯(lián)的準(zhǔn)則。有七個(gè)驗(yàn)證步驟可幫助你識(shí)別設(shè)計(jì)問(wèn)題。

          驗(yàn)證包的位置

          • Kit
            • 為現(xiàn)有不同項(xiàng)目提供基本支持的軟件包
            • 日志、配置或網(wǎng)絡(luò)功能
          • cmd/
            • 為正在構(gòu)建的特定程序提供支持的包
            • 啟動(dòng),關(guān)閉和配置
          • internal/
            • 為項(xiàng)目擁有的不同程序提供支持的包
            • CRUD,服務(wù)或業(yè)務(wù)邏輯
          • internal/platform/
            • 為項(xiàng)目提供內(nèi)部基本支持的包
            • 數(shù)據(jù)庫(kù)、身份驗(yàn)證或序列化處理

          驗(yàn)證依賴項(xiàng)

          • All
            • 要質(zhì)疑當(dāng)前這些軟件包的設(shè)計(jì)選擇
            • 如果合理的話,將包移動(dòng)到要導(dǎo)入包的源代碼樹(shù)中
            • 使用source tree來(lái)顯示依賴關(guān)系
            • 驗(yàn)證每個(gè)依賴項(xiàng)的成本/收益
            • 為了共用現(xiàn)有類型要質(zhì)疑導(dǎo)入
            • 對(duì)同一級(jí)別其他包的導(dǎo)入問(wèn)題
            • 如果一個(gè)包想要導(dǎo)入另一個(gè)同級(jí)別的包:
          • internal/
            • cmd/
            • 不能導(dǎo)入來(lái)自這些位置的包:
          • internal/platform/
            • cmd/
            • internal/
            • 不能導(dǎo)入來(lái)自這些位置的包:

          驗(yàn)證正在實(shí)施的策略

          • Kit?、internal/platform/
            • 不允許對(duì)任何應(yīng)用程序問(wèn)題制定策略
            • 不允許記錄,但必須解耦對(duì)追蹤信息的訪問(wèn)
            • 配置和運(yùn)行時(shí)更改必須解耦
            • 檢索指標(biāo)和遙測(cè)值必須解耦
          • cmd/internal/
            • 允許對(duì)任何應(yīng)用程序問(wèn)題設(shè)置策略
            • 允許以本機(jī)方式記錄和處理配置

          驗(yàn)證接受/返回?cái)?shù)據(jù)的方式

          • All
            • 現(xiàn)有類型可能不再適合使用
            • 驗(yàn)證給定類型的 值/指針 語(yǔ)義的一致使用
            • 當(dāng)使用接口類型接受值時(shí),重點(diǎn)必須放在所需的方法上,而不是值本身
            • 如果不需要方法,則使用具體類型
            • 在合理的情況下,在聲明新類型之前使用現(xiàn)有類型
            • 問(wèn)題類型來(lái)源于暴漏給導(dǎo)出 API 中的依賴項(xiàng)

          驗(yàn)證如何處理錯(cuò)誤

          • All
            • 錯(cuò)誤已被記錄
            • 應(yīng)用程序恢復(fù)到了100% 完整性
            • 不再報(bào)告當(dāng)前錯(cuò)誤
            • 處理錯(cuò)誤意味著:
          • Kit
            • 應(yīng)用程序中不允許panic
            • 不允許包裝錯(cuò)誤
            • 只返回根源錯(cuò)誤值
          • cmd/
            • 允許在應(yīng)用程序中使用panic
            • 如果未處理,可以用上下文包裝錯(cuò)誤
            • 大多數(shù)處理錯(cuò)誤發(fā)生在這里
          • internal/
            • 應(yīng)用程序中不允許panic
            • 如果未處理,可以用上下文包裝錯(cuò)誤
            • 少數(shù)處理錯(cuò)誤發(fā)生在這里
          • internal/platform/
            • 應(yīng)用程序中不允許panic
            • 不允許包裝錯(cuò)誤
            • 只返回根源錯(cuò)誤值

          驗(yàn)證測(cè)試

          • cmd/
            • 允許使用第三方測(cè)試包
            • 可以有一個(gè)用于測(cè)試的test文件夾
            • 與單元測(cè)試相比,更要多關(guān)注集成測(cè)試
          • kit/,?internal/,internal/platform/
            • 在Go中堅(jiān)持testing包
            • 測(cè)試文件屬于包
            • 更多地關(guān)注單元測(cè)試而不是集成測(cè)試

          驗(yàn)證recover和panic

          • cmd/
            • 可以recover任何panic
            • 只有當(dāng)系統(tǒng)可以恢復(fù)到100% 完整時(shí)
          • kit/,internal/,internal/platform/
            • goroutine 歸一個(gè)包所有
            • 可以給應(yīng)用程序提供一個(gè)關(guān)于panic的事件
            • 不能從panic中恢復(fù),除非:

          參考資料

          [1]?

          Design Philosophy On Packaging:?https://www.ardanlabs.com/blog/2017/02/design-philosophy-on-packaging.html

          [2]?

          Package Oriented Design:?https://www.ardanlabs.com/blog/2017/02/package-oriented-design.html

          [3]?

          Understanding and using the vendor folder:?https://blog.gopheracademy.com/advent-2015/vendor-folder/



          推薦閱讀


          福利

          我為大家整理了一份從入門(mén)到進(jìn)階的Go學(xué)習(xí)資料禮包,包含學(xué)習(xí)建議:入門(mén)看什么,進(jìn)階看什么。關(guān)注公眾號(hào) 「polarisxu」,回復(fù)?ebook?獲取;還可以回復(fù)「進(jìn)群」,和數(shù)萬(wàn) Gopher 交流學(xué)習(xí)。


          瀏覽 43
          點(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>
                  国产寡妇亲子伦一区二区三区四区 | 日韩一级免费的视频 | 久久精品国产99国产精品导航 | 中国婬乱a—级毛片多女 | 国产黄色片在线免费观看 |