プログラミングの「命名」- センスより大切なルール

プログラミングの命名はセンスよりもルールが重要。読みやすいコードを書くための具体的な命名規則と実践方法を詳しく解説します。

Learning Next 運営
20 分で読めます

みなさん、プログラミングで変数名や関数名を決めるとき「センスがないから良い名前が思い浮かばない」と悩んだことはありませんか?

実は、プログラミングの命名においてセンスよりもルールの方がはるかに重要です。 適切なルールに従えば、誰でも読みやすく保守しやすいコードを書くことができます。

この記事では、センスに頼らず体系的に良い命名ができるようになる具体的なルールと実践方法をお伝えします。 ルールを身につけることで、あなたのコードの品質が劇的に向上します。

なぜセンスより「ルール」が重要なのか?

センスに依存する問題点

多くの初心者が陥りがちな「センス依存」の問題:

  • 一貫性の欠如: 人によって命名スタイルがバラバラ
  • 主観的判断: 「良い名前」の基準が曖昧
  • 学習困難: センスは短期間で身につかない
  • チーム開発の困難: メンバー間で統一されない

センス依存の例

// センス依存の命名(問題のある例)
const d = new Date(); // 何のデータか不明
const usr = getCurrentUser(); // 略語で分かりにくい
const flag = checkStatus(); // 何をチェックしているか不明
const temp = calculateTotal(); // 一時的なのか?何の合計?

ルールに従うメリット

体系的なルールに従うことで得られるメリット:

  • 一貫性: プロジェクト全体で統一された命名
  • 学習可能: 明確なルールで誰でも習得可能
  • 可読性: 命名から内容を推測しやすい
  • 保守性: 後から見ても理解しやすい

ルールに従った例

// ルールに従った命名(改善例)
const currentDate = new Date(); // 現在の日付であることが明確
const currentUser = getCurrentUser(); // 現在のユーザー情報
const isValidStatus = checkStatus(); // ブール値であることが明確
const totalAmount = calculateTotal(); // 合計金額であることが明確

基本的な命名ルール

ルール1: 意味を明確に表現する

何をするか、何を表すかを明確に表現することが最も重要です。

良い命名の例

// 悪い例
const data = fetchUserData();
const result = processData(data);
const output = formatResult(result);
// 良い例
const userData = fetchUserData();
const processedUserData = processData(userData);
const formattedUserProfile = formatResult(processedUserData);

具体的なガイドライン

  • 動詞 + 名詞: 関数名は動作を明確に表現
  • 形容詞 + 名詞: 変数名は内容を具体的に表現
  • 省略禁止: 意味が分からなくなる省略は避ける

ルール2: ブール値の命名規則

ブール値には必ず「is」「has」「can」などの接頭辞を使用します。

ブール値の命名パターン

// 状態を表すブール値
const isLoading = true; // 読み込み中かどうか
const isValid = false; // 有効かどうか
const isVisible = true; // 表示されているかどうか
// 所有・存在を表すブール値
const hasPermission = true; // 権限を持っているか
const hasChildren = false; // 子要素があるか
const hasError = true; // エラーがあるか
// 能力・可能性を表すブール値
const canEdit = false; // 編集可能か
const canDelete = true; // 削除可能か
const shouldUpdate = false; // 更新すべきか

よくある間違いと修正例

// 悪い例
const active = true; // 何がアクティブ?
const permission = false; // 権限の有無が不明
const loading = true; // 状態が分かりにくい
// 良い例
const isActive = true; // アクティブ状態であることが明確
const hasPermission = false; // 権限を持っていないことが明確
const isLoading = true; // 読み込み中であることが明確

ルール3: 関数の命名規則

関数名は動詞で始まり、何をするかを明確に表現します。

動詞の選び方

// データの取得・作成・更新・削除
const getUserData = () => {}; // データを取得
const createUser = (userData) => {}; // ユーザーを作成
const updateUser = (id, data) => {}; // ユーザーを更新
const deleteUser = (id) => {}; // ユーザーを削除
// 検証・変換・計算
const validateEmail = (email) => {}; // メールアドレスを検証
const formatCurrency = (amount) => {}; // 通貨形式に変換
const calculateTax = (price) => {}; // 税金を計算
// 状態の変更・制御
const showModal = () => {}; // モーダルを表示
const hideModal = () => {}; // モーダルを非表示
const toggleMenu = () => {}; // メニューの表示切り替え

戻り値に応じた命名

// ブール値を返す関数
const isValidEmail = (email) => {
return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
};
// データを返す関数
const getUserById = (id) => {
return users.find(user => user.id === id);
};
// 加工したデータを返す関数
const formatUserName = (firstName, lastName) => {
return `${lastName} ${firstName}`;
};

ルール4: 定数の命名規則

定数はすべて大文字でアンダースコア区切りを使用します。

定数の命名例

// 設定値
const MAX_RETRY_COUNT = 3;
const DEFAULT_TIMEOUT = 5000;
const API_BASE_URL = 'https://api.example.com';
// エラーメッセージ
const ERROR_INVALID_EMAIL = 'メールアドレスが無効です';
const ERROR_USER_NOT_FOUND = 'ユーザーが見つかりません';
const ERROR_NETWORK_TIMEOUT = 'ネットワークタイムアウトです';
// ステータス値
const STATUS_PENDING = 'pending';
const STATUS_COMPLETED = 'completed';
const STATUS_FAILED = 'failed';

文脈に応じた命名戦略

スコープによる命名の使い分け

変数のスコープに応じて命名の詳細度を調整します。

ローカル変数(短いスコープ)

function calculateTotal(items) {
let sum = 0; // 短いスコープなので簡潔でも OK
for (const item of items) {
sum += item.price * item.quantity;
}
return sum;
}

グローバル変数(長いスコープ)

// 詳細で明確な命名が必要
const globalUserSessionManager = {
currentUser: null,
sessionTimeout: 3600000,
initializeSession: function(userData) {
this.currentUser = userData;
}
};

ドメイン固有の命名

業務領域に応じた適切な用語を使用します。

ECサイトの例

// 商品関連
const productCatalog = [];
const shoppingCart = [];
const orderHistory = [];
// 価格関連
const originalPrice = 1000;
const discountRate = 0.1;
const finalPrice = calculateDiscountedPrice(originalPrice, discountRate);
// 在庫関連
const stockQuantity = 50;
const isInStock = stockQuantity > 0;
const lowStockThreshold = 5;

金融システムの例

// 口座関連
const accountBalance = 100000;
const transactionHistory = [];
const creditLimit = 500000;
// 取引関連
const transferAmount = 50000;
const transactionFee = 108;
const exchangeRate = 110.5;

実践的な命名テクニック

対義語の一貫性

対になる概念は一貫した対義語を使用します。

推奨される対義語ペア

// 開始と終了
const startTime = new Date();
const endTime = new Date();
// 最小と最大
const minValue = 0;
const maxValue = 100;
// 前と次
const previousPage = 1;
const nextPage = 3;
// 表示と非表示
const showElement = () => {};
const hideElement = () => {};
// 有効と無効
const enableFeature = () => {};
const disableFeature = () => {};

単数形と複数形の使い分け

データの性質に応じて単数形と複数形を適切に使い分けます。

単数形と複数形の例

// 単一のデータ
const user = getCurrentUser();
const selectedItem = getSelectedItem();
const activeTab = getActiveTab();
// 複数のデータ
const users = getAllUsers();
const selectedItems = getSelectedItems();
const availableTabs = getAvailableTabs();
// 集計データ
const userCount = users.length;
const totalAmount = calculateTotal(selectedItems);
const averageScore = calculateAverage(scores);

コンテキストを活用した省略

文脈が明確な場合の適切な省略は許可されます。

適切な省略の例

// ユーザー管理クラス内では「user」で十分
class UserManager {
create(user) { // createUser ではなく create でも OK
// ユーザー作成処理
}
update(id, user) { // updateUser ではなく update でも OK
// ユーザー更新処理
}
delete(id) { // deleteUser ではなく delete でも OK
// ユーザー削除処理
}
}
// 配列の要素を処理する場合
const users = getAllUsers();
users.forEach(user => { // 単数形で OK
console.log(user.name);
});

命名規則のチェックリスト

基本チェック項目

命名時に確認すべき基本項目:

明確性のチェック

  • 目的が明確: 何をする・何を表すかが分かる
  • 型が推測可能: データ型が命名から推測できる
  • スコープ適切: スコープに応じた詳細度
  • 一貫性: プロジェクト全体で統一されている

技術的なチェック

// チェック例
const userAccountBalance = 100000; // ✓ 明確で具体的
const isEmailValid = true; // ✓ ブール値が明確
const calculateTotalPrice = () => {}; // ✓ 動作が明確
const data = {}; // ✗ 内容が不明
const flag = false; // ✗ 何の状態か不明
const doSomething = () => {}; // ✗ 動作が不明確

プロジェクト固有のルール

チーム・プロジェクトで統一すべき項目

命名規約の例

// ファイル名規則
// components/UserProfile.js ← PascalCase
// utils/formatCurrency.js ← camelCase
// constants/API_ENDPOINTS.js ← UPPER_SNAKE_CASE
// CSS クラス名規則
// .user-profile ← kebab-case
// .btn-primary ← BEM記法準拠
// .is-active ← 状態クラスに is- 接頭辞
// データベーステーブル名規則
// users ← 複数形・小文字
// user_profiles ← スネークケース
// order_items ← 関連テーブルも統一

よくある命名の間違いとその修正

間違い1: 抽象的すぎる命名

具体性に欠ける抽象的な命名の問題:

// 悪い例
const manager = new DataManager();
const processor = new ProcessorService();
const handler = new EventHandler();
// 良い例
const userAccountManager = new UserAccountManager();
const paymentProcessor = new PaymentProcessorService();
const buttonClickHandler = new ButtonClickHandler();

間違い2: 技術的すぎる命名

ビジネスロジックを技術用語で表現する問題:

// 悪い例
const arrayOfObjects = getDataFromAPI();
const jsonResponse = processHttpRequest();
const databaseRecord = fetchRowFromTable();
// 良い例
const userProfiles = getUserProfiles();
const paymentResult = processPayment();
const customerOrder = getOrderById();

間違い3: 不適切な省略

意味が分からなくなる省略の問題:

// 悪い例
const usr = getCurrentUser();
const addr = getUserAddress();
const pwd = getUserPassword();
// 良い例
const currentUser = getCurrentUser();
const userAddress = getUserAddress();
const userPassword = getUserPassword();

命名スキル向上の実践方法

日常的な練習方法

命名スキルを向上させる実践的な方法

コードレビューでの注意点

// レビュー観点
// 1. 命名の明確性
const calculateOrderTotal = (items) => { // ✓ 何を計算するか明確
// 実装
};
// 2. 一貫性
const getUserData = () => {}; // ✓ get + 名詞
const fetchUserProfile = () => {}; // ✓ fetch + 名詞(統一されていれば OK)
// 3. 適切なレベルの詳細度
const isValidEmailAddress = (email) => {}; // ✓ 適切な詳細度

リファクタリング練習

// 練習:以下のコードの命名を改善してください
// 改善前
const d = new Date();
const u = getUser();
const r = calculate(d, u);
const s = r > 100;
// 改善後の例
const currentDate = new Date();
const currentUser = getUser();
const loyaltyPoints = calculateLoyaltyPoints(currentDate, currentUser);
const isEligibleForBonus = loyaltyPoints > 100;

まとめ

プログラミングの命名においてセンスよりもルールが重要な理由と実践方法:

重要な命名ルール

  • 意味の明確性: 何をするか・何を表すかを明確に表現
  • ブール値: is/has/can などの接頭辞を使用
  • 関数: 動詞で始まり、動作を明確に表現
  • 定数: UPPER_SNAKE_CASE で表現
  • 一貫性: プロジェクト全体で統一

センスに頼らない実践方法

  • 体系的なルール: 明確なガイドラインに従う
  • チェックリスト: 命名時の確認項目を活用
  • 継続的改善: コードレビューでの継続的な改善
  • 実践練習: 既存コードの命名改善練習

命名品質向上のコツ

  • 文脈の活用: スコープに応じた適切な詳細度
  • ドメイン知識: 業務領域の適切な用語使用
  • チーム統一: プロジェクト固有のルール策定

良い命名は、センスではなく学習可能なスキルです。

今日から体系的なルールに従って命名を行うことで、あなたのコードの品質が確実に向上します。 ルールを身につけて、誰が見ても理解しやすいコードを書けるエンジニアを目指しましょう。

関連記事