1. 👋 はじめに
前回は順次・分岐・反復処理と関数・スコープ・型を学びました。
今回は 命名規則 を解説します!
「コードは書く時間より読む時間の方が長い」
プログラミングの世界でよく言われる言葉です。
良い名前をつけることは、チームメンバーへの思いやりであり、
未来の自分へのプレゼントです🎁
特に今はAIを使ったコーディングが主流となり、圧倒的に長くなりました。
この記事を読めば:
- ✅ キャメルケース・スネークケース・パスカルケースの違いがわかる
- ✅ 変数・関数・クラスそれぞれの命名ルールがわかる
- ✅ 良い名前・悪い名前の基準がわかる
2. 🎨 命名スタイルの種類
複数の単語を組み合わせて名前をつけるとき、つなぎ方にいくつかのスタイルがあります。
| スタイル | 書き方 | 例 | 主な使用場面 |
|---|---|---|---|
| 🐫 キャメルケース(ローワー) | 2語目以降の先頭を大文字 |
userName・getUserById
|
変数・関数(TS/JS) |
| 🐍 スネークケース | 単語をアンダースコアでつなぐ |
user_name・get_user_by_id
|
変数・関数(Python) |
| 🅿️ パスカルケース(アッパーキャメル) | すべての語の先頭を大文字 |
UserName・GetUserById
|
クラス名(全言語共通) |
| 🍢 ケバブケース | 単語をハイフンでつなぐ |
user-name・get-user-by-id
|
HTMLクラス名・ファイル名・URL |
💡 キャメルケースには2種類あります!
- ローワーキャメルケース:先頭が小文字 →
userName(変数・関数で使う)- アッパーキャメルケース(=パスカルケース):先頭も大文字 →
UserName(クラス名で使う)他の教材で「アッパーキャメル」「パスカル」という言葉が出てきても同じものです。
また、ケバブケースは
-(ハイフン)を使うため、
プログラムのコード内では「マイナス演算子」と誤認されてしまいます。
そのためコード内では使えず、HTMLのクラス名・CSSのクラス名・ファイル名・URL で活躍します。
それぞれのイメージ
userLoginCount
🐫 キャメルケース:userLoginCount ← ラクダのコブのように途中で盛り上がる
🐍 スネークケース:user_login_count ← ヘビのように横に這う
🅿️ パスカルケース:UserLoginCount ← 全員が背筋を伸ばして並ぶ
🍢 ケバブケース :user-login-count ← 串に刺さった具材のよう
3. 📏 言語ごとの命名規則
命名スタイルは「どれが正解」ではなく、言語やフレームワークによって慣習が違います。
| 対象 | Python | TypeScript / JavaScript |
|---|---|---|
| 変数 | 🐍 スネークケース user_name
|
🐫 キャメルケース userName
|
| 関数 | 🐍 スネークケース get_user()
|
🐫 キャメルケース getUser()
|
| クラス | 🅿️ パスカルケース UserAccount
|
🅿️ パスカルケース UserAccount
|
| 定数 | 🔠 大文字スネーク MAX_RETRY
|
🔠 大文字スネーク MAX_RETRY
|
| ファイル名 | 🐍 スネークケース user_service.py
|
🐫/🍢 キャメル/ケバブuserService.ts or user-service.ts
|
💡 チームのコーディング規約に従うのが最重要!
自分がどのスタイルを好むかより、プロジェクトで統一されているスタイルに合わせることが大切です。
4. 🏷️ 変数の命名
良い変数名の条件
| 条件 | 説明 |
|---|---|
| 📖 意味がわかる | 何が入っているか名前だけで理解できる |
| 🎯 具体的 | 曖昧な単語を避ける |
| 📏 適切な長さ | 短すぎず・長すぎず |
| 🔤 発音できる | 声に出して読める名前にする |
悪い変数名 vs 良い変数名
| ❌ 悪い例 | 問題点 | ✅ 良い例 |
|---|---|---|
d |
何のデータかわからない |
elapsed_days(経過日数) |
data |
何のデータかわからない |
user_profile(ユーザー情報) |
flag |
何のフラグかわからない |
is_logged_in(ログイン中か) |
temp |
何の一時変数かわからない |
temporary_file_path(一時ファイルのパス) |
list |
何のリストかわからない |
active_users(アクティブユーザー) |
n |
何の数かわからない |
retry_count(リトライ回数) |
真偽値(boolean)の変数名
真偽値(True/False)を持つ変数は、is_・has_・can_ などで始めると読みやすくなります。
# ✅ 真偽値らしい命名
is_logged_in = True # ログイン中か
has_permission = False # 権限があるか
can_edit = True # 編集できるか
is_empty = False # 空かどうか
# ❌ 真偽値らしくない命名
login = True # 動詞なのか名詞なのかわからない
permission = False # 真偽値とわかりにくい
⚠️ 否定形の命名は避けよう!
is_not_activated・is_invalidのように否定形で名前をつけると危険です。# ❌ 否定形の命名は条件式が読みにくくなる is_not_activated = True if not is_not_activated: # 「アクティベートされていない、ではない」= 二重否定 🤯 send_welcome_email() # ✅ 肯定形にすると読みやすい is_activated = False if is_activated: # 「アクティベートされているなら」= 直感的! send_welcome_email()なるべく肯定形(
is_valid・is_active)で命名し、
否定形(is_not_~・is_invalid)は避けるのがプロの習慣です。
ループ変数の命名
# ✅ 意味のあるループ変数
for user in users: # 各ユーザーを取得
print(user.name) # 各ユーザー名を表示
for product in products: # 各商品を取得
total += product.price # 各商品価格の合計を算出
# ⚠️ i, j は数値インデックスのときだけ使う
for i in range(10):
print(i)
# ❌ 意味不明なループ変数
for x in users: # x が何かわからない
print(x.name)
5. 🔧 関数・メソッドの命名
関数名は「動詞+名詞」で
関数は「何かをする」ものなので、名前も動詞から始めるのが基本です。
# Python
# ✅ 動詞+名詞の良い例
def get_user(user_id: int) -> User: ... # 取得する
def create_account(email: str) -> Account: ... # 作成する
def update_profile(user: User) -> None: ... # 更新する
def delete_post(post_id: int) -> None: ... # 削除する
def send_email(to: str, body: str) -> None: ...# 送信する
def validate_input(data: str) -> bool: ... # 検証する
def calculate_total(items: list) -> int: ... # 計算する
# ❌ 動詞がない・意味不明な例
def user(user_id: int): ... # 何をするの?
def processing(data: str): ... # 何を処理するの?
def do_it(): ... # 何をするの?!
よく使う動詞の使い分け(対義語ペアで覚える)
対義語をペアで覚えると命名のブレが減ります!
| 動詞(取得・生成系) | 対義語(削除・解放系) | 使う場面 |
|---|---|---|
get(取得する) |
set (設定する) |
get_user / set_config
|
create (新規作成) |
delete / destroy(削除) |
create_user / delete_user
|
add (追加する) |
remove(取り除く) |
add_item / remove_item
|
open (開く) |
close(閉じる) |
open_file / close_file
|
start (開始する) |
stop(停止する) |
start_server / stop_server
|
| 動詞(操作・変換系) | 使う場面 |
|---|---|
update / save(更新・保存) |
update_profile・save_draft
|
send(送信する) |
send_email・send_notification
|
validate(検証する) |
validate_email・validate_form
|
calculate(計算する) |
calculate_tax・calculate_total
|
format(形式変換する) |
format_date・format_currency
|
is/has/can(真偽値を返す) |
is_valid・has_permission
|
真偽値を返す関数
# Python
# ✅ is_・has_・can_ で始まると戻り値が True/False とわかる
def is_valid_email(email: str) -> bool: ...
def has_permission(user: User, action: str) -> bool: ...
def can_edit(user: User, post: Post) -> bool: ...
6. 🏛️ クラスの命名
クラス名はパスカルケース・名詞で
クラスは「モノ(概念・オブジェクト)」を表すので、名詞を使います。
# ✅ 良いクラス名(パスカルケース・名詞)
class User: ...
class UserAccount: ...
class ProductRepository: ...
class EmailNotificationService: ...
class OrderSummary: ...
# ❌ 悪いクラス名
class user: ... # 小文字はNG
class get_user: ... # 動詞はNG
class MyClass: ... # 意味がない
class Data: ... # 曖昧すぎる
クラス名でよく使われる接尾語
| 接尾語 | 意味 | 例 |
|---|---|---|
Service |
ビジネスロジックを担う |
UserService・PaymentService
|
Repository |
DBのデータ取得を担う |
UserRepository・OrderRepository
|
Controller |
リクエストを受け取る |
UserController・AuthController
|
Manager |
複数のものを管理する |
SessionManager・CacheManager
|
Handler |
イベントや処理を担う |
ErrorHandler・RequestHandler
|
Factory |
オブジェクトを生成する |
UserFactory・ReportFactory
|
7. 🔢 定数の命名
定数は大文字スネークケース
変更されない値(定数)は大文字+アンダースコアで書くのが慣習です。
一目で「これは定数だ」とわかります。
# ✅ 定数の命名(大文字スネークケース)
MAX_RETRY_COUNT = 3
DEFAULT_TIMEOUT_SECONDS = 30
BASE_URL = "https://api.example.com"
TAX_RATE = 0.10
# ✅ TypeScript での定数
const MAX_RETRY_COUNT = 3;
const DEFAULT_TIMEOUT_MS = 30000;
const BASE_URL = "https://api.example.com";
なぜ大文字?
コードを読んでいるとき「あ、これは変更されない定数だな」と
瞬時に判断できるからです。
taxRateよりTAX_RATEの方がひと目で定数とわかります。
8. 🚫 避けるべき命名パターン
① 略語・省略形を使いすぎる
# ❌ 略しすぎて意味不明
usr_nm = "Alice"
calc_ttl_amt = 1000
btn_clk_hdlr = lambda: None
# ✅ 読めばわかる名前に
user_name = "Alice"
calculate_total_amount = 1000
button_click_handler = lambda: None
② 型名を変数名に使う
# ❌ 型を名前にしている(意味がない)
user_list = [] # list であることはわかるが何のリスト?
name_string = "" # string であることはわかるが意味がない
# ✅ 何が入っているかを示す
active_users = [] # 複数形にすることで「リスト・配列」だと伝わる!
first_name = ""
💡 リスト・配列は「複数形」にするのがモダンな書き方!
user_listやuser_arrayとするより、
users・products・active_ordersのように複数形(末尾にs) にする方がスッキリしていて読みやすいです。
型名(list・array)を入れなくても「複数ありそう」と伝わります。
③ 連番で名前をつける
# ❌ 連番(何が違うのかわからない)
user1 = get_user(1)
user2 = get_user(2)
data1 = fetch_data()
data2 = process_data()
# ✅ 役割を示す名前に
admin_user = get_user(1)
guest_user = get_user(2)
raw_data = fetch_data()
processed_data = process_data()
9. 🎯 まとめ
| 対象 | Python | TypeScript | ポイント |
|---|---|---|---|
| 🏷️ 変数 | user_name |
userName |
意味がわかる・具体的 |
| 🔧 関数 | get_user() |
getUser() |
動詞+名詞で始める |
| 🏛️ クラス | UserAccount |
UserAccount |
パスカルケース・名詞 |
| 🔢 定数 | MAX_RETRY |
MAX_RETRY |
大文字スネークケース |
| ✅ 真偽値 | is_logged_in |
isLoggedIn |
is_・has_・can_ で始める |
良い命名の3原則:
① 意図が伝わる(何が入っているか・何をするかが名前でわかる)
② 検索しやすい(ユニークで検索したときに見つけやすい)
③ 一貫している(プロジェクト全体で同じルールを使う)
次回は コードの設計原則 を解説します!
DRY原則・KISS原則・単一責任の原則など、プロのエンジニアが大切にしているコードを美しく保つための考え方を学びます🌟
💬 質問や感想があれば、コメント欄でお気軽にどうぞ!
👍 役に立ったら、いいね&ストックをお願いします!
🎓 ここまで読んでくださって、本当にありがとうございました!
🔗 シリーズ記事
- 【第一回】コードの基本構造
- 【第二回】命名規則(この記事)
- 【第三回】コードの設計原則(近日公開)
- 【第四回】コメント・ドキュメント(近日公開)
- 【第五回】エラーハンドリング(近日公開)
- 【第六回】テスト・ファイル構造・バージョン管理(近日公開)