コードの可読性向上だけじゃない名前設計にする為に・・・
はじめに
実装の際、変数やメソッドの命名に迷ったり、曖昧な名前をつけてしまったことで予期せぬバグを引き起こした経験はないでしょうか?
命名はプログラミングの基本ですが、慣れてくればくるほどおろそかにしてしまいがちで、その影響は意外と大きく、適切な名前をつけるだけでコードの可読性や保守性が大きく向上します。
本記事では、すぐに実践できて効果の大きいコード品質改善の一つとして「名前設計」に焦点を当て、私が変数やメソッドの命名時に意識しているポイントを紹介します。
名前設計をしっかりしないと及ぼす悪影響
- コードが読みづらくなり、理解に時間がかかる
- バグの原因になりやすく、誤った使い方を招く
- メンテナンスコストが増大する
- チーム開発で意図や目的のズレが生じて、実装ミスにつながる
- コードが肥大化・複雑化し、密結合になりやすくなる
パッと思いつくだけでもこれだけの悪影響があるので、名前設計をしっかりして適切な名前を付けることは、コード品質や開発効率を大きく左右する重要な要素と言えます。
各悪影響の具体例と対策
次に前述した悪影響を引き起こす可能性のあるコード例とそれに対する1つの改善案の例を紹介する。
コードが読みづらくなり、理解に時間がかかる
❌ 悪影響を及ぼす可能性のある例
$dt = getData($id);
✅ 改善案
$userRegistrationDate = getUserRegistrationDate($userId);
$dtでは何のデータか分からず、getData()メソッドも何を取得するのか曖昧である。
適切な名前をつけることで、コードを見ただけで意図が分かるようになる。
バグの原因になりやすく、誤った使い方を招く
❌ 悪影響を及ぼす可能性のある例
function getUser($id) {
return $this->db->find($id);
}
✅ 改善案
function getActiveUserById($userId) {
return $this->db->findActiveUser($userId);
}
悪影響を及ぼす可能性のある例では、「ユーザーを取得する」と思っていたら、実際は「削除済みのユーザーも含めて取得してしまう」可能性がある。
メソッド名に「アクティブなユーザーのみ取得する」意図を明示することで、誤った使い方を防げる。
メンテナンスコストが増大する
❌ 悪影響を及ぼす可能性のある例
class DataManager {
function process() { ... }
}
✅ 改善案
class OrderProcessor {
function processPayment() { ... }
}
「DataManager」という名前では「何のデータを管理するのか」が不明確で、process() も何を処理するのか分からない。
「OrderProcessor」とすることで、「注文を処理するクラス」だと分かり、処理内容が明確になる。
チーム開発で意図や目的のズレが生じて、実装ミスにつながる
❌ 悪影響を及ぼす可能性のある例
function updateUser($user) { ... }
✅ 改善案
function updateUserProfile($user) { ... }
function resetUserPassword($userId) { ... }
メソッド名が「updateUser」だけだと「ユーザーの情報を更新するのか?」「パスワードリセットも含むのか?」など、意図が曖昧になる。
updateUserProfileやresetUserPasswordとすることで、何をする関数なのか明確になる。
コードが肥大化・複雑化し、密結合になりやすくなる
❌ 悪影響を及ぼす可能性のある例
class DataManager {
function processData($input) {
// 何を処理しているのか不明
}
}
✅ 改善案
class OrderProcessor {
function calculateTotalPrice(Order $order) {
// 注文金額の計算
}
}
class OrderRepository {
function saveOrder(Order $order) {
// データベースに注文を保存
}
}
-
曖昧な名前が原因で、余計な責務を追加しやすくなる
曖昧な名前を付けてしまうことで、気付いたら色々な処理が追加されて、巨大化してしまう -
適切な名前がないと、機能ごとの役割がはっきりしない
どのデータをどう処理するのかが分からず、他の関数と混ざりやすい -
密結合が発生しやすくなる
どのクラスが何をするのか分かりにくい → なんとなく関連しそうな処理を追加する → 責務が曖昧になり、結合度が高くなる
命名する時のワンポイント
できる限り具体的で、意味が明確な、目的に特化した名前を選ぶ。
これは私がある書籍を読んでからずっと意識しているポイントです。
例えば、「住所」というのは、存在ベースの名前ですが、目的ベースで考えると「勤務先」や「本拠地」となるように目的ベースで考えるようにする。
馴染みのある「ユーザー名」を例にすると、目的ベースで考えると「表示名」や「法人名」などになる。
最後に
このように変数やクラスやメソッドの命名は、コードの可読性向上だけではなく、保守性や開発効率を大きく左右する要素といえます。
命名がしっかりしているだけで、意図が明確になり、バグを防ぎやすくなり、チーム開発でも意思疎通がスムーズに進む。
プログラムは一度書いたら何度も読むことになり、それが自分だけとは限らないので、「自分だけでなく、他の開発者が見ても迷わない名前になっているか?」を意識しながら命名することが大切だと考えています。
Discussion