名前重要!具体的過ぎるメソッド名や変数名の弊害と適切な抽象度

メンターのyuuuこと岡嵜(おかざき)です。私は普段、生徒のみなさんの提出物や日報をレビューしています 💪 最近、提出物のレビューで「このメソッド(または関数)の名前はもう少し抽象化した方が、利用しやすくなりますね」というコメントをする機会が増えているので、共有を目的にブログ記事を書きます 📝 なお、ここではメソッド名を対象に説明しますが、変数名についてもほぼ同じ考え方を適用できます。 ## 例題: 消費税計算をするメソッド 消費税が10%固定だとして、こういったメソッドを作ったとします。 ※現時点では軽減税率は考慮しない仕様としています。 ```ruby def function_name(price) price * (1 + 0.10) end ``` このメソッドの `function_name` をどういった名前にするか、考えてみてください。 ## 解答例 消費税計算をするメソッドなので `include_tax` のような名前が想定されますね 💰 ```ruby def include_tax(price) price * (1 + 0.10) end ``` ## レビューで散見される「具体的過ぎるメソッド名」 今回の場合、「消費税計算をする」という比較的身近かつ抽象的なお題から入っているので、 `include_tax` のような名前をすんなり思いついたかもしれません。 ただ、実際のプラクティスでは「10%を適用するので `apply_10_percent` というメソッド名にしました」というような、具体的過ぎるメソッド名を目にすることがあります。 ```ruby def apply_10_percent(price) price * (1 + 0.10) end ``` ## 具体的過ぎるメソッド名の弊害 このような「具体的過ぎるメソッド名」には以下のような弊害があります。 - メソッドにする意味がない - 抽象度が変わらないなら、メソッドを呼んでいる箇所にそのまま処理を書いても読みやすさは同じのはず - 変化に弱い - 税率が変わったり軽減税率を適用しようとしたりすると、メソッド名も変える必要が生じる - 用途が読み取れない - 10%を適用するのはなぜなのか?どういう時に使うべきなのかがわからない ## 抽象的過ぎるメソッド名の弊害 「具体的過ぎるメソッド名」が良くないからと、「抽象的過ぎるメソッド名」にするのも良くありません。 ```ruby def process(price) price * (1 + 0.10) end ``` 大抵のメソッド名が `process` になってしまいそうですよね 😅 何をするメソッドなのかも読み取れません。 「そのメソッド中で行っている処理を1段階抽象化する」のが目安です 👍 (過度に抽象的=無味無臭な名前、とも言えます → [参考](https://twitter.com/jnchito/status/1571287095574138881)) ## まとめ 具体的過ぎるメソッド名の弊害と、抽象度の目安について書かせていただきました。 プログラミングをしているとメソッドや関数は頻繁に作るものだと思いますので、名前を考えるときに少しでもこの記事のことを思い出してもらえると幸いです 🙏 ### おまけ プログラミング用の技術書ではないですが、抽象的に考えるのが苦手、という人はこちらの本を読んでみるといいかもしれません。 [具体と抽象 ―世界が変わって見える知性のしくみ | 細谷 功 |本 | 通販 | Amazon](https://www.amazon.co.jp/dp/4907623100/)