diff --git a/kadai2/tanaka0325/README.md b/kadai2/tanaka0325/README.md index b604725..620b539 100644 --- a/kadai2/tanaka0325/README.md +++ b/kadai2/tanaka0325/README.md @@ -8,3 +8,26 @@ - io.Readerとio.Writerがあることでどういう利点があるのか具体例を挙げて考えてみる ``` +### io.Readerとio.Writerについて調べてみよう + +#### 標準パッケージでどのように使われているか + +身近なものでいうと `fmt` の `Fprint` 系の関数は `io.Writer` を引数にとり、そこに対して書き込みを行っている。 +例えば `Println` は `io.Writer` として `os.Stdout` を `Fprintln` に渡して処理を行っている。 + +標準バッケージでは上記のほかにも、画像やファイルやhttpのリクエスト/レスポンスなど「何か読み書きできるやつ」を抽象化して扱えるように `io.Reader`, `io.Writer` が使われている。 + +#### io.Readerとio.Writerがあることでどういう利点があるのか具体例を挙げて考えてみる + +- 「読み書きできるやつ」と抽象化することができるので、例えば書き込みをする関数を1つ作れば複数の構造体に対応できる + - `io.Writer` がない場合、「ファイルに対して書き込みする関数」「画像に対して書き込みする関数」のように構造体ごとに関数を準備しなくてはならない +- 抽象化することにより、具体的な構造体に依存しなくなるため、テスト時に差し替えることができモックなどでテストがしやくすなる + - 例えば画像を扱うテストをしたい時に、実際に画像を準備する必要がない + + +## 感想 + +- どういう構成にするのが良いのか考えながら何度もいじっていたらどんどん深みにハマり、何が良いのか全然わからなくなってしまった... +- `main` パッケージにはテストを書くほどの処理は書かないで複雑な処理を書きたいなら別途パッケージを切るべきかな?と思ったので今回は `main` パッケージのテストを書いていないがそれで良いのかわからず + - 現状で `main` には受け取ったオプション、引数まわりの処理などをしているので、もしパッケージを作るなら `cli` みたいなパッケージを作ろうと思ってますが、今くらいの規模であれば作らなくてよいかなと思いました +