teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

10

結論を追加

2019/04/09 00:04

投稿

notgoodpg
notgoodpg

スコア37

title CHANGED
File without changes
body CHANGED
@@ -1,5 +1,14 @@
1
+ ### 結論
2
+ クラスを作成し`static`なメンバ関数を利用する方法と`namespace`を定義して非メンバ関数を利用する方法で悩みましたが、
3
+ 最終的にnamespaceを定義する方向がよいのではないかという結論に至りました。
4
+
5
+ - クラスはメンバ変数を追加したり利用したり出来るので「ついうっかり」神クラス化してしまうリスクがある
6
+ - 汎用ライブラリでも同じ手法がとられている
7
+
8
+ ことが理由です。
9
+
10
+ ### 前提・実現したいこと
1
11
  宜しくお願い致します。
2
- ### 前提・実現したいこと
3
12
 
4
13
  具体的に発生している問題を解決したいという質問ではなく、クソコードを量産したくないけどどうすれば良いだろう?という抽象的な質問です。
5
14
 

9

見やすく?変更

2019/04/09 00:04

投稿

notgoodpg
notgoodpg

スコア37

title CHANGED
File without changes
body CHANGED
@@ -30,9 +30,17 @@
30
30
 
31
31
  そうした場合、
32
32
 
33
+ > - Utilityクラスを作っちゃうパターン
34
+ > クラスを作ってメンバ関数として実装。
33
- - クラスを作ってメンバ関数として実装(MyThresold()関数のみをメンバーに持ち、メンバ変数ももたないごく短いクラスになるでしょう)
35
+ > MyThresold()関数のみをメンバーに持ち、メンバ変数も活用しないごく短いクラスになるでしょう
36
+ >
37
+ > - 静的関数だけのUtilityクラスを作っちゃうパターン
34
- - クラスを作って`public:static`属性のついた関数として実装
38
+ > クラスを作って`public:static`属性のついた関数として実装
39
+ > 個人的にはここまでするとクラスとして定義する理由が希薄に感じます。
40
+ >
41
+ > - オブジェクト指向とは?パターン
35
- - `namespace`を定義してその中に非メンバ関数(free-function)として実装
42
+ > `namespace`を定義してその中に非メンバ関数(free-function)として実装
43
+ > クラスの旨みを使わないならクラスを使わなければいいんだ!的な発想。将来的にどうなってしまうか3つの中でもっとも想像のつかないパターンです。
36
44
 
37
45
  の3パターンが思いつくのですがどの手法がよいか、または別に適切な方法があればご教授ください。
38
46
  どの方法がどう駄目か、という意見でもありがたいです。

8

気になった記述を修正

2019/04/08 06:04

投稿

notgoodpg
notgoodpg

スコア37

title CHANGED
File without changes
body CHANGED
@@ -30,9 +30,9 @@
30
30
 
31
31
  そうした場合、
32
32
 
33
- - クラスを作って関数として実装(MyThresold()関数のみをメンバーに持ごく短いクラスになるでしょう)
33
+ - クラスを作ってメンバ関数として実装(MyThresold()関数のみをメンバーに持ち、メンバ変数ももたないごく短いクラスになるでしょう)
34
34
  - クラスを作って`public:static`属性のついた関数として実装
35
- - `namespace`を定義してその中にどのクラスにも属さない関数(free-function)として実装
35
+ - `namespace`を定義してその中に非メンバ関数(free-function)として実装
36
36
 
37
37
  の3パターンが思いつくのですがどの手法がよいか、または別に適切な方法があればご教授ください。
38
38
  どの方法がどう駄目か、という意見でもありがたいです。

7

文章を追加

2019/04/08 05:43

投稿

notgoodpg
notgoodpg

スコア37

title CHANGED
File without changes
body CHANGED
@@ -31,10 +31,12 @@
31
31
  そうした場合、
32
32
 
33
33
  - クラスを作って関数として実装(MyThresold()関数のみをメンバーに持つごく短いクラスになるでしょう)
34
- - クラスを作って`static`属性のついた関数として実装
34
+ - クラスを作って`public:static`属性のついた関数として実装
35
- - `namespace`を定義してその中にどのクラスにも属さない関数として実装
35
+ - `namespace`を定義してその中にどのクラスにも属さない関数(free-function)として実装
36
36
 
37
37
  の3パターンが思いつくのですがどの手法がよいか、または別に適切な方法があればご教授ください。
38
+ どの方法がどう駄目か、という意見でもありがたいです。
39
+ 正しい方法は場合によりけりと思いますが、基本的な方針を決めることでコードの品質を上げられると思っています。そのために皆様にご意見を頂けると助かります。
38
40
 
39
41
  ###当質問のクローズ条件
40
42
 

6

サンプルソースの修正

2019/04/08 04:26

投稿

notgoodpg
notgoodpg

スコア37

title CHANGED
File without changes
body CHANGED
@@ -10,14 +10,15 @@
10
10
  画像からあるスコアを算出するという目的を持ったクラス`CImgPrf`内で
11
11
  「画像データを格納できる型Matに格納したデータを2値化したい!」という機能を以下ように実装したとします
12
12
  ```c++
13
+ // 20190408 ソースに戻り値の型がない問題、宣言していない変数を使っている点を変更しました。
13
- CImgPrf::MyThreshold(cv::Mat & srcImg)
14
+ cv::Mat CImgPrf::MyThreshold(const cv::Mat & srcImg, const int lowThreshold, const int hightThresold)
14
15
  {
15
16
  //グレースケール化
16
17
  cv::Mat gryImg;
17
18
  cv::cvtColor(srcImg, gryImg, CV_BGR2GRAY);
18
19
  //2値化
19
20
  cv::Mat binImg;
20
- cv::threshold(gryImg, binImg, lowerThreashold, upperThreshold, CV_THRESH_BINARY);
21
+ cv::threshold(gryImg, binImg, lowThreshold, hightThresold, CV_THRESH_BINARY);
21
22
  return binImg;
22
23
  }
23
24
 

5

タイトルを抽象性の高い質問である旨わかるよう変更

2019/04/08 03:08

投稿

notgoodpg
notgoodpg

スコア37

title CHANGED
@@ -1,1 +1,1 @@
1
- Utilityクラスを作らないようにしたい
1
+ (プログラミングの手法、方針について)Utilityクラスを作らないようにしたい
body CHANGED
File without changes

4

こういう質問はクローズしないまま放置されているパターンがあるのでクローズ条件明記

2019/04/05 08:04

投稿

notgoodpg
notgoodpg

スコア37

title CHANGED
File without changes
body CHANGED
@@ -35,6 +35,10 @@
35
35
 
36
36
  の3パターンが思いつくのですがどの手法がよいか、または別に適切な方法があればご教授ください。
37
37
 
38
+ ###当質問のクローズ条件
39
+
40
+ もし回答をいただけなくても1週間程度でクローズします。
41
+
38
42
  ### 補足情報(FW/ツールのバージョンなど)
39
43
  - VC++
40
44
  - VisualStudio2015 SP1

3

例示した関数名がopencvと関数がかぶってしまうので修正(頭文字が大文字小文字の違いはあるが紛らわしい)

2019/04/05 08:03

投稿

notgoodpg
notgoodpg

スコア37

title CHANGED
File without changes
body CHANGED
@@ -10,7 +10,7 @@
10
10
  画像からあるスコアを算出するという目的を持ったクラス`CImgPrf`内で
11
11
  「画像データを格納できる型Matに格納したデータを2値化したい!」という機能を以下ように実装したとします
12
12
  ```c++
13
- CImgPrf::Threshold(cv::Mat & srcImg)
13
+ CImgPrf::MyThreshold(cv::Mat & srcImg)
14
14
  {
15
15
  //グレースケール化
16
16
  cv::Mat gryImg;
@@ -29,7 +29,7 @@
29
29
 
30
30
  そうした場合、
31
31
 
32
- - クラスを作って関数として実装(おそらくごく短い関数になるでしょう)
32
+ - クラスを作って関数として実装(MyThresold()関数のみをメンバーに持つごく短いクラスになるでしょう)
33
33
  - クラスを作って`static`属性のついた関数として実装
34
34
  - `namespace`を定義してその中にどのクラスにも属さない関数として実装
35
35
 

2

誤字修正

2019/04/05 07:47

投稿

notgoodpg
notgoodpg

スコア37

title CHANGED
File without changes
body CHANGED
@@ -4,6 +4,7 @@
4
4
  具体的に発生している問題を解決したいという質問ではなく、クソコードを量産したくないけどどうすれば良いだろう?という抽象的な質問です。
5
5
 
6
6
  Utilityクラスを作らないようにしたい
7
+
7
8
  仮に、
8
9
  画像/映像処理オープンソースライブラリであるOpenCVを利用したプロジェクトにおいて
9
10
  画像からあるスコアを算出するという目的を持ったクラス`CImgPrf`内で
@@ -28,12 +29,12 @@
28
29
 
29
30
  そうした場合、
30
31
 
31
- - クラスを作って関数として実装
32
+ - クラスを作って関数として実装(おそらくごく短い関数になるでしょう)
32
- - クラスを作ってstatic属性のついた関数として実装
33
+ - クラスを作って`static`属性のついた関数として実装
33
- - namespaceを定義してその中にどのクラスにも属さない関数として実装
34
+ - `namespace`を定義してその中にどのクラスにも属さない関数として実装
34
35
 
35
- の3パターンが思いつくのですがどの手法がよいか、またはどれも最でなくより適切な方法があればご教授ください。
36
+ の3パターンが思いつくのですがどの手法がよいか、または別に適切な方法があればご教授ください。
36
37
 
37
38
  ### 補足情報(FW/ツールのバージョンなど)
38
- - CV++
39
+ - VC++
39
40
  - VisualStudio2015 SP1

1

途中で投稿してしまったので追記

2019/04/05 07:44

投稿

notgoodpg
notgoodpg

スコア37

title CHANGED
File without changes
body CHANGED
@@ -10,12 +10,15 @@
10
10
  「画像データを格納できる型Matに格納したデータを2値化したい!」という機能を以下ように実装したとします
11
11
  ```c++
12
12
  CImgPrf::Threshold(cv::Mat & srcImg)
13
+ {
14
+ //グレースケール化
13
15
  cv::Mat gryImg;
14
- //グレスケ化
15
16
  cv::cvtColor(srcImg, gryImg, CV_BGR2GRAY);
16
17
  //2値化
17
- cv::Mat binImg;
18
+ cv::Mat binImg;
18
19
  cv::threshold(gryImg, binImg, lowerThreashold, upperThreshold, CV_THRESH_BINARY);
20
+ return binImg;
21
+ }
19
22
 
20
23
  ```
21
24
  ところがこの2値化する処理は、画像にある処理を施してその画像をメンバのリストに追加する`CEditImgList`内でも必要である