フラグパラメータで振る舞いを切り替えるのではなく関数を分割する
Contents
Instead of flag parameters that toggle behavior inside a function, split the function. (関数内部で振る舞いを切り替えるフラグパラメータを使う代わりに、関数を分割する)
解説
フラグパラメータを持つ関数は、実質的に2つ以上の異なる処理を1つの関数に詰め込んでおり、単一責任原則に違反します。フラグによって振る舞いが変わる関数は、呼び出し側でフラグの意味を理解する必要があり、可読性が低下します。関数を分割することで、各関数の意図が明確になり、使用方法が直感的になります。これにより、コードの保守性と理解しやすさが向上します。
具体例
// 悪い例(フラグパラメータで振る舞いを変更)
func ProcessUser(user User, sendEmail bool) error {
if err := validateUser(user); err != nil {
return err
}
if err := saveUser(user); err != nil {
return err
}
if sendEmail {
// メール送信処理
if err := sendWelcomeEmail(user.Email); err != nil {
return err
}
}
return nil
}
func main() {
ProcessUser(newUser, true) // trueは何を意味する?
ProcessUser(existingUser, false) // falseは何を意味する?
}
// 良い例(関数を分割)
func RegisterNewUser(user User) error {
if err := validateUser(user); err != nil {
return err
}
if err := saveUser(user); err != nil {
return err
}
if err := sendWelcomeEmail(user.Email); err != nil {
return err
}
return nil
}
func UpdateExistingUser(user User) error {
if err := validateUser(user); err != nil {
return err
}
if err := saveUser(user); err != nil {
return err
}
// メール送信なし
return nil
}
func main() {
RegisterNewUser(newUser) // 意図が明確
UpdateExistingUser(existingUser) // 意図が明確
}
参考リンク
フラグパラメータで振る舞いを切り替えるのではなく関数を分割する https://www.tricrow.com/core/coding-standard/no-flag-parameters.html

