「カレーを作るな」抽象化と命名の超入門
概要¶
超新人エンジニア向けに「抽象化」と「命名」を解説したQiita記事の紹介。「カレーを作るな、カレールーを入れた煮込みを作れ」というキャッチーなタイトルで、関数やクラスの責務を正しく命名する考え方を教える。
詳細¶
「カレーを作る」問題とは¶
# BAD: 名前と実装が一致していない
def make_curry(ingredients):
soup = boil(ingredients)
soup.add(curry_roux) # カレールーを入れた煮込みを作っているだけ
return soup
# GOOD: 実装を正直に表現する
def make_stew_with_curry_roux(ingredients):
soup = boil(ingredients)
soup.add(curry_roux)
return soup
「カレーを作る」という名前は完成品を指すが、実装はプロセスの一部しか担っていない。名前と実装の乖離が認知的負荷を生む。
抽象化の正しい粒度¶
抽象化とは「詳細を隠して本質だけ見せること」。良い抽象化の基準:
- 単一責任: 関数が「何を」するかが名前から明確
- 適切なレベル: 呼び出し側が知る必要のない詳細を隠す
- 嘘をつかない: 名前が実装の全体を正確に表す
// BAD: createUser が DB保存もメール送信もしている
func createUser(name, email string) error {
db.Save(User{name, email})
sendWelcomeEmail(email) // 呼び出し側は知らされていない副作用
return nil
}
// GOOD: 副作用を名前に含める、または分離する
func registerUser(name, email string) error {
if err := db.Save(User{name, email}); err != nil {
return err
}
return sendWelcomeEmail(email)
}
命名のチェックリスト¶
do/process/handleなどの曖昧な動詞を使っていないか- 名前に
Andが入っていたら責務が複数ある可能性(分割を検討) - 「この関数は何をするか」を同僚に一文で説明できるか
なぜ重要か / いつ使うか¶
- コードレビューで「名前がおかしい」と指摘される前に自己チェックするために
- 新人のコードを指導するときの具体的な基準として
- AI に書かせたコードの命名を評価するときの軸として