こんにちは。
個人開発でnpmモジュールを公開する準備を進めている最中ですが、各クラスの命名ルールをなんとなく統一させたり、わかりやすい名前をつけることが難しいと感じていました。
関数名や変数名は表しやすいですが、クラス名となると複合的な要素を含むオブジェクトに名前をつけることになります。
クラスの名前は、クラスの役割によって決定されるべきなのは理解していましたが、基本的な命名案を自らにインプットする必要があると思い、命名原則を考える上で参考になる情報をまとめてみました。
大前提
- クラスは単一責任とする
- 命名を考える際に、そもそもそのクラスが大きすぎないか検討しましょう。
- たいていの場合、クラス名には名詞を用いる
- メソッド名は動詞を用いることが多いですが、クラス名は責務を持つモノとして捉えます。
- 記法はチームで統一する
- クラス名は概ねPascal記法が用いられますが、重要なことはプロジェクト内で記法が統一されていることです。
アンチパターン
下記の様なアンチパターンがあります。
要するに、クラスの役割と命名が離れてしまっていることが問題ですので、絶えず最適な名前がないか考えましょう。
- 複数形にしてしまう
- シンプルにわかりにくいです。
- ManagerやController、InfoやDataのような意味の広い名前をつけてしまう
- 広い名前をつけてしまえる場合は、クラスの複数の責務をもたせてしまっている可能性があります。
役割に応じたクラス名をつける
役割に応じたクラス名をつける一例を示します。
データソースを扱う
データのやり取りを行うクラスです。
外部リソースからデータを読み込んだり、保存したり、リクエストを投げるクラスが該当します。
DBを叩いたり、データを永続化するクラス
- Store
- Storage
- Registory
データをキャッシュするクラス
- Cache
ロギングを扱う、実行するクラス
- Log
- Logger
APIを叩くクラス
- Gateway
データを消すクラス
- Cleaner
- Sweeper
サーバに対するクライアントとなるクラス
- Client
データを読み込むクラス
- Fetcher
- Loader
データをパースするクラス
- Parser
データを加工する
受け取ったデータを、加工するクラスです。
データの絞り込みを行うクラス
- Filter
データを整形するクラス
- Formatter
データを集約するクラス
- Collector
データの抽出を行うクラス
- Extractor
UI上の動作をあつかう
ユーザーの操作を受け取って実行したい処理をまとめるクラスです。
UI上の動作を表すクラス
- Action
動作を受け取って、処理を実行するクラス
- Dispathcer
- Handler
動作を監視するクラス
- Listener
- Watcher
ツール
下記のように、実現したい日本語を記入するといい感じで英語に変換してくれるサービスもあります。
迷った場合は参考になります。
- プログラマーのためのネーミング辞書 | codic
codic - プログラマーのためのネーミング辞書codicは、プログラマーのためのネーミング辞書です。新しいcodicでは、翻訳エンジンを搭載しネーミングをジェネレートできるようになりました。
命名原則を知るメリット
今回、自分がクラス名をつける際の指針にすべく情報を集めている途中で気づいたのですが、
公開されているライブラリが何をしているかをなんとなく理解するうえでも役立つ知識だなと思いました。
わかりやすい命名をつけているライブラリであれば、コード自体を読まなくてもそのメソッドやクラスが何をしているか把握することができます。
これからも、より適切な命名がないか考え続けていきたいと思います。
参考
- クラスの命名のアンチパターン – Qiita https://qiita.com/magicant/items/8134edf969f9629fa66e#settings-utilities-contents-
- うまくクラス名を付けるための参考情報 – Qiita https://qiita.com/KeithYokoma/items/ee21fec6a3ebb5d1e9a8
コメント