「Go言語 100Tips ありがちなミスを把握し、実装を最適化する」という書籍の読書メモです。
No.1 意図しない変数のシャドウイング
ネストしたブロック内で外側の変数と同じ名前の変数を再定義してしまうことで意図しない結果になってしまうことがあります。
外側で宣言したclientに値が代入されることはなくnilのままになるという例です。
No.2 不必要にネストしたコード
これはネストレベルをできるだけ減らした方が読みやすいですよね、という内容です。
ifブロックがリターンする時はelseを省略すべしというのは意外とそうしない実装をしてしまいがちだと思いました。
以下のように書くのは避け、elseブロックは省きましょうと。
if foo() {
// ....
return true
} else {
// ....
}
No.3 init関数の誤用
init関数は戻り値を持たないというのが一番大きい制約になりそう。
errorを返せないのでエラーが発生するような処理はinitではしないようにするのが吉。
No.4 ゲッターとセッターの多用
価値をもたらさないゲッター、セッターは作るべきではない。
ゲッターとセッターを用意する時の命名については覚えておく。
以下のケースで、nameのゲッターはGetNameではなくNameにする。
セッターはSetName。
type Person struct {
name string
}
func (p Person) Name() string {
return p.name
}
func (p *Person) SetName(name string) {
p.name = name
}
No.5 インターフェイス汚染
インターフェイスを乱用することは一般的に良い考えではない。
インターフェイスを使うとき
- 共通の振る舞い
- 具体的な実装との分離
- 振る舞いの制限
”不必要な抽象化によってコードが汚染され、読むのが複雑になる” のは避けるべき
No.6 生産者側のインターフェイス
インターフェイスは消費者側に存在すべき。
WIP
No.7 インターフェイスを返す
"関数のシグニチャで多くの場合はインターフェイスを返すことは悪い習慣とされている" とのこと。
No.8 anyは何も伝えない
多くの場合でanyは過剰な一般化である。
No.9 ジェネリクスをいつ使うべきかで混乱する
不必要な抽象化をして複雑にならないように気をつける。
No.10 型埋め込みで起こり得る問題点を意識していない
型埋め込みでしか解決できないことはあまりない。
フィールドへのアクセスを簡単にするだけの根拠ならフィールドにした方が良い。
外部から隠蔽したいデータや操作を意図せず公開されないように気をつける。
読みながら徐々に更新していきます。
コメント