頑張らないために頑張る

ゆるく頑張ります

プログラミングにおける命名の基本的な考え方とパターン集

Posted at — Dec 2, 2025

はじめに

プログラミングにおいて、変数やメソッド、クラスの命名は「コードを書く」行為の中でも特に重要な要素です。適切な命名はコードの可読性を高め、保守性を向上させ、チーム開発を円滑にします。

本記事では、プログラミング言語に依存しない普遍的な命名の指針を、オブジェクトごとに整理して解説します。

命名における基本原則

1. 意図を明確に伝える

なぜこのルールが必要か

コードは書く時間よりも読まれる時間の方が圧倒的に長いものです。命名は「将来の自分や他の開発者へのメッセージ」であり、その意図が明確でなければ、コードの理解に余計な時間がかかります。

メリット

悪い例

d = 86400
calc(a, b)
data = getData()

良い例

secondsPerDay = 86400
calculateTotalPrice(unitPrice, quantity)
userProfile = fetchUserProfile()

2. 省略語は慎重に使う

なぜこのルールが必要か

過度な省略は可読性を損ないます。一方で、業界で広く認識されている省略語は積極的に使うべきです。

メリット

一般的に許容される省略語

避けるべき省略

usrMgr → userManager
getPrdLst → getProductList

3. 一貫性を保つ

なぜこのルールが必要か

同じ概念に対して異なる名前を使うと、混乱を招きます。プロジェクト全体で統一された命名規則は、コードベースの品質を高めます。

メリット

悪い例

getUserData()
fetchUserInfo()
retrieveUserDetails()

良い例(統一されたプレフィックス)

fetchUserProfile()
fetchProductList()
fetchOrderHistory()

クラスの命名

基本的な考え方

クラスは「もの」や「概念」を表現します。そのため、名詞または名詞句を使用するのが原則です。

命名パターン

1. エンティティクラス

考え方

ビジネスドメインの概念をそのまま表現します。単数形を使用するのが一般的です。

User
Product
Order
Invoice
Customer
ShoppingCart
PaymentMethod

2. サービス・マネージャークラス

考え方

特定の責務や機能をまとめたクラスには、その役割を明示する接尾辞を付けます。

一般的な接尾辞
UserService
EmailNotificationService
DatabaseConnectionManager
FileUploadHandler
PaymentController
ReportBuilder
UserFactory
ProductRepository
ConfigurationProvider
EmailValidator

3. ユーティリティクラス

考え方

汎用的な補助機能を提供するクラスには、複数形や UtilsHelper などの接尾辞を使用します。

StringUtils
DateTimeHelper
MathUtils
FileHelper

なぜこれらの接尾辞を使うのか

これらの命名パターンは、デザインパターンやアーキテクチャパターン(MVC、DDD、Clean Architectureなど)から派生しており、業界標準として広く認識されています。適切な接尾辞を使うことで、クラスの責務が一目で理解できます。

メソッドの命名

基本的な考え方

メソッドは「行動」や「処理」を表現します。そのため、動詞または動詞句を使用するのが原則です。

命名パターン

1. データ取得系メソッド

考え方

データを取得する処理には、その取得方法や特性を表すプレフィックスを使います。

一般的なプレフィックス

get - シンプルなアクセサ、計算コストが低い

getUsername()
getAge()
getTotalCount()

fetch - 外部リソースからの取得、非同期処理の可能性

fetchUserFromDatabase()
fetchDataFromAPI()
fetchRemoteConfig()

find - 検索や探索を伴う取得

findUserById(id)
findProductsByCategory(category)
findFirstMatch(condition)

search - より複雑な検索ロジック

searchProductsByKeyword(keyword)
searchUsersWithFilters(filters)

load - リソースの読み込み

loadConfiguration()
loadImageFromFile(path)
loadPlugins()

retrieve - より形式的な取得(ビジネスロジックを含む)

retrieveArchivedOrders()
retrieveEncryptedData()

2. データ設定・変更系メソッド

set - 単純な値の設定

setUsername(name)
setPassword(password)
setConfiguration(config)

update - 既存データの更新

updateUserProfile(profile)
updateInventory(productId, quantity)

change - 状態の変更

changeOrderStatus(newStatus)
changeUserRole(role)

modify - 部分的な変更

modifySettings(key, value)
modifyPermissions(permissions)

3. 作成・削除系メソッド

create - 新しいオブジェクトやリソースの作成

createUser(userData)
createOrder(orderData)
createTemporaryFile()

add - コレクションへの追加

addItem(item)
addListener(listener)
addToCart(product)

insert - 特定位置への挿入

insertAt(index, element)
insertBefore(referenceNode, newNode)

delete / remove - 削除

deleteUser(userId)
removeFromCart(itemId)
removeEventListener(listener)

destroy - リソースの破棄

destroySession()
destroyConnection()

4. 判定・検証系メソッド

考え方

真偽値を返すメソッドには、疑問文を連想させる命名を行います。

is - 状態の判定

isValid()
isEmpty()
isAuthenticated()
isActive()

has - 所有や存在の判定

hasPermission(permission)
hasChildren()
hasError()

can - 能力や可能性の判定

canExecute()
canAccess(resource)
canUndo()

should - 推奨や必要性の判定

shouldUpdate()
shouldRetry()
shouldNotify()

exists - 存在確認

existsInDatabase(id)
fileExists(path)

5. 計算・処理系メソッド

calculate - 計算処理

calculateTotal(items)
calculateDiscount(price, rate)
calculateDistance(point1, point2)

compute - より複雑な計算

computeStatistics(data)
computeChecksum(data)

process - データ処理

processPayment(paymentInfo)
processImage(image)
processQueue()

convert / transform - 変換処理

convertToJson(object)
transformData(data, rules)
convertCurrency(amount, from, to)

parse - パース処理

parseDate(dateString)
parseXml(xmlString)

format - フォーマット処理

formatCurrency(amount)
formatDate(date, pattern)

validate - 検証処理

validateEmail(email)
validateInput(data)
validateForm()

6. イベント処理系メソッド

考え方

イベントハンドラは on または handle で始めます。

on + イベント名 - イベントハンドラ

onClick()
onSubmit()
onUserLogin()
onDataReceived()

handle + イベント名 - イベント処理

handleError(error)
handleClick(event)
handleDataUpdate(newData)

メソッド命名のメリット

明確なプレフィックスを使うことで、以下のメリットが得られます:

変数の命名

基本的な考え方

変数は「格納するデータの意味」を明確に表現します。型情報よりも、そのデータが表す概念や用途を優先します。

命名パターン

1. 基本的な変数

考え方

変数名は「何を格納しているか」を明確にします。

悪い例

data
temp
value
x
str

良い例

userName
totalPrice
itemCount
userEmail
productList

2. ブール型変数

考え方

真偽値を格納する変数は、その名前だけで条件文が自然に読めるようにします。

一般的なパターン:

is + 形容詞/過去分詞

isValid
isActive
isAuthenticated
isLoading
isVisible
isEnabled
isCompleted

has + 名詞

hasError
hasPermission
hasChildren
hasData

can + 動詞

canEdit
canDelete
canAccess

should + 動詞

shouldUpdate
shouldNotify
shouldRetry
使用例
if (isAuthenticated && hasPermission) {
    // 処理
}

if (canEdit && !isReadOnly) {
    // 編集処理
}

3. コレクション(配列・リスト)

考え方

複数の要素を持つことを示すため、複数形を使用します。

users
products
orderItems
errorMessages
selectedIds
activeConnections
配列の要素を扱う場合
for (user of users) {
    // 単数形の user で各要素を扱う
}

products.forEach(product => {
    // 単数形の product で各要素を扱う
})

4. 数値・カウンタ

考え方

数を数える変数には、その意味を明確にします。

userCount
totalAmount
maxRetries
currentIndex
pageNumber
attemptCount

ループカウンタ:

// 単純なループには慣習的に i, j, k を使用可能
for (i = 0; i < length; i++) {
    // 処理
}

// 意味のあるループには明確な名前を
for (userIndex = 0; userIndex < users.length; userIndex++) {
    // 処理
}

5. 定数

考え方

定数は変更されない値であること、そしてその意味を明確にします。Pythonでは大文字とアンダースコアで表現しますが、言語によってはこの限りではないため、仕様する言語の規約や習慣を確認することをオススメします。

Pythonでは定数を「大文字+アンダースコア」で表現します。

MAX_LOGIN_ATTEMPTS = 3
DEFAULT_TIMEOUT_SECONDS = 30
API_BASE_URL = "https://api.example.com"
TAX_RATE = 0.10
SECONDS_PER_DAY = 86400

6. プライベート変数

考え方

言語によっては、プライベートメンバーを示す記法があります。プライベートを示すために、プレフィックスとして名称の冒頭に_を付与したり、privateなど言語の機能を利用し名称自体では表現しない言語があります。利用している言語においてどのように表現するか、事前に確認することをオススメします。

// アンダースコアプレフィックス(JavaScript/Python等)
_internalState
_privateCache

// 言語の機能を使う場合(TypeScript等)
private userId
protected configuration

7. 一時変数

考え方

一時的な値でも、その用途を明確にします。

悪い例

temp
tmp
data
x

良い例

previousValue
newTotal
intermediateResult
swapBuffer

変数のスコープと命名

考え方

スコープが狭い変数は短い名前でも許容されますが、スコープが広い変数はより詳細な名前を付けます。

// 狭いスコープ - 短い名前でも理解可能
function sum(numbers) {
    total = 0
    for (n of numbers) {
        total += n
    }
    return total
}

// 広いスコープ - 詳細な名前が必要
class UserManager {
    activeUserSessions = {}
    failedLoginAttemptsByIp = {}
    
    // ...
}

言語横断的な命名の知恵

1. ドメイン用語を優先する

なぜこのルールが必要か

ビジネスロジックとコードの対応を明確にすることで、ドメインエキスパートとの会話が円滑になります。

// 金融システムの場合
transaction
ledger
portfolio
settlement

// ECサイトの場合
cart
checkout
inventory
fulfillment

2. 否定形を避ける

なぜこのルールが必要か

二重否定は読み手を混乱させます。

悪い例

isNotDisabled
isNotInvalid

良い例

isEnabled
isValid

3. 名詞と動詞を明確に区別する

なぜこのルールが必要か

同じ単語を名詞と動詞の両方で使うと混乱を招きます。

// 名詞としてのfilter
userFilter = createFilter()

// 動詞としてのfilter
filterUsers(users, criteria)

// より明確に区別する場合
userFilterCriteria = createFilterCriteria()
applyFilterToUsers(users, filterCriteria)

4. マジックナンバーを避ける

なぜこのルールが必要か

数値リテラルだけでは意味が伝わりません。

悪い例

if (status == 200) {
    // 処理
}

setTimeout(callback, 3000)

良い例

HTTP_OK = 200
if (status == HTTP_OK) {
    // 処理
}

DEBOUNCE_DELAY_MS = 3000
setTimeout(callback, DEBOUNCE_DELAY_MS)

命名のチェックリスト

コードレビューや自己チェックの際に使える、命名の品質チェックリストです。

クラス名のチェックリスト

メソッド名のチェックリスト

変数名のチェックリスト

まとめ

命名は芸術ではなく、技術です。本記事で紹介した指針に従うことで、以下のメリットが得られます:

  1. 可読性の向上 - コードが自己文書化され、コメントへの依存が減る
  2. 保守性の向上 - 意図が明確なため、変更の影響範囲を把握しやすい
  3. バグの減少 - 誤解による実装ミスが減る
  4. 生産性の向上 - コードレビューやデバッグが効率的になる
  5. チーム協調の促進 - 共通言語ができ、コミュニケーションが円滑になる

最初は慣れないかもしれませんが、意識的に実践することで、自然と適切な命名ができるようになります。命名に迷った時は、「6ヶ月後の自分が読んでも理解できるか」を自問してみてください。

参考

  1. エンジニアが覚えておきたい英単語 - AIコード読解時代の必須語彙
  2. メソッド名、迷った時に参考にできる単語一覧
comments powered by Disqus