クラス設計に関して

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
wild7life

クラス設計に関して

#1

投稿記事 by wild7life » 5年前

wild7lifeと申します。

早速なのですが、件名の通りの質問になります。
クラス設計初心者で以下のようなクラス設計はありなのか教えて頂きたいです。

Deviceクラスが持つdefaultsize変数をAreaクラスの処理でも使用するのですが、
その際、Areaクラスにもdefaultsize変数を持たせるべきなのか、引数で渡すべき
なのか、一般的な考えだとどうなのでしょうか?それともAreaクラスにdefaultsize
等各種変数を持たせておき、Deviceクラス側の処理ではareaクラス側から取得
してくるべきなのでしょうか。分かりづらくて申し訳ありませんが、アドバイスを
頂けると幸いです。
よろしくお願いします。

Deviceクラス
変数
  defaultSize
  area
  その他変数
 関数
  defaultSizeの値を使用する関数

Areaクラス
 変数
  size
 メソッド
  SetSize() ※DeviceクラスのdefaultSize変数とその他変数によりsizeの値を求めます

アバター
nullptr
記事: 239
登録日時: 8年前

Re: クラス設計に関して

#2

投稿記事 by nullptr » 5年前

defaultsize変数が何なのか不明瞭です。
defaultsize変数の値はどのように決まりますか。
defaultSizeは不変性を持っていますか。
DeviceがdefaultSizeを所持している必然性はありますか。
DeviceとAreaの関係性が不明瞭です。
 
 
✜ で C ご ✜
: す + 注 :
¦ か + 文 ¦
?
Is the は :
order C++? ✜
     糸冬   
  ――――――――
  制作・著作 NHK
 
 

wild7life

Re: クラス設計に関して

#3

投稿記事 by wild7life » 5年前

携帯から失礼します、wild7lifeです。

説明不足ですみません。
イメージとしては大きな領域(この1番大きな
単位をDeviceとしてます)があってその領域を
4分割まで出来るといったものになります。
分割単位も決まっていますが、分割しなくても
可のため、分割後のサイズ等を持たせるつもりの
AreaにdefaultSize、分割単位の変数を持たせる
のもどうかなぁと考えてます。defaultSize及び、
分割単位の値は外部からファイル読み込みで取得し、
この値が変更されることはありません。

アバター
nullptr
記事: 239
登録日時: 8年前

Re: クラス設計に関して

#4

投稿記事 by nullptr » 5年前

1) defaultSizeはなにの値なのですか?Deviceのサイズですか?Areaのサイズですか?分割単位のサイズですか?
2) Deviceはなにをするクラスですか?
3) Areaはなにをするクラスですか?
4) DeviceとAreaはどういう関係なんですか?
5) 分割単位とはなんですか?
それぞれの型の役割と関係性がわからないと答えようがありません。肝心のdefaultSizeが何なのかもわかりません。
SetSize() ※DeviceクラスのdefaultSize変数とその他変数によりsizeの値を求めます
sizeの値を求めるのに、setですか?書き間違いでなければ、変ですね。

defaultSizeを所持すべきなのは、defaultSizeを所持する必然性を持つクラスです。クラスTにおいて、「T has defaultSize」とした場合、不自然でないクラスです。
それを決めるには、defaultSizeが何の値なのかがわからないと判断できません。

繰り返しDeviceとAreaの関係を問うてるのは、それぞれのクラスの役割がわからないので、本当にDeviceがAreaを包含しているのが正しいのかどうか、から疑っているからです。
最初の投稿を見る限り、AreaをDeviceが包含しています。つまり、「Device has Area」です。これは正しいですか?私はそれぞれの役割を知らないので判断できないですから、これが正しいかご自身で判断して下さい。或いは、詳細にそれぞれの役割を説明して下さい。
 
 
✜ で C ご ✜
: す + 注 :
¦ か + 文 ¦
?
Is the は :
order C++? ✜
     糸冬   
  ――――――――
  制作・著作 NHK
 
 

アバター
へにっくす
記事: 628
登録日時: 7年前
住所: 東京都

Re: クラス設計に関して

#5

投稿記事 by へにっくす » 5年前

nullptrさんの補足になりますが・・・

たとえば以下の図のような感じで、
dixq_net_forum_3_t16142_image_1.png
dixq_net_forum_3_t16142_image_1.png (6.37 KiB) 閲覧数: 1645 回
2分割の場合Areaクラスを2つ持つ。またn分割する場合Areaクラスはn個もつ。ということであれば
Device has Area
と言えます。
defaultSizeをどう持つべきなのかは、DeviceクラスとAreaクラスのサイズがどう関連するかによります。
defaultSizeはプログラム起動時に表示するサイズのことなのであれば、
Device、Areaそれぞれ独立して持ってもいいでしょう。
そうではなくてAreaのdefaultSizeはDeviceのdefaultSizeから常に計算するということであれば
Deviceでのみ持てばよいことになります。

という感じです
あなたの考えるイメージはどうなのでしょう?
wild7life さんが書きました:defaultSize及び、
分割単位の値は外部からファイル読み込みで取得
ということは、Deviceクラスで読み込んで、Areaクラスに分割単位の値をセットすればいいので
Deviceクラスでのみ持てばいい感じがしますが・・・
ただしこれは一般的な考え方とは違うかもしれません。
そもそもプログラムに一般的な解なんてありません。
実装しやすいと思うのであればどんどん実装してください。
written by へにっくす

wild7life

Re: クラス設計に関して

#6

投稿記事 by wild7life » 5年前

nullptrさん、へにっくすさんアドバイス
ありがとうございます。質問に対しての
回答という形になりますが、もう少し
詳しくまとめさせていただきました。

Q1) defaultSizeはなにの値なのですか?
Deviceのサイズですか?Areaのサイズ
ですか?分割単位のサイズですか?
A1)defaultSizeは分割する前のArea1つの
サイズになります。

Q2) Deviceはなにをするクラスですか?
A2)複数のAreaが持てるデータを
保持するクラスになります。

Q3) Areaはなにをするクラスですか?
A3)使用者が指定したデータ(現在は
ファイル名、とサイズを持つFile)を
保持するクラスになります。

Q4) DeviceとAreaはどういう関係なんですか?
包括の関係になります。
A4)Device自体にサイズを持たせるのではなく
Areaに持たせようかと自分では考えてます。
よって領域を分割していないときはAreaを1つ
持つイメージです。

Q5) 分割単位とはなんですか?
A5)Deviceが持てるAreaの分割する際の
単位になります。100MBであれば120MBの
Areaは作れないが300MBであれば可能と
いった感じになります。

Q6)sizeの値を求めるのに、setですか?
書き間違いでなければ、変ですね。
A6)すみません、値を求めると書いて
いるのにSetはないですね。

アバター
nullptr
記事: 239
登録日時: 8年前

Re: クラス設計に関して

#7

投稿記事 by nullptr » 5年前

如何せん何のプログラムかはっきりしませんが、おそらくdefaultSizeというのは幅や高さを持つものではなく、データのサイズなのですね。
AreaやDeviceなどという名前から幾何学系かと思いました。
ここも憶測になります。もう少し「何がしたいプログラムなのか」はっきりしていただけるとこちらの想像の手間が省けます。
複数のAreaが持てるデータを
保持するクラスになります。
複数のエリアが持てるデータとはなんですか?
A1)defaultSizeは分割する前のArea1つの
サイズになります。
つまり、全体のサイズということですね。


部品をもう少し細かくして考えてみましょうか。
仮に、何分割されたかは気にせず、データのサイズを保持する だけ のSizeクラスを作ってみたとします。
DataはSizeを継承しており、更にそのサイズをもつデータのファイル名 だけ を保持しています。
ここでDataはあくまでもデータの最小単位を持っているだけに過ぎず、全体のサイズを知っているのは不自然です。
Dataにはサイズとファイル名だけ持たせておけばいいのです。
全体のサイズ(defaultSize)を保持していて、全体のサイズと分割単位から細かいデータを作成し、管理するクラスを、DataManagerとします。
Dataを構築する際に、DataManager側でサイズを計算して、渡してあげればよい話です。
今回は全体のサイズ(defaultSize)が変化しないとのことですから、構築の際に指定してあげれば良いだけの話かと思います。
仮に変化するとしても、全体のサイズが変化した時にDevice側から再計算した値を渡せばいいだけだと思います。

ここでのDataとAreaに違いはありますでしょうか。
DataManagerはDeviceに値しませんか。
Deviceクラスが持つdefaultsize変数をAreaクラスの処理でも使用するのですが、
先ほどの例えでは、Dataはdefaultsizeを必要としませんでしたが、Areaはどうしてもdefaultsizeが必要ですか?
 
 
✜ で C ご ✜
: す + 注 :
¦ か + 文 ¦
?
Is the は :
order C++? ✜
     糸冬   
  ――――――――
  制作・著作 NHK
 
 

wild7life

Re: クラス設計に関して

#8

投稿記事 by wild7life » 5年前

体調を崩してしまい、返信が遅れてしまいました。
申し訳ありませんでした。
ここでのDataとAreaに違いはありますでしょうか。
DataManagerはDeviceに値しませんか。
Dataが複数のデータを持っているとすれば違いはありません。
また、説明を読んだ感じでは、DataManagerはDeviceと考えて問題なさそうです。
nullptrさんのおっしゃる通り、Dataを構築する際にDataManager側でサイズ等を計算して、
渡してあげる方針で設計をしてみようと思います。

最後になりますが、数々の助言ありがとうございました。
大変勉強になりました。

閉鎖

“C言語何でも質問掲示板” へ戻る