知名视频下载工具 annie 的一个大重构挺有意思。
資深大佬 : matrix67 0
annie 是一个视频下载工具。能够下各个视频网站的视频到本地。
然后之前它下载,都是在 main 函数里面根据 url 进行判断,然后每个包自己实现 Extract 方法。具体为有一个 download 函数
func download(videoURL string) error { var ( domain string err error data []downloader.Data ) …… switch domain { case "douyin", "iesdouyin": data, err = douyin.Extract(videoURL) case "bilibili": data, err = bilibili.Extract(videoURL) case "bcy": data, err = bcy.Extract(videoURL) case "pixivision": data, err = pixivision.Extract(videoURL) case "youku": data, err = youku.Extract(videoURL) 很多这边就不贴了 …… }
最近有个更新,commit 为 424f8def refactor the whole structure (#676), 作者重构了一下,引入了 interface 。具体实现为:
var extractorMap map[string]types.Extractor func init() { douyinExtractor := douyin.New() youtubeExtractor := youtube.New() extractorMap = map[string]types.Extractor{ "": universal.New(), // universal extractor "douyin": douyinExtractor, "iesdouyin": douyinExtractor, "bilibili": bilibili.New(), "bcy": bcy.New(), "pixivision": pixivision.New(), "youku": youku.New(), "youtube": youtubeExtractor, "youtu": youtubeExtractor, // youtu.be …… } }
然后 extract 里面
extractor := extractorMap[domain] videos, err := extractor.Extract(u, option)
每个包实现了Extractor接口 Extract 方法。
// Extractor implements video data extraction related operations. type Extractor interface { // Extract is the main function to extract the data. Extract(url string, option Options) ([]*Data, error) }
这个重构还是挺有意思,作者应该早就想改了,但是是一个大工程,不知道作者心路历程是咋样滴 。
我想问问 extractorMap[domain] 这个用法是比较 native 的吗。另外好像仅仅针对这个问题,用接口的方法没太省事儿,因为 Extractor 就一个方法,之前的那种写法也可行。感觉就是解耦跟好了?
下面是之前学习看视频的时候说用接口的好处。 
大佬有話說 (16)