プログラミングにおいて、変数やメソッド、クラスの命名は「コードを書く」行為の中でも特に重要な要素です。適切な命名はコードの可読性を高め、保守性を向上させ、チーム開発を円滑にします。
本記事では、プログラミング言語に依存しない普遍的な命名の指針を、オブジェクトごとに整理して解説します。
コードは書く時間よりも読まれる時間の方が圧倒的に長いものです。命名は「将来の自分や他の開発者へのメッセージ」であり、その意図が明確でなければ、コードの理解に余計な時間がかかります。
d = 86400
calc(a, b)
data = getData()secondsPerDay = 86400
calculateTotalPrice(unitPrice, quantity)
userProfile = fetchUserProfile()過度な省略は可読性を損ないます。一方で、業界で広く認識されている省略語は積極的に使うべきです。
id (identifier)num (number)max / min (maximum / minimum)src / dst (source / destination)btn (button) - UI関連msg (message)tmp (temporary)ctx (context)config / cfg (configuration)usrMgr → userManager
getPrdLst → getProductList同じ概念に対して異なる名前を使うと、混乱を招きます。プロジェクト全体で統一された命名規則は、コードベースの品質を高めます。
getUserData()
fetchUserInfo()
retrieveUserDetails()fetchUserProfile()
fetchProductList()
fetchOrderHistory()クラスは「もの」や「概念」を表現します。そのため、名詞または名詞句を使用するのが原則です。
ビジネスドメインの概念をそのまま表現します。単数形を使用するのが一般的です。
User
Product
Order
Invoice
Customer
ShoppingCart
PaymentMethod特定の責務や機能をまとめたクラスには、その役割を明示する接尾辞を付けます。
Service - ビジネスロジックを提供Manager - リソースやライフサイクルを管理Handler - イベントや要求を処理Controller - フローを制御Builder - オブジェクトの構築を担当Factory - オブジェクトの生成を担当Repository - データアクセスを抽象化Provider - 依存性や設定を提供Validator - 検証ロジックを担当UserService
EmailNotificationService
DatabaseConnectionManager
FileUploadHandler
PaymentController
ReportBuilder
UserFactory
ProductRepository
ConfigurationProvider
EmailValidator汎用的な補助機能を提供するクラスには、複数形や Utils、Helper などの接尾辞を使用します。
StringUtils
DateTimeHelper
MathUtils
FileHelperこれらの命名パターンは、デザインパターンやアーキテクチャパターン(MVC、DDD、Clean Architectureなど)から派生しており、業界標準として広く認識されています。適切な接尾辞を使うことで、クラスの責務が一目で理解できます。
メソッドは「行動」や「処理」を表現します。そのため、動詞または動詞句を使用するのが原則です。
データを取得する処理には、その取得方法や特性を表すプレフィックスを使います。
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()set - 単純な値の設定
setUsername(name)
setPassword(password)
setConfiguration(config)update - 既存データの更新
updateUserProfile(profile)
updateInventory(productId, quantity)change - 状態の変更
changeOrderStatus(newStatus)
changeUserRole(role)modify - 部分的な変更
modifySettings(key, value)
modifyPermissions(permissions)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()真偽値を返すメソッドには、疑問文を連想させる命名を行います。
is - 状態の判定
isValid()
isEmpty()
isAuthenticated()
isActive()has - 所有や存在の判定
hasPermission(permission)
hasChildren()
hasError()can - 能力や可能性の判定
canExecute()
canAccess(resource)
canUndo()should - 推奨や必要性の判定
shouldUpdate()
shouldRetry()
shouldNotify()exists - 存在確認
existsInDatabase(id)
fileExists(path)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()イベントハンドラは on または handle で始めます。
on + イベント名 - イベントハンドラ
onClick()
onSubmit()
onUserLogin()
onDataReceived()handle + イベント名 - イベント処理
handleError(error)
handleClick(event)
handleDataUpdate(newData)明確なプレフィックスを使うことで、以下のメリットが得られます:
変数は「格納するデータの意味」を明確に表現します。型情報よりも、そのデータが表す概念や用途を優先します。
変数名は「何を格納しているか」を明確にします。
data
temp
value
x
struserName
totalPrice
itemCount
userEmail
productList真偽値を格納する変数は、その名前だけで条件文が自然に読めるようにします。
一般的なパターン:
is + 形容詞/過去分詞
isValid
isActive
isAuthenticated
isLoading
isVisible
isEnabled
isCompletedhas + 名詞
hasError
hasPermission
hasChildren
hasDatacan + 動詞
canEdit
canDelete
canAccessshould + 動詞
shouldUpdate
shouldNotify
shouldRetryif (isAuthenticated && hasPermission) {
// 処理
}
if (canEdit && !isReadOnly) {
// 編集処理
}複数の要素を持つことを示すため、複数形を使用します。
users
products
orderItems
errorMessages
selectedIds
activeConnectionsfor (user of users) {
// 単数形の user で各要素を扱う
}
products.forEach(product => {
// 単数形の product で各要素を扱う
})数を数える変数には、その意味を明確にします。
userCount
totalAmount
maxRetries
currentIndex
pageNumber
attemptCountループカウンタ:
// 単純なループには慣習的に i, j, k を使用可能
for (i = 0; i < length; i++) {
// 処理
}
// 意味のあるループには明確な名前を
for (userIndex = 0; userIndex < users.length; userIndex++) {
// 処理
}定数は変更されない値であること、そしてその意味を明確にします。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言語によっては、プライベートメンバーを示す記法があります。プライベートを示すために、プレフィックスとして名称の冒頭に_を付与したり、privateなど言語の機能を利用し名称自体では表現しない言語があります。利用している言語においてどのように表現するか、事前に確認することをオススメします。
// アンダースコアプレフィックス(JavaScript/Python等)
_internalState
_privateCache
// 言語の機能を使う場合(TypeScript等)
private userId
protected configuration一時的な値でも、その用途を明確にします。
temp
tmp
data
xpreviousValue
newTotal
intermediateResult
swapBufferスコープが狭い変数は短い名前でも許容されますが、スコープが広い変数はより詳細な名前を付けます。
// 狭いスコープ - 短い名前でも理解可能
function sum(numbers) {
total = 0
for (n of numbers) {
total += n
}
return total
}
// 広いスコープ - 詳細な名前が必要
class UserManager {
activeUserSessions = {}
failedLoginAttemptsByIp = {}
// ...
}ビジネスロジックとコードの対応を明確にすることで、ドメインエキスパートとの会話が円滑になります。
// 金融システムの場合
transaction
ledger
portfolio
settlement
// ECサイトの場合
cart
checkout
inventory
fulfillment二重否定は読み手を混乱させます。
isNotDisabled
isNotInvalidisEnabled
isValid同じ単語を名詞と動詞の両方で使うと混乱を招きます。
// 名詞としてのfilter
userFilter = createFilter()
// 動詞としてのfilter
filterUsers(users, criteria)
// より明確に区別する場合
userFilterCriteria = createFilterCriteria()
applyFilterToUsers(users, filterCriteria)数値リテラルだけでは意味が伝わりません。
if (status == 200) {
// 処理
}
setTimeout(callback, 3000)HTTP_OK = 200
if (status == HTTP_OK) {
// 処理
}
DEBOUNCE_DELAY_MS = 3000
setTimeout(callback, DEBOUNCE_DELAY_MS)コードレビューや自己チェックの際に使える、命名の品質チェックリストです。
命名は芸術ではなく、技術です。本記事で紹介した指針に従うことで、以下のメリットが得られます:
最初は慣れないかもしれませんが、意識的に実践することで、自然と適切な命名ができるようになります。命名に迷った時は、「6ヶ月後の自分が読んでも理解できるか」を自問してみてください。