頑張らないために頑張る

ゆるく頑張ります

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

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. ユーティリティクラス

考え方

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

例
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