aono1234
@aono1234

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

クラスの抽象化レベルはどこまで?

クラスはどこまで抽象化すればよいのか?

現在、グラフのフィルター機能をクラスで作成しているのですが、
当方クラスを使ったことのない初心者であるため、
どこまでクラスで抽象化したらよいのかわかっておりません。
皆様のご意見を伺えたら幸いです。

テキストベースですが以下が現在考えているオブジェクトイメージとなります。

作成オブジェクトイメージ

業務時間フィルターオブジェクト
            プロパティ
                期間開始日
                期間終了日
                分割セグメント配列
            メソッド
                各セグメントの業務時間を分割セグメントへ代入する
                分割セグメント配列の中の時間を業務区分毎に分ける
                分割セグメント配列をグラフに表示する

        月別業務時間フィルターオブジェクト
            プロパティ
                期間開始月
                期間終了月
                分割セグメント配列
            メソッド
                各セグメントの業務時間を分割セグメントへ代入する
                分割セグメント配列の中の時間を業務区分毎に分ける
                分割セグメント配列をグラフに表示する

        年別業務時間フィルターオブジェクト
            プロパティ
                期間開始年
                期間終了年
                分割セグメント配列
            メソッド
                各セグメントの業務時間を分割セグメントへ代入する
                分割セグメント配列の中の時間を業務区分毎に分ける
                分割セグメント配列をグラフに表示する



残業時間オブジェクト
        日別残業時間更新オブジェクト
           プロパティ
                期間開始日
                期間終了日
                分割セグメント配列
            メソッド
                各セグメントの残業時間を分割セグメントへ代入する   
              セグメント毎の残業間を集計する
                分割セグメント配列をグラフに表示する

        月別残業時間更新オブジェクト
           プロパティ
                期間開始月
                期間終了月
                分割セグメント配列
            メソッド
                各セグメントの残業時間を分割セグメントへ代入する                  
         セグメント毎の残業間を集計する
                分割セグメント配列をグラフに表示する

        年別残業時間更新オブジェクト
           プロパティ
                期間開始年
                期間終了年
                分割セグメント配列
            メソッド
                各セグメントの残業時間を分割セグメントへ代入する                セグメント毎の残業間を集計する
                分割セグメント配列をグラフに表示する

これを抽象化してクラスにしてみたのが以下です。

クラス化(ver1)

   グラフフィルタークラス
            プロパティ
                フィルタースタートポイント
                フィルターエンドポイント
                分割セグメント配列
                分割単位
            メソッド
                各セグメントの業務時間を分割セグメントへ代入する                             
                分割セグメント配列の中の時間を業務区分毎に分ける
                各セグメントの残業時間を分割セグメントへ代入する                
                分割セグメント配列の中の内容をグラフに表示する

クラス化できましたが、業務時間と残業時間が同一クラスにあると
可読性が悪いかな?と思いもう一段抽象化しました。

クラス化(ver2)

    フィルタークラス
            プロパティ
                フィルタースタートポイント
                フィルターエンドポイント
                分割セグメント配列
                分割単位
            メソッド
                分割セグメント配列の中の内容をグラフに表示する

    業務時間フィルタークラスフィルタークラスを継承
            プロパティ
                
            メソッド
                各セグメントの業務時間を分割セグメントへ代入する
                分割セグメント配列の中の時間を業務区分毎に分ける

    残業時間フィルタークラスフィルタークラスを継承
            プロパティ
                
            メソッド
                各セグメントの残業時間を分割セグメントへ代入する

いかがでしょうか?
経験が浅くどれが正解なのかわからないため、有識者の方々のご意見を伺えたらと思います。

質問内容詳細

①ver1の段階のクラスでも問題ないか?問題ないとしたらなぜ問題ないのか?
②ver2の段階のクラス分けで問題ないか?問題があるとしたらどのような点か?
③他にどのようなクラス分けがあるか?またはクラス化において不足している部分

以上、恐れ入りますがご教授のほどよろしくお願いいたします。

0

2Answer

回答は難しいですね・・・
まず、何を実現したいのか示されていません。
可読性の前に期待する動作をしないといけないのですから、目的が分からなければ手段が正しいのかが判断できません。

それから前提となる知識が説明されていません。
業務時間、セグメント、分割セグメント、期間、残業、フィルター、etc..

実際の状況では期間もあるので設計の正しさだけを追求はできませんし、
システムが取り巻く状況は常に代わるので、絶対的に正しい設計というものはありません。
作りっては評価して改修する、を繰り返します。

ですので、まずは簡単に作ってみることをお勧めします。
実際に形にすれば何が問題になるのか分かりやすいですし、それを示した上で質問したほうが回答も得られやすいと思います。

あとクラス設計を表現するなら図示することをお勧めします。
テキストベースより伝わると思います。
イメージが沸かなければUMLのクラス図を参考にされるとよいでしょう。

2Like

Comments

  1. @aono1234

    Questioner

    ご回答ありがとうございます。全体像がみえないため適切かどうかの判断基準がないというのはその通りですね。ご助言ありがとうございました。1度作ってみたいと思います。

いきなり抽象化の正解を求めるのは難儀です。

基本的に、プログラミングの基本は「必要な時が来るまで作るな」です。抽象化についても同様で、(やろうと思えばどこまでも抽象化できるので)必要な時まで抽象化は避けた方がいいです。

質問者さんの質問をずっと見てますが、どうもクラス設計や抽象化ということに執着しすぎで、本来の目的である「要件通り仕事をするアプリを作る」というゴールからどんどん遠ざかっているように思えてしまいます。

まずは完全に納得できなくとも一度動くものを作り上げて、そこからどうリファクタリングすべきかを相談した方が生産的な気がしてます。

2Like

Comments

  1. @aono1234

    Questioner

    毎度勉強になります。確かにクラスという一部分に重きを置きすぎていたと思います。
    まずは本来の目的である「アプリ作成」を行いたいと思います。ありがとうございました。

Your answer might help someone💌