構造体フィールドへのアクセスはゲッターで行いセッターは避ける
Contents
Access struct fields through getter methods; avoid setters. (構造体のフィールドへのアクセスはゲッターメソッドを通して行い、セッターは避ける)
解説
セッターメソッドを提供すると、オブジェクトの状態がいつでも変更可能になり、不変性が損なわれます。ゲッターのみを提供することで、オブジェクトの読み取り専用アクセスを実現し、予期しない状態変更を防げます。状態の変更が必要な場合は、ビジネスロジックを含むドメインメソッドとして実装すべきです。これにより、状態変更に対する制御が強化され、バグの混入を防ぎます。
具体例
// 悪い例(セッターが存在)
type Account struct {
balance float64
}
func (a *Account) GetBalance() float64 {
return a.balance
}
func (a *Account) SetBalance(amount float64) {
a.balance = amount // 検証なしで変更可能
}
func main() {
acc := &Account{balance: 1000}
acc.SetBalance(-500) // 不正な状態を作成可能
}
// 良い例(ゲッターのみ、状態変更はドメインメソッド)
type Account struct {
balance float64
}
func NewAccount(initialBalance float64) (*Account, error) {
if initialBalance < 0 {
return nil, errors.New("initial balance must be positive")
}
return &Account{balance: initialBalance}, nil
}
func (a *Account) Balance() float64 {
return a.balance
}
func (a *Account) Deposit(amount float64) error {
if amount <= 0 {
return errors.New("deposit amount must be positive")
}
a.balance += amount
return nil
}
func (a *Account) Withdraw(amount float64) error {
if amount <= 0 {
return errors.New("withdraw amount must be positive")
}
if a.balance < amount {
return errors.New("insufficient balance")
}
a.balance -= amount
return nil
}
参考リンク
構造体フィールドへのアクセスはゲッターで行いセッターは避ける https://www.tricrow.com/core/coding-standard/getter-no-setter.html

