プログラミングで重要なのは、単に動くコードを書くことではなく、誰が見てもその目的が理解できるコードを書くことです。
本記事では、C#でRPGゲームのようなサンプルコードを通して、目的駆動の名前設計の方法をご紹介します。
他のプログラミング言語でも応用可能な考え方と、よくある「悪い例」と「良い例」を対比させながら、読みやすく拡張性のあるコードを実現するための命名方法について解説します。
名前設計の重要性とは?
コードの可読性と保守性を向上させるためには、意味が明確な名前を使うことが不可欠です。名前設計が不適切だと、チームメンバーや後からコードを読んだ人が意図を理解しづらくなり、バグの原因や修正の手間が増えます。
特に「技術駆動命名」ではなく、「目的駆動命名」により、プログラムが何をするものかを明確に表現することがポイントです。
悪い名前設計の例
以下のコードは、RPGゲームに登場する「プレイヤー」が「アイテム」を入手する場面を例にしたものですが、技術駆動的な命名がされているため、何をしているのかが分かりづらくなっています。
public class RPGPlayer
{
public int hp; // ヒットポイント
public int mp; // マジックポイント
public List<string> itemList; // アイテムリスト
public void DoItem()
{
foreach (var i in itemList)
{
// アイテムの処理
if (i == "heal")
{
hp += 10;
}
else if (i == "mana")
{
mp += 5;
}
}
}
}
解説
DoItemという名前ではメソッドの内容が不明確で、目的がわかりません。itemListも役割が漠然としており、アイテムが何に使われるのかが理解しづらいです。
目的駆動で設計された名前の良い例
ここでは、同じ処理を目的駆動でわかりやすくした名前設計で改善します。プレイヤーが特定の効果を持つアイテムを利用する状況を意識したコードにします。
public class Player
{
public int HealthPoints { get; private set; }
public int MagicPoints { get; private set; }
public List<string> Inventory { get; private set; }
public Player()
{
HealthPoints = 100;
MagicPoints = 50;
Inventory = new List<string>();
}
public void UseHealingItem()
{
if (Inventory.Contains("HealingPotion"))
{
HealthPoints += 10;
Inventory.Remove("HealingPotion");
}
}
public void UseManaItem()
{
if (Inventory.Contains("ManaPotion"))
{
MagicPoints += 5;
Inventory.Remove("ManaPotion");
}
}
}
解説
UseHealingItemとUseManaItemという具体的なメソッド名にすることで、アイテムの用途が明確になります。HealthPointsやMagicPointsなど、意味が直感的にわかるプロパティ名にすることで、クラス全体の目的が理解しやすくなります。Inventoryは「持ち物」という意味が明確になり、リストの内容が何かを示しています。
名前設計におけるコツとポイント
名前設計は、コードの可読性と保守性を大きく左右する要素です。適切な名前を付けることで、コードの意図がより伝わりやすくなり、後から見ても理解しやすいものになります。以下は、名前設計における主なコツとポイントです。
1. メソッド名は「動詞+名詞」の形にする
メソッドは動作を表すものなので、動詞から始めるとその役割が明確になります。動詞の後には、そのメソッドが操作する対象の名詞を組み合わせることで、何をするメソッドかを具体的に伝えることができます。
- 例:
CalculateScore,UpdatePlayerHealth,FetchInventoryItems
2. 意味のあるコンテキストを含める
変数名やメソッド名には、使用されるコンテキストを反映させることで、より直感的に理解できる名前になります。名前だけで目的が理解できるようにするために、できるだけ具体的な言葉を選びましょう。
- 例:
ExperiencePoints,HealthPoints,PlayerInventory ExperiencePointsはRPGの文脈で経験値を示す名前として直感的です。
3. プロジェクト全体で一貫性を保つ
同じような役割を持つ要素には、一貫性のある命名規則を使いましょう。命名規則に一貫性がないと、コードが分かりづらくなり、後々の修正で手間がかかります。
- 例:
InventoryItemsという名前を統一して使用し、他の部分でitemListなどを混在させない
4. 単数形・複数形を意識してリストやコレクションを明確化する
リストや配列などのコレクションを扱う場合は、複数形にすることで、複数のアイテムを含むコレクションであることを示します。単数形と複数形を使い分けるだけで、コレクションか単一のオブジェクトかを視覚的に区別できるため、意図が分かりやすくなります。
- 例:
items(コレクション)とitem(単一の要素)
5. 略語や曖昧な省略形は避ける
省略形や略語を使用すると、コードの意味が伝わりにくくなります。特に後から読む人や別の開発者にとって理解が難しくなるため、なるべくフルネームを使い、略語は避けるようにしましょう。
- 悪い例:
tempVal,procItem - 良い例:
temporaryValue,ProcessItem
6. 業務や目的に沿った用語を使用する
業務やアプリケーションの目的に沿った名前を使用することで、コードが何を意図しているのかが伝わりやすくなります。特にビジネスロジックや業務ロジックに関連する部分では、実際の業務で使われている用語やフレーズを取り入れると理解しやすくなります。
- 例:
CalculatePlayerScore、GenerateReportData
7. 状態や属性を表すプロパティ名には名詞を使う
プロパティやフィールド名には、状態や属性を表す名詞を使うと、直感的にその役割が理解できるようになります。数値や文字列などの属性を持つプロパティは、変数名が状態を反映することでより分かりやすくなります。
- 例:
HealthPoints,ManaPoints,AttackPower
これらのポイントを実践することで、コードの可読性が向上し、チーム全体で理解しやすいコードを作成できるようになります。
まとめ
- 動詞+名詞 を使って、メソッドの目的を明確に
- 意味のあるコンテキストを含む名前を設計
- 一貫性を持たせて、同じ概念には同じ名前を適用
- 単数形と複数形を適切に使い分けて、コレクションを明確化
- 省略語は避け、原則としてフルネームを使用
- 業務や目的に関連する用語を積極的に使用して理解を深める
以上のコツとポイントを活用し、コードの可読性と保守性を高めましょう。
