成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go 里的海勒姆定律?非必要不修改......

開發 前端
“海勒姆定律” 和 Go 源碼中的 “被動實踐” 都很好的印證了。只要你開放出去的東西,無論是接口,又或是參數。都有可能神不知鬼不覺中被用戶依賴了。

大家好,我是煎魚。

在我們日常工作中,只要你維護過歷史比較悠久的項目??倳龅揭恍┥衿娴拇a。其中最莫過于在老代碼上,前人讓你不要改這塊邏輯的注釋。

在 Go 中也有一些約定俗成的代碼。周末看到了還有點意思,分享給大家。

“該文本不可變更”

在 net/http 標準庫中,有以下這段代碼:

func (e *MaxBytesError) Error() string {
 // Due to Hyrum's law, this text cannot be changed.
 return "http: request body too large"
}

注意看上面的注釋:“Due to Hyrum's law, this text cannot be changed.”。翻譯過來中文含義是:根據海勒姆定律,此文本不可更改。

大家看到可能會犯迷糊。海勒姆定律是什么?教科書上可沒有教過這玩意。

海勒姆定律是什么

海勒姆定律(Hyrum's Law) 是一種軟件開發領域的概念。由 Google 工程師 Hyrum Wright 提出,他在一次演講中討論接口設計和演化問題時提出了這一觀察并得到了驗證。

核心描述是:

  • 無論接口的官方文檔或開發者如何嚴格定義接口的行為,接口的實際行為都會影響其用戶。
  • 所有可能的用戶依賴接口實際行為的方式,最終都會受到接口的實現約束,而不僅僅是其文檔描述。

簡單來講,接口的所有行為,無論是顯式定義的還是隱式存在的,都會被用戶依賴。

即便某些行為不是接口規范的一部分,只要接口表現出了某種行為,使用它的系統或代碼可能就會開始依賴這種行為。

Go 源碼中的案例

結合前面的案例來看,原作者意識到錯誤消息無法隨意更改,因為可能有某些地方的某些用戶依賴于該錯誤消息。

雖然調整錯誤消息看起來微不足道,但這種改動可能會對依賴這一特定消息的用戶造成意想不到的問題。

這種情況下,一個看似無關緊要的描述修改:"http: request body too large",可能會導致用戶的業務代碼的中斷。從而影響 Go1 的兼容性保障和程序運行。

那 Go 源碼里還有沒有其他地方有類似的描述呢?挺多的。如下幾個,請看注解中的 “Hyrum's Law” 部分。

1、crypto/rsa/rsa.go[1]:

func EncryptOAEP(hash hash.Hash, random io.Reader, pub *PublicKey, msg []byte, label []byte) ([]byte, error) {
 // Note that while we don't commit to deterministic execution with respect
 // to the random stream, we also don't apply MaybeReadByte, so per Hyrum's
 // Law it's probably relied upon by some. It's a tolerable promise because a
 // ...

2、crypto/rsa/pss.go[2]:

func SignPSS(rand io.Reader, priv *PrivateKey, hash crypto.Hash, digest []byte, opts *PSSOptions) ([]byte, error) {
 // Note that while we don't commit to deterministic execution with respect
 // to the rand stream, we also don't apply MaybeReadByte, so per Hyrum's Law
 // it's probably relied upon by some. It's a tolerable promise because a
 // ...

3、internal/weak[3]:

Using go:linkname to access this package and the functions it references
is explicitly forbidden by the toolchain because the semantics of this
package have not gone through the proposal process. By exposing this
functionality, we risk locking in the existing semantics due to Hyrum's Law.

總結

“海勒姆定律” 和 Go 源碼中的 “被動實踐” 都很好的印證了。只要你開放出去的東西,無論是接口,又或是參數。都有可能神不知鬼不覺中被用戶依賴了。當你一旦作出變更時,就有可能產生不兼容。導致第三方系統出錯或者產生臟數據,要進行洗數據。

為什么我會知道?因為最近我有一個朋友他遇到了(doge。當然,最好在設計系統或接口時,就要盡可能的減少依賴非預期行為的可能性!

參考資料

[1]crypto/rsa/rsa.go: https://github.com/golang/go/blob/5123f38e050c5ee7130d459ea247d998a838b5a1/src/crypto/rsa/rsa.go#L517

[2]crypto/rsa/pss.go: https://github.com/golang/go/blob/5123f38e050c5ee7130d459ea247d998a838b5a1/src/crypto/rsa/pss.go#L294

[3]internal/weak: https://github.com/golang/go/blob/5123f38e050c5ee7130d459ea247d998a838b5a1/src/internal/weak/pointer.go#L24

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

2021-05-07 06:38:34

Go海勒姆定律程序

2013-01-15 10:55:43

JavaUpdate

2021-08-27 14:36:03

JamfiOS應用權限

2021-02-21 09:09:24

GoGOPATH代碼

2024-01-05 07:41:08

Go語言語句

2021-11-10 15:37:49

Go源碼指令

2020-04-30 09:24:46

Go項目語言

2021-03-23 09:44:43

App信息應用

2015-01-05 09:44:33

Github

2021-10-28 19:35:48

Go 控制超時

2021-12-29 11:15:08

人工智能AI虹膜識別

2023-04-26 08:43:28

GoCGO語言

2023-11-07 08:45:25

Go透明文件夾語言

2013-10-29 10:36:34

2013-11-12 10:09:03

編程文化

2022-09-07 09:33:41

系統東軟核酸檢測

2022-01-17 16:18:14

Go枚舉源碼

2024-10-08 08:55:56

2022-09-19 13:57:24

文件前端代碼

2009-11-11 14:19:55

PHP之父勒多夫Lerdorf
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产91在线精品 | 在线成人福利 | 国产免费观看久久黄av片涩av | 国产一区二区中文字幕 | 亚洲视频在线看 | 蜜臀久久99精品久久久久野外 | 天天操操 | 色综合久久88色综合天天 | 国产精品久久久久久久久久免费看 | 在线免费观看视频你懂的 | 欧美成人精品一区二区男人看 | 91一区二区三区 | 久久精品国产清自在天天线 | 日韩在线免费视频 | 日韩小视频在线 | 久久精品国产一区二区电影 | www.日韩| 九九热re| 亚洲欧美精品国产一级在线 | 中文在线播放 | 亚洲欧美精品一区 | 久久久高清| 一级做a爰片性色毛片 | 午夜激情小视频 | 99精品国产一区二区青青牛奶 | 成人亚洲性情网站www在线观看 | 中文字幕视频一区 | 日韩国产欧美在线观看 | 毛片av免费在线观看 | 在线视频一区二区 | 亚洲一区二区精品视频 | 色伊人久久 | 久久aⅴ乱码一区二区三区 亚洲欧美综合精品另类天天更新 | 国产aaaaav久久久一区二区 | 爱综合| 日韩视频在线播放 | 亚洲一区二区三区桃乃木香奈 | 亚洲精品久久久久久久久久久 | 欧美人人 | 日韩精品一区二区三区高清免费 | 性做久久久久久免费观看欧美 |