質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Q&A

解決済

3回答

3315閲覧

クラスの責務の切り分け方について

msx2

総合スコア174

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

0グッド

2クリップ

投稿2017/07/04 06:51

編集2017/07/05 00:50

データのコンバートを一括で行う処理を作成しています。

この処理を実装するためにコンバート処理全体を管轄する管理クラスと実際にコンバートを行う処理クラスを作りました。
処理するデータは複数あるので管理クラスはデータのIDを配列で持っています。

管理クラスが処理クラスを使ってコンバート処理を行う方法として2パターン考えられます。

【1】管理クラスがID配列を回して処理クラスに1件ずつ処理させる
【2】処理クラスにID配列を渡して丸投げする

個人的には【1】の方が好みで、私が作ると処理クラスは関数をクラスメソッドにしただけみたいな感じになります。
処理クラスは状態も持たずシンプルでいいのですが管理クラスが太ってしまいます。

管理クラスを太らさないためには【2】の処理クラスに処理を丸投げしてしまうことだと思います。
この場合、ID配列だけでなく管理クラスの持つ他の情報も処理クラスに渡す必要があり面倒なので【2】の方法はあまり使ってきませんでした。

この2つの方法がどちらがいいのか、それとも他の方法があるのか?
ケースバイケースだと思いますが、どのように考えてクラスの責務を切り分けていけばいいのかわからず質問しました。

よろしくお願いします。

追記(2017-7-5)

処理全体を管理する管理クラスと実際に処理を行うクラスという継承関係のないクラスを親クラス・子クラスと表現していました。大変申し訳ございません。
質問文を管理クラス・処理クラスに修正しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

やりたいことから考えると親クラスと子クラスという関係性ではないと思いますよ。

1つの管理クラスと1つのコンバート処理インターフェースと複数のコンバート処理インターフェース実装クラスを作る必要があると思います。

実際には管理クラスが1つのデータに対して、どのコンバート処理を適用するかを決め、データをコンバート処理インターフェース実装クラスに渡すという作りになりそうですね。

投稿2017/07/04 07:10

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

msx2

2017/07/04 07:18

そうなんです。データのコンバート先が複数ありまして、複数のコンバート処理を考えています。 インターフェースは全く考えていませんでした。。 最終的にはコンバート処理インターフェース実装クラスに全部お任せしてしまうことになるでしょうか?
yona

2017/07/04 07:25

コンバート処理でなにをするかにも寄りますが任せてしまった方がいいと思います。
msx2

2017/07/04 07:37

ありがとうございます! 任せてしまう方法で考えます!!
guest

0

こんにちは。

子クラスは関数をクラスメソッドにしただけみたいな感じになります。

クラスメソッドだけでインスタンス変数を持たないクラスは、オブジェクト指向的なクラスではなく、単に複数の関数をひとまとめにしただけのものです。
そのようなケースで、親クラス自身がデータ・コンバートを担うのであれば、そのコンパートに必要な関数群をまた別の子クラスにまとめる必要性が今ひとつ分かりません。
しかし、その方が可読性/メンテナンス性が上がるようであれば、クラスメソッドのみの子クラスを導入するのもありと思いますし、特にメリットがないなら、子クラスを設けず親クラスのインスタンス・メソッドとして実装しても良いように感じます。

【2】は意味がないように感じます。記載されている内容だけですと、親クラスの責務のほぼ全てを子クラスに移譲するだけのように見えます。

意味のある単位でクラスを切り出せる時は、クラスが異様に太るより分割した方が良いと思います。意味がある単位で切り出せない時に無理にクラス分割するのは如何なものかと感じます。クラス分割は可読性やメンテナンス性を良くするための手段です。無理に分割して可読性やメンテナンス性が劣化するようですと本末転倒です。

投稿2017/07/04 07:33

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

msx2

2017/07/04 07:58

ご指摘の通り子クラスはオブジェクト指向的というよりも単なる可読性のために分割していることが多いです。 今回はコンバート処理が複数あり今後も増加していくことに対応するためのクラス分割をしようとチャレンジしています。 こういうケースが初めてでどうしたものかと質問させていただきました。 ご回答ありがとうございました!!
momon-ga

2017/07/04 10:49

ちなみに、子クラスというのは本当に継承関係のある子クラスなのでしょうか? yonaさんの指摘にあるとおり、関係性が違うというか、違和感あるので 可読性が下がります・・・
Chironian

2017/07/04 12:11

文脈的には継承関係ではないように読み取れます。なので、この場合の親子は継承関係ではなくて、クラス内定義クラスのことかなと思って回答してみました。
momon-ga

2017/07/04 12:19

あ、言葉足らずでした。msx2さんへの質問だったのです。 雰囲気的には、継承関係無いだろうなと思いつつ、親クラス、子クラスの意味合ってるかなと確認したかったのです。
msx2

2017/07/04 13:25

大変失礼しました。ごめんなさい! オブジェクト指向で親子といえば継承関係の事ですよね。 Chironianさんの言うとおり継承関係ではありません。 こういうのは何て表現したらいいのでしょう?他のクラスを使って機能を実現するまとめ役みたいなクラスを言いたいんですけど(汗)
guest

0

配列の逐次アクセスにコストがかかるか否か、配列だけでなく、様々なコンテナを想定するのかなどを考慮するケースかと思いますが、データコンバートであれば、データの再利用は考慮不要ですし、逐次アクセスにおいてそれほどコストがかからないと思われます。

また、債務の切り分けなどクラス構造などを考える際にはデザインパターンの考え方が参考になると思います。

そして、上記の条件を考慮すると、イテレータパターンがよろしいのではないでしょうか。

結果的に、1に近いかもしれません。

投稿2017/07/04 07:02

t_obara

総合スコア5488

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

msx2

2017/07/04 07:13

ご回答ありがとうございます。 デザインパターンは少しだけ勉強して離れてしまいましたが、実践できる機会があれば少しずつ取り入れてみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問