Skip to content

Instantly share code, notes, and snippets.

@kazasiki
Created April 13, 2018 05:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kazasiki/d7a2917f3b034fda8802c826ea1e5fdc to your computer and use it in GitHub Desktop.
Save kazasiki/d7a2917f3b034fda8802c826ea1e5fdc to your computer and use it in GitHub Desktop.
へぇボタンで理解するオブジェクト指向の利点
package main
// このコードでは皆さんご存知のへぇボタンを例にあげてオブジェクト指向のいくつかの利点の説明を試みる。
// オブジェクト指向の概念は理解してるけど何がいいのかわからない人向け。
// まずは「へぇボタン」の構造体を作ろう。
// 名前はもちろん「へぇボタン」(Heyでは意味が変わってしまうのでは?と思うけど気にしないことにする)
type HeyButton struct {
heyCount int
}
const (
HeyMaxCount = 20
HeyMinCount = 0
)
// 新しいへぇボタンを生成して返す
func NewHeyButton() *HeyButton {
return &HeyButton{HeyMinCount}
}
// 押された回数を取り出す
func (hb HeyButton) HeyCount() int {
return hb.heyCount
}
// へぇボタンのインタフェースは基本的に「押す」のみ
func (hb *HeyButton) Push() int {
if hb.heyCount >= HeyMaxCount {
return hb.heyCount
}
hb.heyCount++
return hb.heyCount
}
// 1つのトリビアを紹介し終わったらカウントをリセットする
func (hb *HeyButton) Reset() int {
hb.heyCount = HeyMinCount
return hb.heyCount
}
func main() {
// 利点1: インスタンスの独立性
// へぇボタンは番組中に複数存在する。他の人のpushは他の人に影響を及ぼさない。
tamoriButton := NewHeyButton()
bibiruButton := NewHeyButton()
tamoriButton.Push()
tamoriButton.Push() // => 2
bibiruButton.HeyCount() // => 0
// 利点2: heyCountの書き換えに対する制限
// カウントは1ずつしか増えない。(連打するほうが楽しいから!)
// 最大値が20であることは全てのインスタンスに対して守られる。
for i := 0; i < 25; i++ {
bibiruButton.Push()
}
bibiruButton.HeyCount() // => 20
// ただし、goの場合はこの形でリテラルを作られるとどうしようもない
aButton := HeyButton{25}
aButton.HeyCount() // => 25
}
// ここまで書いたが実際はフィールドが一つだけならgoの場合
// type HeyButton int でもほぼ同じことが出来る
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment