3
2

More than 3 years have passed since last update.

パパが if を減らすにはどうすればよいのか

Last updated at Posted at 2020-02-27

「パパの書くプログラムってif文すごく少ないね」 → 「よく気がついたな。if文をあまり書かないよう設計すると皆に喜ばれるぞ」

この記事が話題になっていて、うんうん子供の頃からこういう所を意識して書いてたら良いコードが書けるようになりそうだなーなんて思ってみてたら、想像とちょっと反応が違って割と否定的な意見が多かったので具体的に if を減らすとはどういうコードなのかを簡単に紹介してみます。

ちなみに全く特別な手法ではなくむしろ普段から皆こういうコードを書いていると思うし、元ツイートの人がこういう書き方を意識しているのかはわからずまた手法も無数にある為、あくまでも参考としての1例として見てもらえれば :pray:

お父さんな、ポリモーフィズムで食っていこうと思うんだ :man_tone1:

それでは定番の動物で簡単なサンプルを書いていきます。

package main

import (
    "fmt"
)

type Animal struct {
    Name string
}

func main() {
    dog := Animal{Name: "dog"}
    cat := Animal{Name: "cat"}

    makeSound(dog)
    makeSound(cat)
}

func makeSound(a Animal) {
    if a.Name == "dog" {
        fmt.Println("わんわんお")
    } else if a.Name == "cat" {
        fmt.Println("にゃー")
    }
}

この程度だと別にこれでも良いのですが、例えば他にも処理が増えた場合や、動物の種類が増えた場合に関数の種類x動物の種類毎に処理を修正していくことになるため、共通の interface を定義します。

package main

import (
    "fmt"
)

type Animal interface {
    Name() string
    Sound() string
}

type Dog struct {
    name string
}

func (d Dog) Name() string {
    return "いぬ"
}
func (d Dog) Sound() string {
    return "わんわんお"
}

type Cat struct {
    name string
}

func (c Cat) Name() string {
    return "ねこ"
}
func (c Cat) Sound() string {
    return "にゃー"
}

func main() {
    dog := Dog{name: "dog"}
    cat := Cat{name: "cat"}

    name(dog)
    name(cat)
    makeSound(dog)
    makeSound(cat)
}

func name(a Animal) {
    fmt.Printf("わたしのなまえは%sです\n", a.Name())
}

func makeSound(a Animal) {
    fmt.Println(a.Sound())
}

これでコード上から if を消すことが出来ました。は?こんなの当たり前じゃんと思うかもしれないですけど、あの話って if を switch にかえるとか三項演算子で書くとか業務を改善してとかそういう事ではなく、多分こういう当たり前のことを言っているんだと思います。

お父さんな、やっぱり Youtuber で食っていこうと思うんだ。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2