コンテンツにスキップ

「カレーを作るな」抽象化と命名の超入門

概要

超新人エンジニア向けに「抽象化」と「命名」を解説した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

「カレーを作る」という名前は完成品を指すが、実装はプロセスの一部しか担っていない。名前と実装の乖離が認知的負荷を生む。

抽象化の正しい粒度

抽象化とは「詳細を隠して本質だけ見せること」。良い抽象化の基準:

  1. 単一責任: 関数が「何を」するかが名前から明確
  2. 適切なレベル: 呼び出し側が知る必要のない詳細を隠す
  3. 嘘をつかない: 名前が実装の全体を正確に表す
// 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 に書かせたコードの命名を評価するときの軸として