Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Kadai2 shinta #17

Open
wants to merge 14 commits into
base: master
Choose a base branch
from
Open

Kadai2 shinta #17

wants to merge 14 commits into from

Conversation

ShintaNakama
Copy link

@ShintaNakama ShintaNakama commented Sep 11, 2019

課題2

io.Readerとio.Writerについて調べてみよう

標準パッケージでどのように使われているか

  • os(os.Open, os.Create, os.Stdin, os.Stdout, os.Stderr)
    • *os.File型、ファイルを開いたりするときに使う
  • bytes.Buffer (struct), bytes.Reader (struct)
    • ファイルではなくメモリへデータを書き込むのに使う。*bytes.Buffer が io.Writer として利用可能。
    • *bytes.Reader が io.Reader として利用可能。
  • bufio.Scanner
    • ファイルや標準入力から作られた io.Reader から1行ずつ文字列を読み込む。
  • io/ioutil.ReadAll, io/ioutil.ReadFile, io/ioutil.WriteFile, io.Copy
    • io/ioutil.ReadAll: io.Reader から全てデータを読み込んで[]byte を作成する。
    • io/ioutil.ReadFile: 指定されたファイル名から全てのデータを読み込んで[]byte を作成する。
    • io/ioutil.WriteFile: 指定されたファイル名に[]byte を書き込む。os.Create に合わせるなら第三引数permは0666を渡す。
    • io.Copy: io.Reader から io.Writer にデータを全てコピーする便利関数

io.Readerとio.Writerがあることでどういう利点があるのか具体例を挙げて考えてみる

  • io.Reader io.Writerを持っている関数であれば、抽象的にIOしていると考えて良い
  • 呼び出し側はI/O処理がどんなことをしているのかを理解する必要が無い
  • DIPにできる。

test

// 通常のtest
go test ./imageconversion
// カバレッジ
go test -cover ./imageconversion
go test -coverprofile=cover.out ./imageconversion
go tool cover -html=cover.out -o cover.html
  • エラーケースのテストがまだできていない。
  • test しやすい設計についてもっと考えないといけない。

@ShintaNakama ShintaNakama changed the title Kadai2 shinta [wip]Kadai2 shinta Sep 11, 2019
@ShintaNakama ShintaNakama changed the title [wip]Kadai2 shinta Kadai2 shinta Sep 17, 2019
allowExtList := []string{"jpg", "jpeg", "png", "gif"}
allowExtMap := map[string]bool{}
for _, ext := range allowExtList {
allowExtMap[ext] = true
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

これで良さそうです。

allowExtMap := map[string]bool{
    "jpg": true,
    "jpeg": true,
    "png": true,
    "gif": true,
}

return nil
}

func (a *arg) convertExt() {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

何回も呼ぶと何回も.がつきますね。

}

// createImgStrunct は、imageFile structを生成し、返します。
func createImgStruct(path string) (image imageFile) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

型で分かるので名前付き戻り値にしない。
特に理由がない場合は、戻り値もポインタにする。

*/
func convertExec(path, afterExt string) error {
img := createImgStruct(path)
targetImg, err := os.Open(img.path + "/" + img.base + img.ext)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ファイルパスの結合にはfilepath.Joinを使う

if err != nil {
return err
}
outputImg, err := os.Create((img.path + "/" + img.base + afterExt))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

上記と同じ

default:
png.Encode(outputImg, readImg)
}
err = targetImg.Close()
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

下の代入でかき消される

func TestValid(t *testing.T) {
t.Helper()
for _, arg := range exampleArgs {
t.Run(arg.testCase, func(t *testing.T) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

t.Runを呼び出すのはヘルパーとは言えない

}

func TestValid(t *testing.T) {
t.Helper()
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ヘルパーではない

afterExt string
}

var exampleArgs = []exampleArg{
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

テストデータは極力テスト関数の中で定義する

p := flag.String("p", "jpeg", "変換前拡張子")
a := flag.String("a", "png", "変換後拡張子")
if flag.Parse(); flag.Parsed() {
dir, preExt, afterExt = *d, *p, *a
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

こうするなら、flag.StringVardirとかのポインタを渡した方が良さそう

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants