まずは関数を実行する際のコンテキスト(主役)を決めるべきです。YouheiSakurai さんも書いていますが「ダウンロード」「保存」は2つの行為に見えますが、実際は「ローカルにダウンロードする」という1つの処理になります。敢えてこれをメソッドで表すには
vim
1downloader := NewDownloader("URL")
2downloader.Save("保存先ファイル名")
と書けるでしょう。コンテキストが「ダウンローダ」で、入力が URL、メソッドが Save となり、役割がはっきりします。つまり「主役は何なのか」を決めるのが大事という事です。
ちなみに
go
1file := Download("URL")
2//File構造体のメソッドにする
3file.Save("保存先ファイル名")
このコードを他の人が読むと「Download 関数は URL に HTTP 接続してレスポンスをメモリに貯め込む。そして Save でそのメモリをファイルに出力する」と理解するでしょう。ただこれだと URL 先にあるファイルが数 GB あったらどうするの?となる訳です。
go
1downloader := NewDownloader("URL")
2downloader.Save("保存先ファイル名")
かたやこちらのコードだと、NewDownloader ではまだ何も処理はされなくて、Save 時に HTTP 接続と保存を実行する。と読めますし、メモリには貯めこまない作りにする事が出来ますよね。
このコンテキストを作る事で、例えば
go
1downloader := NewDownloader("URL")
2downloader.Timeout = 5000 // 5秒
3downloader.Save("保存先ファイル名")
という、1つのダウンロード処理毎にタイムアウトを与えたり出来る様になる訳です。関数でやる場合どんどん引数が増えちゃいますよね。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/09/22 12:56