質問: ### 結論 クラスを作成し`static`なメンバ関数を利用する方法と`namespace`を定義して非メンバ関数を利用する方法で悩みましたが、 最終的にnamespaceを定義する方向がよいのではないかという結論に至りました。 * クラスはメンバ変数を追加したり利用したり出来るので「ついうっかり」神クラス化してしまうリスクがある * 汎用ライブラリでも同じ手法がとられている ことが理由です。 ### 前提・実現したいこと 宜しくお願い致します。 具体的に発生している問題を解決したいという質問ではなく、クソコードを量産したくないけどどうすれば良いだろう?という抽象的な質問です。 Utilityクラスを作らないようにしたい 仮に、 画像/映像処理オープンソースライブラリであるOpenCVを利用したプロジェクトにおいて 画像からあるスコアを算出するという目的を持ったクラス`CImgPrf`内で 「画像データを格納できる型Matに格納したデータを2値化したい!」という機能を以下ように実装したとします ``` // 20190408 ソースに戻り値の型がない問題、宣言していない変数を使っている点を変更しました。 cv::Mat CImgPrf::MyThreshold(const cv::Mat & srcImg, const int lowThreshold, const int hightThresold) { //グレースケール化 cv::Mat gryImg; cv::cvtColor(srcImg, gryImg, CV_BGR2GRAY); //2値化 cv::Mat binImg; cv::threshold(gryImg, binImg, lowThreshold, hightThresold, CV_THRESH_BINARY); return binImg; } ``` ところがこの2値化する処理は、画像にある処理を施してその画像をメンバのリストに追加する`CEditImgList`内でも必要である さらにその後、この2値化処理を必要とするクラスが後にどんどん増えてゆく・・・ とします。 そうした場合、 > > - Utilityクラスを作っちゃうパターン > > クラスを作ってメンバ関数として実装。 > > MyThresold()関数のみをメンバーに持ち、メンバ変数も活用しないごく短いクラスになるでしょう。 > > > - 静的関数だけのUtilityクラスを作っちゃうパターン > > クラスを作って`public:static`属性のついた関数として実装。 > > 個人的にはここまでするとクラスとして定義する理由が希薄に感じます。 > > > - オブジェクト指向とは?パターン > > `namespace`を定義してその中に非メンバ関数(free-function)として実装。 > > クラスの旨みを使わないならクラスを使わなければいいんだ!的な発想。将来的にどうなってしまうか3つの中でもっとも想像のつかないパターンです。 > > > の3パターンが思いつくのですがどの手法がよいか、または別に適切な方法があればご教授ください。 どの方法がどう駄目か、という意見でもありがたいです。 正しい方法は場合によりけりと思いますが、基本的な方針を決めることでコードの品質を上げられると思っています。そのために皆様にご意見を頂けると助かります。 ### 当質問のクローズ条件 もし回答をいただけなくても1週間程度でクローズします。 ### 補足情報(FW/ツールのバージョンなど) * VC++ * VisualStudio2015 SP1
回答: 汎用ライブラリの代表的なものとして Math ライブラリがありますので、「cmath (math.h)」や .NET Framework の「Math クラス」を参考にされるのが良いかと思います。