はじめに
C++ソフトウェア設計 ではprivateなメンバ関数をテストするために、private な関数をフリー関数(自由関数、外部関数)にすることを紹介しています。正直なところ「本気かよ!」となったので、参考文献に挙げられていたEffective C++ 第3版をはじめ他の文献でも触れられていました。それぞれで表現が異なりますが、結合度を削減することを重視していることが分かります。
これまではカプセル化を重視してメンバ関数として定義するか悩むことがあったのですが、堂々と非メンバ関数として定義していけます。
Effective C++ 第3版
「23 項 メンバ関数より、メンバでもfriendでもない関数を使おう」に下記記載があります。
メンバ関数より、メンバでもfriendでもない関数を使おう。それによって、カプセル化の度合いが増し、柔軟性と機能拡張性を持たせることになる。
C++Coding Standards: 101のルール、ガイドライン、ベストプラクティス
「44. 非メンバーかつ非friend の関数を書くようにしよう」に下記記載があります。
メンバー会費を避けよう:できるだけ関数を非メンバーかつ非friendにしよう
さらに関数をメンバーかfriendにすべきかを決定するアルゴリズムも記載されています。
C++のためのAPIデザイン
「2.5.2. クラス結合度の削減」に下記記載があります。
選択できるなら、関数宣言はメンバ関数ではなく非メンバ非フレンド関数として宣言すべきだ。こうすれば、カプセル化が強化され、関数のクラスへの結合度を削減できる。
C++ソフトウェア設計
「ガイドライン4:テスト可用性に備え設計する」でprivate メンバ関数をテストする方法の「真の解」としてprivate メンバ関数をフリー関数(自由関数、外部関数)にすることを挙げています。
C++ Core Guidelines
C.4: Make a function a member only if it needs direct access to the representation of a class で
Google C++ Style Guide
staticなメンバ関数を使うより、非メンバ関数を勧めています。
Nonmember, Static Member, and Global Functionsに下記記載があります。
Do not use a class simply to group static members.
参考文献
書籍
- C++ソフトウェア設計
- Effective C++ 第3版
- C++Coding Standards: 101のルール、ガイドライン、ベストプラクティス
- C++のためのAPIデザイン
- リファクタリング(第2版)