素直なコードフロー
インデントは最小にする
同氏は,if
の条件を入れ替えることでもっと簡潔に書けるそうです。
if _, ok := f.dirs[dir]; !ok {
f.dirs[dir] = new(feedDir)
} else {
f.addErr(fmt.Errorf("..."))
return
}
// some code
また,ok
にする必要はなく,ok
だと不自然であると指摘していました。 この場合であれば,ok
の代わりにfound
という名前を使い,!ok
をfound
にすることができるとのことでした。
if _, found := f.dirs[dir]; found {
f.addErr(fmt.Errorf("..."))
return
}
f.dirs[dir] = new(feedDir)
// some code
上記のコードのように,else
を使う必要がなく,
関数の分割
以下のコードでは,
func (h *RESTHandler) finishReq(op *Operation, req *http.Request, w http.ResponseWriter) {
result, complete := op.StatusOrResult()
obj := result.Object
if complete {
status := http.StatusOK
if result.Created {
status = http.StatusCreated
}
switch stat := obj.(type) {
case *api.Status:
if stat.Code != 0 {
status = stat.Code
}
}
writeJSON(status, h.codec, obj, w)
} else {
writeJSON(http.StatusAccepted, h.codec, obj, w)
}
}
そこで,finishStatus
)
func finishStatus(r Result, complete bool) int {
if !complete {
return http.StatusAccepted
}
if stat, ok := r.Object.(*api.Status); ok && stat.Code != 0 {
return stat.Code
}
if r.Created {
return http.StatusCreated
}
return http.StatusOK
}
func (h *RESTHandler) finishReq(op *Operation, w http.ResponseWriter, req *http.Request) {
result, complete := op.StatusOrResult()
status := finishStatus(result, complete)
writeJSON(status, h.codec, result.Object, w)
}
switch
を使う
以下のコードでは,"small"
,"medium"
,"large"
,"null"
)
func BrowserHeightBucket(s *session.Event) string {
browserSize := sizeFromSession(s)
if h := browserSize.GetHeight(); h > 0 {
browserHeight := int(h)
if browserHeight <= 480 {
return "small"
} else if browserHeight <= 640 {
return "medium"
} else {
return "large"
}
} else {
return "null"
}
}
このコードでは,if
が入れ子になっていて,if else
によって長くなっています。 同氏は,if
ではなくswitch
を使うと以下のように簡潔に書けると述べていました。
func BrowserHeightBucket(s *session.Event) string {
size := sizeFromSession(s)
h := size.GetHeight()
switch {
case h <= 0:
return "null"
case h <= 480:
return "small"
case h <= 640:
return "medium"
default:
return "large"
}
}