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

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

ただいまの
回答率

90.50%

  • オブジェクト指向

    328questions

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

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 1,125

msx2

score 155

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

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

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

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

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

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

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

よろしくお願いします。

追記(2017-7-5)

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+3

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/04 16:18

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

    キャンセル

  • 2017/07/04 16:25

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

    キャンセル

  • 2017/07/04 16:37

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

    キャンセル

+1

こんにちは。

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/04 16:58

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

    キャンセル

  • 2017/07/04 19:49

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

    キャンセル

  • 2017/07/04 21:11

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

    キャンセル

  • 2017/07/04 21:19

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

    キャンセル

  • 2017/07/04 22:25

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

    キャンセル

0

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/04 16:13

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

    キャンセル

同じタグがついた質問を見る

  • オブジェクト指向

    328questions

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