精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

六個常見的 Go 接口設計錯誤

開發 前端
今天這篇文章給大家介紹了六種常見的接口設計錯誤:創建了太多的接口、方法太多了、沒有編寫行為驅動的接口、在生產者端編寫接口、正在返回接口、沒有驗證接口合規性。

Go 是一門新興的語言,如果你正在使用它,很可能這不是你的第一門編程語言。

從不同的語言背景轉來,你帶來了自己的既有經驗和范式。你在以前的語言中習慣做的事情,在 Go 中可能并不是一個好的方式。

學習 Go 不僅僅是學習一種新的語法。它還涉及到學習一種新的程序思維方式。

一些理論知識

Go 創始人 Rob Pike 曾經說過:“Go 的接口并不是 Java 或 C# 接口的變種,而是更多。它們是大規模編程和適應性強的進化設計關鍵。”

圖片圖片

正確使用接口可以帶來簡單性、可讀性和更靈活的代碼設計。(不正確使用會帶來新的災難)

以下是建議了解的基本原則 TOP3:

  • 接口隔離原則:客戶端永遠不應該被迫實現它不使用的接口,或者客戶端不應該被迫依賴它們不使用的方法。
  • 多態性:一段代碼根據它接收到的具體數據改變其行為。
  • 里氏替換原則:如果你的代碼依賴于一個抽象,一個實現可以被另一個實現替換,而不需要改變你的代碼。

常見接口設計錯誤

1. 你創建了太多的接口

擁有過多接口的情況叫做:接口污染。當你在編寫具體類型之前就開始抽象時,就會出現這種情況。

由于無法預知需要哪些抽象,因此很容易編寫出過多的接口,而這些接口在日后要么是錯誤的,要么是無用的。

Go 創始人給出了一個很棒的指導方針幫助我們避免接口污染。如下:

不要使用接口設計,而是發現它們(Don’t design with interfaces, discover them.) —— Rob Pike

Rob 在這里指出的是:你不需要提前考慮你需要什么抽象。你可以從具體的結構體開始設計,并在設計需要時只創建接口。通過這樣做,你的代碼會有機地增長到預期的設計。

但我仍然看到人們提前創建接口,因為他們認為他們將來可能需要多個實現。

對于他們,我要說:

圖片圖片

懶惰但要懶惰得好。創建接口的完美時機是當你真正需要它的時候,而不是當你預測你需要它的時候。

無用的接口往往只有一個實現。它們只是增加了一個額外的間接層,迫使程序員在他們實際上想要去實現時總是要通過這一層。

一個接口有一個成本:它是你在推理你的代碼時需要記住的一個新概念。正如 Djikstra 所說,一個理想的接口必須是:“一個可以絕對精確的新語義層面。”

所以在創建接口之前問問自己:你有多個接口的實現嗎?我強調了 “有”,因為 “將有” 意味著你可以預測未來,而你不能。

2. 你的方法太多了

在 PHP 項目中看到 10 個方法的接口是很典型的。在 Go 中,接口很小,標準庫中所有接口的平均方法數是 2。

“越大的接口抽象就越弱”,這是 Go 諺語之一。正如 Rob Pike 所說,這是關于接口最重要的事情,這意味著接口越小,它就越有用。

一個接口可以有的實現越多,它就越通用。如果你有一個包含大量方法的接口,就很難有多個實現。

你擁有的方法越多,接口就越具體。接口越具體,不同類型的機會就越小,它們可以顯示相同的行為。

io.Reader 和 io.Writer 就是有用接口的一個很好的例子,它們有數以百計的實現。或者是最經典的 error 接口,它非常強大,可以在 Go 中實現整個錯誤處理。

記住,你可以從其他接口組合一個接口。這里有一個例子:ReadWriteCloser 由 3 個較小的接口組成。

代碼如下:

type ReadWriteCloser interface {
    io.Reader
    io.Writer
    io.Closer
}

3. 你沒有編寫行為驅動的接口

在傳統語言中,諸如 User、Request 等名詞性接口非常常見。而在 Go 語言中,大多數接口都有后綴:Reader、Writer、Closer 等。這是因為,在 Go 中,接口暴露了行為,而它們的名稱則指向該行為。

在 Go 中定義接口時,你定義的不是 "某物是什么",而是 "它提供了什么"-- 是 "行為",而不是 "事物"!

這就是為什么 Go 中沒有 File 接口,但有Reader 和 Writer:這些都是行為,而 File 是實現 Reader 和 Writer 的事物。

《Effective Go》也提到了同樣的觀點:

Go 中的接口提供了一種指定對象行為的方法:如果某個東西可以做到這一點,那么它就可以用在這里。

在編寫接口時,盡量考慮動作或行為。如果你定義了一個名為 "Thing" 的接口,問問自己為什么這個 "Thing" 不是一個結構體。

4. 你在生產者端編寫接口

我經常在代碼審查中看到這種情況:很多開發者在同一個包,既寫了具體的實現,又定義了接口。

生產者定義的接口生產者定義的接口

但是,也許客戶端并不想使用生產者接口中的所有方法。請記住 "接口隔離原則" 中的一句話:"不應強迫客戶端實現其不使用的方法"。

下面是一個例子:

package main

// ====== producer side

// This interface is not needed
type UsersRepository interface {
    GetAllUsers()
    GetUser(id string)
}

type UserRepository struct {
}

func (UserRepository) GetAllUsers()      {}
func (UserRepository) GetUser(id string) {}

// ====== client side

// Client only needs GetUser and
// can create this interface implicitly implemented
// by concrete UserRepository on his side
type UserGetter interface {
    GetUser(id string)
}

如果客戶端想使用生產者的所有方法,可以使用具體的結構體。因為結構體方法已經提供了這些行為。

即使客戶端想要解耦代碼并使用多種實現,他也可以在自己這邊創建一個包含所有方法的接口:

在客戶端定義的接口在客戶端定義的接口

由于 Go 中的接口是隱式滿足的,所以這些事情才得以實現。客戶端代碼不再需要導入某個接口并編寫實現,因為 Go 中沒有這樣的關鍵字。

如果實現與接口有相同的方法,那么實現就已經滿足了該接口,可以在客戶端代碼中使用。

5. 你正在返回接口

如果一個方法返回的是接口而不是具體的結構,那么調用該方法的所有客戶端都將被迫使用相同的抽象。

你需要讓客戶端決定他們需要什么樣的抽象,因為代碼是他們的庭院。

當你想使用結構體中的某項功能時,卻因為接口沒有公開它而無法使用,這是很煩人的。這種限制可能是有原因的,但并非總是如此。

下面是一個人為的例子:

type Shape interface {
    Area() float64
    Perimeter() float64
}

type Circle struct {
    Radius float64
}

func (c Circle) Area() float64 {
    return math.Pi * c.Radius * c.Radius
}

func (c Circle) Perimeter() float64 {
    return 2 * math.Pi * c.Radius
}

// NewCircle returns an interface instead of struct
func NewCircle(radius float64) Shape {
    return Circle{Radius: radius}
}

func main() {
    circle := NewCircle(5)

    // we lose access to circle.Radius
}

在上面的示例中,我們不僅無法訪問 circle.Radius,而且每次要訪問它時都需要在代碼中添加類型斷言:

shape := NewCircle(5)

if circle, ok := shape.(Circle); ok {
    fmt.Println(circle.Radius)
}

因此在設計上,請遵循 Postel 定律:“發送時要保守,接受時要寬松”,從方法中返回具體的結構,并選擇接受接口。

結合現實的代碼,例如原本的代碼是:

// Save writes the contents of doc to the file f.
func Save(f *os.File, doc *Document) error

但入參是 f *os.File,這并不靈活,也不便于測試。我們可以通過上面提到的接口方式,改造為如下代碼:

// Save writes the contents of doc to the supplied
// Writer.
func Save(w io.Writer, doc *Document) error

6. 你沒有驗證接口合規性

假設一個場景,你有一個導出名為 User 的類型的軟件包,你實現了 Stringer 接口。

因為出于某種業務原因,當你打印時,你不希望顯示 email 字段。需要如此實現邏輯:

package users

type User struct {
    Name  string
    Email string
}

func (u User) String() string {
    return u.Name
}

客戶端的代碼如下:

package main

import (
    "fmt"

    "pkg/users"
)

func main() {
    u := users.User{
       Name:  "腦子進煎魚了",
       Email: "xxx@gmail.com",
    }
    fmt.Printf("%s", u)
}

這將正確輸出:腦子進煎魚了。

現在,假設你進行了重構,不小心刪除或注釋了 String() 的實現,你的代碼看起來就像這樣:

package users

type User struct {
    Name  string
    Email string
}

在這種情況下,您的代碼仍然可以編譯和運行,但輸出結果將是 {腦子進煎魚了 xxx@gmail.com}。沒有任何程序反饋來提示你出現了問題。編譯器也不會報錯。

這種場景下,為了強制校驗某個類型是否實現了某個接口,我們可以這樣做:

package users

import "fmt"

type User struct {
    Name  string
    Email string
}

var _ fmt.Stringer = User{} // User implements the fmt.Stringer

func (u User) String() string {
    return u.Name
}

我們再嘗試一次。現在如果我們刪除 String() 方法,就會在構建時得到如下結果:

cannot use User{} (value of type User) as fmt.Stringer value in variable declaration: User does not implement fmt.Stringer (missing method String)

在該行中,我們試圖將一個空的 User{} 賦值給一個 fmt.Stringer類型的變量。由于 User{} 不再實現 fmt.Stringer,我們得到了程序的報錯反饋。

我們在變量名中使用了 _,因為我們并沒有真正使用它,所以不會執行真正的分配。

上面我們看到 User 實現了接口。User 和 *User 是不同的類型。因此,如果你想讓 *User 實現它,你可以這樣實現:

var _ fmt.Stringer = (*User)(nil) // *User implements the fmt.Stringer

并且通過這種實現,IDE 會顯式提示我們的方法是否有缺失。少了的話會有報錯提示:

圖片圖片

還是非常方便的。當然,這個小技巧,不需要對每個實現接口的類型都這樣做,根據需求對于有必要強校驗的接口即可。

總結

今天這篇文章給大家介紹了六種常見的接口設計錯誤:創建了太多的接口、方法太多了、沒有編寫行為驅動的接口、在生產者端編寫接口、正在返回接口、沒有驗證接口合規性。

我還記得以前看到某個項目里,寫了個接口,20~30 個有待實現的方法。然而他就真的只是一個接口,那么多年過去了也沒有人再去實現這個接口。

當然,本文提供的很多接口優化建議,也是需要結合你的實際代碼(業務)場景去考慮的。大家各取所需,學習之即可。

責任編輯:武曉燕 來源: 腦子進煎魚了
相關推薦

2023-09-07 11:53:05

2024-01-15 06:45:29

Go編程代碼

2024-01-07 13:25:32

Go編程代碼

2018-03-17 09:04:35

2022-06-28 10:13:09

Pandas錯誤Python

2022-06-28 10:17:23

安全職位首席信息安全官

2014-04-22 09:33:49

云計算云安全云遷移

2023-11-15 13:12:16

2024-05-21 11:21:26

數字化轉型

2009-06-29 16:09:20

JSP編程

2019-03-29 15:34:39

Go框架Web

2024-05-10 09:28:57

Python面向對象代碼

2016-04-18 09:18:28

用戶體驗設計產品

2020-11-09 10:18:04

網絡安全

2021-12-07 14:08:45

人工智能AI深度學習

2021-04-22 08:00:00

人工智能機器學習數據

2019-06-21 13:50:33

數據中心

2022-05-17 15:34:08

視覺效果UI 界面設計

2022-11-15 16:54:54

2019-06-11 14:20:29

人工智能AI
點贊
收藏

51CTO技術棧公眾號

欧美三级视频在线| 国产精品私人影院| 国产精品嫩草影院久久久| 黄色录像一级片| 久久精品色播| 欧美日韩国产a| 日韩五码在线观看| 日本在线人成| 成人免费毛片片v| 国产欧美精品一区二区| 日韩欧美大片在线观看| 日韩夫妻性生活xx| 亚洲精品久久久久久久久久久久久 | 成人三级视频在线观看一区二区| 日韩综合在线观看| 亚洲一本视频| 久久久久999| 中文字幕国产专区| 粉嫩久久久久久久极品| 欧美欧美午夜aⅴ在线观看| 极品美女扒开粉嫩小泬| caoporm免费视频在线| 国产日产精品一区| 久久www免费人成精品| 国产欧美一级片| 日本午夜一本久久久综合| 97国产真实伦对白精彩视频8| 国产suv一区二区三区| 成人精品影院| 在线播放国产一区中文字幕剧情欧美 | 欧美日韩福利在线| 国产激情在线观看| 国产精品传媒视频| 亚洲精品一区二区三区蜜桃久| 飘雪影院手机免费高清版在线观看| 福利一区二区在线| 2020国产精品久久精品不卡| 91一区二区视频| 久久一区激情| 日本午夜精品理论片a级appf发布| 久久精品免费在线| 欧美精品偷拍| 久久99久久99精品中文字幕| 亚洲怡红院在线观看| 日本久久精品| 日韩网站免费观看| 男人晚上看的视频| 亚洲情侣在线| 九九九久久久久久| 久久免费视频99| 亚洲天堂久久| 午夜精品久久17c| 日韩三级一区二区三区| 国产欧美日韩一级| 欧美一级大片在线免费观看| 在线精品免费视| 美女诱惑黄网站一区| 国产极品jizzhd欧美| 自拍偷拍色综合| 精品系列免费在线观看| 96国产粉嫩美女| 亚洲国产成人一区二区| 北条麻妃一区二区三区| 黑人另类av| 韩日在线视频| 最好看的中文字幕久久| 91视频成人免费| 国产天堂在线播放视频| 欧美日韩国产在线看| 久久久精品麻豆| 91精品在线免费视频| 日韩精品一区二区三区swag| 亚洲婷婷在线观看| 九色精品国产蝌蚪| 精品国产欧美一区二区三区成人| 日韩在线中文字幕视频 | caoporn超碰97| 日本精品久久| 亚洲大胆美女视频| 91激情视频在线观看| 亚洲第一偷拍| 欧美亚洲另类制服自拍| 97成人在线观看| 暴力调教一区二区三区| 亚洲精品在线免费看| 欧美videosex性欧美黑吊| 欧美日韩亚洲精品一区二区三区| 99热这里只有精品在线播放| 亚洲经典视频| 亚洲天堂精品在线| 激情四射综合网| 免费亚洲婷婷| 99久久精品久久久久久ai换脸| 欧美精品少妇| 亚洲老司机在线| 国产又黄又猛视频| 欧美欧美在线| 亚洲午夜未删减在线观看| 91精品国产高清一区二区三蜜臀| 男人天堂欧美日韩| 成人影片在线播放| 日本最黄一级片免费在线| 亚洲v精品v日韩v欧美v专区| 久久久久久久久久久久久久久国产| 欧美91在线| 欧美日韩福利视频| 11024精品一区二区三区日韩| 99视频精品在线| 一区二区精品在线观看| 新版的欧美在线视频| 欧美电影免费观看完整版| 日韩精品电影一区二区三区| 在线综合亚洲| yy111111少妇影院日韩夜片| aaa在线观看| 欧美性猛交xxxx免费看漫画| 国内精品免费视频| 一区二区影视| 国产一区视频在线| 国产露出视频在线观看| 欧美日韩国产一区在线| 国产精品亚洲一区二区无码| 亚洲一级毛片| 国产欧美最新羞羞视频在线观看| 久青草国产在线| 精品美女永久免费视频| 亚洲无人区码一码二码三码| 欧美在线资源| 亚洲在线免费视频| 黄色网址在线免费播放| 欧美日韩一区在线| 欧美精品日韩在线| 毛片基地黄久久久久久天堂| 日韩av图片| 午夜精品成人av| 亚洲片在线观看| 国产精品免费精品一区| 91色婷婷久久久久合中文| 国产综合中文字幕| 精品国产影院| 97精品在线视频| 天天色综合久久| 精品av在线播放| 精品人妻一区二区三区日产乱码卜| 亚洲国产三级| 你懂的网址一区二区三区| 婷婷电影在线观看| 亚洲欧美第一页| www.久久网| 国产精品私人影院| 亚洲天堂一区二区在线观看| 中文字幕日韩欧美精品高清在线| 亚洲精品欧美日韩专区| 密臀av在线| 亚洲国产精品久久精品怡红院| 久久高清免费视频| 97se亚洲国产综合在线| 国产一区二区三区精彩视频| 国产探花在线精品| 国产欧美日韩91| 91三级在线| 亚洲精品xxxx| 中文字幕在线观看1| 日韩毛片精品高清免费| 911亚洲精选| 先锋a资源在线看亚洲| 亚洲高清视频在线观看| 亚洲网站免费| 欧美极品少妇xxxxⅹ喷水| 亚洲av成人精品一区二区三区在线播放 | 91免费国产在线| 国产小视频精品| 欧美一区二区三区另类| 精品伦理一区二区三区| 国精产品一区二区三区有限公司 | 久久99国产精品成人| 欧美少妇在线观看| 欧美一区自拍| 国产噜噜噜噜噜久久久久久久久| 国产三区在线观看| 亚洲精品aⅴ中文字幕乱码| 波多野结衣一区二区三区在线| 亚洲欧美日韩国产手机在线| 日韩免费高清一区二区| 免费成人在线视频观看| 日本一本中文字幕| 色综合蜜月久久综合网| 国产呦系列欧美呦日韩呦| 国产69精品久久久久9999人| 欧美精品videossex性护士| 国产黄在线播放| 欧美变态tickling挠脚心| 久久人人爽人人爽人人片av免费| 亚洲黄色片在线观看| 美女被到爽高潮视频| 国产成a人亚洲精品| 日韩免费毛片视频| 国产综合欧美| 亚洲视频sss| 亚洲精品一级二级三级| 91免费在线观看网站| 国产成+人+综合+亚洲欧美| 97国产精品免费视频| 制服丝袜中文字幕在线| 亚洲最新av在线| 日本高清视频免费看| 91精品国产色综合久久不卡电影| 精品人妻一区二区色欲产成人| 一区二区三区日韩精品视频| 成人小视频免费看| 91日韩在线专区| www.四虎精品| 国产专区欧美精品| 国产一区二区在线免费播放| 性色一区二区| 日韩伦理在线免费观看| 欧美在线黄色| 性生活免费观看视频| 欧美视频免费| 清纯唯美一区二区三区| 欧美一级色片| 国产一区二区视频在线免费观看| 免费精品一区| 成人精品久久一区二区三区| 久久电影天堂| 国产精品女主播| 欧洲成人一区| 国产不卡av在线| 亚洲高清黄色| 日韩美女视频在线观看| 韩国成人漫画| 日韩av不卡在线| 免费日韩电影| 国产精品va在线| 欧洲av一区二区| 国产精品第10页| 成人看片网页| 国产精品欧美久久久| 成人视屏在线观看| 国产成人极品视频| 欧美大片免费| 国产精品老女人视频| 日韩一区二区三区在线免费观看| 国产精品igao视频| 91精品国产66| 成人美女免费网站视频| 99综合99| 国产高清精品一区二区| 国产一区二区三区不卡av| 黑人中文字幕一区二区三区| 亚洲精品无吗| 亚洲一区二区三区欧美| 亚洲精品网址| 欧美一区二区激情| 亚洲综合日韩| 色一情一区二区三区| 国产麻豆日韩欧美久久| 少妇献身老头系列| 9l国产精品久久久久麻豆| 成年人网站免费看| 国产欧美一区二区精品忘忧草| fc2ppv在线播放| 亚洲午夜私人影院| 久久一区二区三区视频| 欧美性淫爽ww久久久久无| 国产美女免费看| 亚洲精品99999| 在线免费观看黄色网址| 欧美黑人巨大xxx极品| 成人美女黄网站| 成人精品在线观看| 久久激情av| 亚洲二区自拍| 亚洲第一在线| 熟妇人妻va精品中文字幕 | 日韩成人av一区二区| 欧美国产日韩精品免费观看| 欧美成人精品欧美一级| 欧美性69xxxx肥| 亚洲中文字幕一区二区| 精品国产成人系列| 草碰在线视频| 欧美激情精品久久久久久大尺度 | 精品日本一区二区| 日韩极品一区| 亚洲人成无码网站久久99热国产| 免费成人在线影院| 欧洲一级黄色片| 最新高清无码专区| 99re国产在线| 精品av久久707| 午夜激情在线观看| 91成人在线播放| 国产精品亚洲四区在线观看| 麻豆av一区| 亚洲欧美综合国产精品一区| 国产一区二区视频免费在线观看| 国产精品一级二级三级| 少妇的滋味中文字幕bd| 精品久久久久久久久久久久久| 国产乱人乱偷精品视频| 亚洲女人天堂成人av在线| 羞羞的视频在线观看| 国产精品永久免费观看| 欧美色图婷婷| 男人添女人荫蒂免费视频| 捆绑调教一区二区三区| 国产乱了高清露脸对白| 亚洲在线一区二区三区| 国产伦精品一区二区三区视频痴汉 | 偷偷要91色婷婷| 国产露脸无套对白在线播放| 一区二区中文字幕| 欧美男男tv网站在线播放| 99免费在线观看视频| 天天射综合网视频| 浓精h攵女乱爱av| 国产欧美精品国产国产专区 | 182在线视频观看| 91青青草免费在线看| 国产精品88久久久久久| 在线看的黄色网址| 国产校园另类小说区| 日韩免费视频一区二区视频在线观看| 日韩精品专区在线影院观看| a篇片在线观看网站| 成人国产在线激情| 99久久精品费精品国产| 日本超碰在线观看| 国产精品理论在线观看| 中文字幕在线播放av| 中文字幕日韩欧美| abab456成人免费网址| 神马一区二区影院| 日韩电影在线一区二区三区| 美女爆乳18禁www久久久久久| 欧美性猛交xxxx免费看久久久| 免费看男男www网站入口在线| 欧美亚洲另类激情另类| 视频国产一区| 日韩大片一区二区| 国产精品视频一二三| 91福利免费视频| 久久精品亚洲一区| 日韩不卡在线视频| www.日本在线视频| 成人美女视频在线观看| 国产黄色片免费看| 亚洲免费av片| 精品福利在线| 一区二区三区四区免费观看| 国产成人综合在线观看| 豆国产97在线 | 亚洲| 亚洲国产婷婷香蕉久久久久久| 秋霞伦理一区| 日韩欧美视频第二区| 蜜臂av日日欢夜夜爽一区| 免费成年人视频在线观看| 日韩欧美中文字幕公布| sm在线播放| 视频在线精品一区| 国产在线精品免费av| 日本亚洲欧美在线| 亚洲码在线观看| 亚洲欧洲二区| 国产 日韩 亚洲 欧美| 国产欧美一区二区精品秋霞影院 | av中文一区二区三区| 亚洲国产成人精品女人久久| xxxx欧美18另类的高清| 亚州一区二区| 国产1区2区在线| 亚洲三级在线观看| 天堂v在线观看| 国产精品美女午夜av| 欧美日韩免费| 欧美三级视频网站| 欧美不卡视频一区| 免费污视频在线一区| 欧美久久在线观看| 中日韩av电影| 欧美 日韩 国产 成人 在线 91 | 日日摸日日碰夜夜爽av| 欧美国产日韩亚洲一区| 性中国古装videossex| 国产成人小视频在线观看| 欧美91视频| 日韩视频在线观看免费视频| 日韩视频在线你懂得| 国产私拍福利精品视频二区| 99久久免费观看| 日本一区二区三区dvd视频在线| 欧日韩在线视频| 成人免费自拍视频| 日日夜夜一区二区| 一级aaa毛片| 久久五月天综合| 精品午夜久久| 国产精品无码永久免费不卡| 日韩一区二区在线看|