国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

探討兩種 Option 編程模式的實現

開發 前端
option編程模式大家一定熟知,但是其寫法不唯一,主要是形成了兩個版本的option設計,本文就探討一下其中的優缺點。

option編程模式的引出

在我們日常開發中,經常在初始化一個對象時需要進行屬性配置,比如我們現在要寫一個本地緩存庫,設計本地緩存結構如下:

type cache struct {
// hashFunc represents used hash func
HashFunc HashFunc
// bucketCount represents the number of segments within a cache instance. value must be a power of two.
BucketCount uint64
// bucketMask is bitwise AND applied to the hashVal to find the segment id.
bucketMask uint64
// segment is shard
segments []*segment
// segment lock
locks []sync.RWMutex
// close cache
close chan struct{}
}

在這個對象中,字段hashFunc、BucketCount是對外暴露的,但是都不是必填的,可以有默認值,針對這樣的配置,因為Go語言不支持重載函數,我們就需要多種不同的創建不同配置的緩存對象的方法:

func NewDefaultCache() (*cache,error){}
func NewCache(hashFunc HashFunc, count uint64) (*cache,error) {}
func NewCacheWithHashFunc(hashFunc HashFunc) (*cache,error) {}
func NewCacheWithBucketCount(count uint64) (*cache,error) {}

這種方式就要我們提供多種創建方式,以后如果我們要添加配置,就要不斷新增創建方法以及在當前方法中添加參數,也會導致NewCache方法會越來越長,為了解決這個問題,我們就可以使用配置對象方案:

type Config struct {
HashFunc HashFunc
BucketCount uint64
}

我們把非必填的選項移動config結構體內,創建緩存的對象的方法就可以只提供一個,變成這樣:

func DefaultConfig() *Config {}
func NewCache(config *Config) (*cache,error) {}

這樣雖然可以解決上述的問題,但是也會造成我們在NewCache方法內做更多的判空操作,config并不是一個必須項,隨著參數增多,NewCache的邏輯代碼也會越來越長,這就引出了option編程模式,接下來我們就看一下option編程模式的兩種實現。

option編程模式一

使用閉包的方式實現,具體實現:

type Opt func(options *cache)

func NewCache(opts ...Opt) {
c := &cache{
close: make(chan struct{}),
}
for _, each := range opts {
each(c)
}
}

func NewCache(opts ...Opt) (*cache,error){
c := &cache{
hashFunc: NewDefaultHashFunc(),
bucketCount: defaultBucketCount,
close: make(chan struct{}),
}
for _, each := range opts {
each(c)
}
......
}

func SetShardCount(count uint64) Opt {
return func(opt *cache) {
opt.bucketCount = count
}
}

func main() {
NewCache(SetShardCount(256))
}

這里我們先定義一個類型Opt,這就是我們option的func型態,其參數為*cache,這樣創建緩存對象的方法是一個可變參數,可以給多個options,我們在初始化方法里面先進行默認賦值,然后再通過for loop將每一個options對緩存參數的配置進行替換,這種實現方式就將默認值或零值封裝在NewCache中了,新增參數我們也不需要改邏輯代碼了。但是這種實現方式需要將緩存對象中的field暴露出去,這樣就增加了一些風險,其次client端也需要了解Option的參數是什么意思,才能知道要怎樣設置值,為了減少client端的理解度,我們可以自己提前封裝好option函數,例如上面的SetShardCount,client端直接調用并填值就可以了。

option編程模式二

這種option編程模式是uber推薦的,是在第一版本上面的延伸,將所有options的值進行封裝,并設計一個Option interface,我們先看例子:

type options struct {
hashFunc HashFunc
bucketCount uint64
}

type Option interface {
apply(*options)
}

type Bucket struct {
count uint64
}

func (b Bucket) apply(opts *options) {
opts.bucketCount = b.count
}

func WithBucketCount(count uint64) Option {
return Bucket{
count: count,
}
}

type Hash struct {
hashFunc HashFunc
}

func (h Hash) apply(opts *options) {
opts.hashFunc = h.hashFunc
}

func WithHashFunc(hashFunc HashFunc) Option {
return Hash{hashFunc: hashFunc}
}

func NewCache(opts ...Option) (*cache,error){
o := &options{
hashFunc: NewDefaultHashFunc(),
bucketCount: defaultBucketCount,
}
for _, each := range opts {
each.apply(o)
}
.....
}

func main() {
NewCache(WithBucketCount(128))
}

這種方式我們使用Option接口,該接口保存一個未導出的方法,在未導出的options結構上記錄選項,這種模式為client端提供了更多的靈活性,針對每一個option可以做更細的custom function設計,更加清晰且不暴露cache的結構,也提高了單元測試的覆蓋性,缺點是當cache結構發生變化時,也要同時維護option的結構,維護復雜性升高了。

總結

這兩種實現方式都很常見,其都有自己的優缺點,采用閉包的實現方式,我們不需要為維護option,維護者的編碼也大大減少了,但是這種方式需要export對象中的field,是有安全風險的,其次是client端需要了解對象結構中參數的意義,才能寫出option參數,不過這個可以通過自定義option方法來解決;采用接口的實現方式更加靈活,每一個option都可以做精細化設計,不需要export對象中的field,并且很容易進行調試和測試,缺點是需要維護兩套結構,當對象結構發生變更時,option結構也要變更,增加了代碼維護復雜性。

實際應用中,我們可以自由變化,不能直接定義哪一種實現就是好的,凡事都有兩面性,適合才是最好的。

責任編輯:武曉燕 來源: Golang夢工廠
相關推薦

2010-07-13 14:54:15

Perl面向對象編程

2010-07-13 10:47:18

Perl面向對象

2024-06-06 08:32:52

.NET框架代碼

2010-06-02 10:47:37

SVN開發

2009-06-29 18:11:40

JSP設計模式

2011-02-23 12:49:31

KonquerorEmbedded

2010-08-26 15:15:18

DB2備份

2010-02-02 14:32:32

Python線程編程

2010-06-02 15:29:06

SVN版本控制

2012-11-29 10:45:31

2021-10-09 09:15:01

Windows 11安全模式系統

2010-07-14 10:30:26

Perl多線程

2012-10-16 09:40:38

洗牌算法

2010-10-14 14:33:15

MySQL多表聯查

2021-12-08 10:47:35

RabbitMQ 實現延遲

2011-08-09 13:50:01

iPhone動畫UIView

2009-12-17 13:45:58

VS 2008外殼

2022-03-10 07:39:33

.NET部署模式

2022-02-02 21:29:39

路由模式Vue-Router

2010-08-31 09:31:58

Silverlight
點贊
收藏

51CTO技術棧公眾號

国产精品三级在线| julia一区二区中文久久94| 男女污视频在线观看| 国产精品一二三| 成人免费91在线看| 欧美一区三区| 人妖精品videosex性欧美| 福利一区二区三区视频在线观看| 日韩视频一区二区三区在线播放 | 制服丝袜亚洲网站| 可以免费看污视频的网站在线| 亚洲综合在线视频| 国产视频一二| 亚洲婷婷综合久久一本伊一区| 精品少妇无遮挡毛片| 91视频免费看| 在线免费视频a| 国产精品成人一区二区三区夜夜夜| 妞干网在线免费视频| 久久精品亚洲精品国产欧美kt∨| 精品中文字幕av| 91亚洲国产成人精品一区二区三| 国产亚洲精品久久久久久久| 久久福利资源站| 免费看黄在线看| 国产欧美综合在线观看第十页| 五月婷婷丁香综合网| 亚洲欧洲综合另类在线| 性色av一区| 日韩精品影音先锋| 欧美三区四区| 97国产精品免费视频| 精品免费av| 裸体丰满少妇做受久久99精品| 视频一区二区中文字幕| 亚洲高潮无码久久| 国产日韩欧美不卡在线| 992tv在线| 欧美日韩中文字幕精品| 一区二区三区伦理| 永久免费毛片在线播放不卡| 伊人久久一区| 国产精品久久久| 中日韩视频在线观看| 在线观看av的网址| 中文字幕亚洲成人| 超碰国产在线| 亚洲欧洲成视频免费观看| 日韩深夜福利网站| 国产精品91久久久久久| 欧美日本中文| 看一级黄色录像| 亚洲欧美怡红院| √新版天堂资源在线资源| 精品香蕉一区二区三区| 国产精品毛片视频| 久久久水蜜桃| 91丨国产丨九色丨pron| 亚洲精品一区视频| 精品视频在线导航| 欧美一级二级三级视频| 高清视频在线观看一区| 国产一区二区三区在线观看精品| 亚洲男人天堂色| 在线观看网站黄不卡| 日韩一区二区三区在线免费观看| 欧美在线一级va免费观看| 午夜在线a亚洲v天堂网2018| 欧美亚洲精品一区二区| 色婷婷久久99综合精品jk白丝| 成人免费直播| 国产三级精品网站| 国产米奇在线777精品观看| 免费h片在线观看| 日韩成人久久久| 欧美三级情趣内衣| 日韩精品在线中文字幕| 一本到高清视频免费精品| 久久久加勒比| 国产精品久久亚洲| 国产日韩欧美不卡在线| wwww在线观看免费视频| 国产精品中文在线| 91丨九色丨蝌蚪富婆spa| 大地资源网3页在线观看| 欧美一级电影久久| 国产999精品久久久久久绿帽| 麻豆影视在线| 日本高清视频精品| 99精品欧美一区二区三区小说| 1pondo在线播放免费| 国产成人亚洲精品| 成人18精品视频| 欧美性video| 国产成人看片| 亚洲电影在线免费观看| 国产精品久久久久久久久久辛辛| 欧美日韩在线不卡一区| 亚洲人成网站在线| 成人黄色图片网站| 特级西西444www大精品视频| 欧美日韩在线视频观看| 欧美电影完整版在线观看| 免费高清一区二区三区| 精品国产乱码久久| 欧美日韩精选| 黄页视频在线免费观看| 久久久久久亚洲精品| 成人在线视频一区二区| 白白色在线观看| 一区二区三区在线视频播放| 性感女国产在线| 香港三级韩国三级日本三级| 亚洲a在线播放| 欧美mv日韩mv亚洲| 亚洲欧美另类小说视频| 成人在线国产| 天堂а√在线资源在线| 成人免费看片视频在线观看| 久久久久久综合网天天| 制服丝袜一区二区三区| 国产亚洲欧美日韩俺去了| 大胆国模一区二区三区| 国产精品日韩三级| 色婷婷亚洲婷婷| 亚洲字幕久久| 黄网站色大毛片| 亚洲人成人99网站| 日本强好片久久久久久aaa| 三上悠亚在线观看| 热久久免费国产视频| 中文字幕一区二区三| 国产一区二区三区免费观看在线 | 毛片在线视频| 欧美色图亚洲自拍| 欧美成人女星排名| 国产精品亚洲综合一区在线观看| 成人性生交大片免费看网站| 欧美日韩dvd| 日本一欧美一欧美一亚洲视频| 亚洲男人天堂一区| 美女被久久久| 136福利精品导航| 粉嫩av一区| 色噜噜狠狠一区二区| 国产精品二区二区三区| 在线观看欧美www| 日韩欧美国产中文字幕| 五月激情综合色| 国产精品77777| 欧美区一区二区| 国产视频1区2区3区| 国产精品自产拍在线观看| 日韩精品资源二区在线| 亚洲人一二三区| 久久国产精品99精品国产 | 欧美日韩水蜜桃| 欧美亚洲大片| 亚洲精品一区二区三区中文字幕 | 在线看片第一页欧美| 99视频精品全部免费在线| 亚洲欧美激情在线| 亚洲丁香久久久| 国产噜噜噜噜噜久久久久久久久| 国产a级片免费看| 成年人视频在线免费观看| 国产精品国产三级在线观看| 国产亚洲激情| 亚洲宅男天堂在线观看无病毒| 亚洲欧美日韩高清| 久久精品国产精品国产精品污| 午夜在线观看av| 成人精品国产亚洲| 国产精品第十页| 九一精品国产| 日韩免费福利视频| 久草在现在线| 人妻无码视频一区二区三区 | 成人毛片免费| 51av在线| 日韩欧美看国产| 免费电影日韩网站| 在线中文字幕第一区| 色鬼7777久久| 日本免费在线视频观看| 国模吧一区二区| 7777精品伊人久久久大香线蕉最新版 | 亚洲成人av中文| 日韩福利视频网| 羞羞答答一区二区| 国内精品伊人久久久久av影院| 香蕉久久网站| 深夜激情久久| 成人久久精品| 亚洲四虎影院| 日本福利片高清在线观看| 成人亚洲成人影院| 欧美另类极限扩张| 桃乃木香奈av在线| 91av俱乐部|