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 就一个方法,之前的那种写法也可行。感觉就是解耦跟好了?
下面是之前学习看视频的时候说用接口的好处。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.