wild7lifeと申します。
早速なのですが、件名の通りの質問になります。
クラス設計初心者で以下のようなクラス設計はありなのか教えて頂きたいです。
Deviceクラスが持つdefaultsize変数をAreaクラスの処理でも使用するのですが、
その際、Areaクラスにもdefaultsize変数を持たせるべきなのか、引数で渡すべき
なのか、一般的な考えだとどうなのでしょうか?それともAreaクラスにdefaultsize
等各種変数を持たせておき、Deviceクラス側の処理ではareaクラス側から取得
してくるべきなのでしょうか。分かりづらくて申し訳ありませんが、アドバイスを
頂けると幸いです。
よろしくお願いします。
Deviceクラス
変数
defaultSize
area
その他変数
関数
defaultSizeの値を使用する関数
Areaクラス
変数
size
メソッド
SetSize() ※DeviceクラスのdefaultSize変数とその他変数によりsizeの値を求めます
クラス設計に関して
Re: クラス設計に関して
defaultsize変数が何なのか不明瞭です。
defaultsize変数の値はどのように決まりますか。
defaultSizeは不変性を持っていますか。
DeviceがdefaultSizeを所持している必然性はありますか。
DeviceとAreaの関係性が不明瞭です。
defaultsize変数の値はどのように決まりますか。
defaultSizeは不変性を持っていますか。
DeviceがdefaultSizeを所持している必然性はありますか。
DeviceとAreaの関係性が不明瞭です。
✜ で C ご ✜
: す + 注 :
¦ か + 文 ¦
: ? Is the は :
✜ order C++? ✜
: す + 注 :
¦ か + 文 ¦
: ? Is the は :
✜ order C++? ✜
糸冬
――――――――
制作・著作 NHK
――――――――
制作・著作 NHK
Re: クラス設計に関して
携帯から失礼します、wild7lifeです。
説明不足ですみません。
イメージとしては大きな領域(この1番大きな
単位をDeviceとしてます)があってその領域を
4分割まで出来るといったものになります。
分割単位も決まっていますが、分割しなくても
可のため、分割後のサイズ等を持たせるつもりの
AreaにdefaultSize、分割単位の変数を持たせる
のもどうかなぁと考えてます。defaultSize及び、
分割単位の値は外部からファイル読み込みで取得し、
この値が変更されることはありません。
説明不足ですみません。
イメージとしては大きな領域(この1番大きな
単位をDeviceとしてます)があってその領域を
4分割まで出来るといったものになります。
分割単位も決まっていますが、分割しなくても
可のため、分割後のサイズ等を持たせるつもりの
AreaにdefaultSize、分割単位の変数を持たせる
のもどうかなぁと考えてます。defaultSize及び、
分割単位の値は外部からファイル読み込みで取得し、
この値が変更されることはありません。
Re: クラス設計に関して
1) defaultSizeはなにの値なのですか?Deviceのサイズですか?Areaのサイズですか?分割単位のサイズですか?
2) Deviceはなにをするクラスですか?
3) Areaはなにをするクラスですか?
4) DeviceとAreaはどういう関係なんですか?
5) 分割単位とはなんですか?
それぞれの型の役割と関係性がわからないと答えようがありません。肝心のdefaultSizeが何なのかもわかりません。
defaultSizeを所持すべきなのは、defaultSizeを所持する必然性を持つクラスです。クラスTにおいて、「T has defaultSize」とした場合、不自然でないクラスです。
それを決めるには、defaultSizeが何の値なのかがわからないと判断できません。
繰り返しDeviceとAreaの関係を問うてるのは、それぞれのクラスの役割がわからないので、本当にDeviceがAreaを包含しているのが正しいのかどうか、から疑っているからです。
最初の投稿を見る限り、AreaをDeviceが包含しています。つまり、「Device has Area」です。これは正しいですか?私はそれぞれの役割を知らないので判断できないですから、これが正しいかご自身で判断して下さい。或いは、詳細にそれぞれの役割を説明して下さい。
2) Deviceはなにをするクラスですか?
3) Areaはなにをするクラスですか?
4) DeviceとAreaはどういう関係なんですか?
5) 分割単位とはなんですか?
それぞれの型の役割と関係性がわからないと答えようがありません。肝心のdefaultSizeが何なのかもわかりません。
sizeの値を求めるのに、setですか?書き間違いでなければ、変ですね。SetSize() ※DeviceクラスのdefaultSize変数とその他変数によりsizeの値を求めます
defaultSizeを所持すべきなのは、defaultSizeを所持する必然性を持つクラスです。クラスTにおいて、「T has defaultSize」とした場合、不自然でないクラスです。
それを決めるには、defaultSizeが何の値なのかがわからないと判断できません。
繰り返しDeviceとAreaの関係を問うてるのは、それぞれのクラスの役割がわからないので、本当にDeviceがAreaを包含しているのが正しいのかどうか、から疑っているからです。
最初の投稿を見る限り、AreaをDeviceが包含しています。つまり、「Device has Area」です。これは正しいですか?私はそれぞれの役割を知らないので判断できないですから、これが正しいかご自身で判断して下さい。或いは、詳細にそれぞれの役割を説明して下さい。
✜ で C ご ✜
: す + 注 :
¦ か + 文 ¦
: ? Is the は :
✜ order C++? ✜
: す + 注 :
¦ か + 文 ¦
: ? Is the は :
✜ order C++? ✜
糸冬
――――――――
制作・著作 NHK
――――――――
制作・著作 NHK
Re: クラス設計に関して
nullptrさんの補足になりますが・・・
たとえば以下の図のような感じで、 2分割の場合Areaクラスを2つ持つ。またn分割する場合Areaクラスはn個もつ。ということであれば
Device has Area
と言えます。
defaultSizeをどう持つべきなのかは、DeviceクラスとAreaクラスのサイズがどう関連するかによります。
defaultSizeはプログラム起動時に表示するサイズのことなのであれば、
Device、Areaそれぞれ独立して持ってもいいでしょう。
そうではなくてAreaのdefaultSizeはDeviceのdefaultSizeから常に計算するということであれば
Deviceでのみ持てばよいことになります。
という感じです
あなたの考えるイメージはどうなのでしょう?
Deviceクラスでのみ持てばいい感じがしますが・・・
ただしこれは一般的な考え方とは違うかもしれません。
そもそもプログラムに一般的な解なんてありません。
実装しやすいと思うのであればどんどん実装してください。
たとえば以下の図のような感じで、 2分割の場合Areaクラスを2つ持つ。またn分割する場合Areaクラスはn個もつ。ということであれば
Device has Area
と言えます。
defaultSizeをどう持つべきなのかは、DeviceクラスとAreaクラスのサイズがどう関連するかによります。
defaultSizeはプログラム起動時に表示するサイズのことなのであれば、
Device、Areaそれぞれ独立して持ってもいいでしょう。
そうではなくてAreaのdefaultSizeはDeviceのdefaultSizeから常に計算するということであれば
Deviceでのみ持てばよいことになります。
という感じです
あなたの考えるイメージはどうなのでしょう?
ということは、Deviceクラスで読み込んで、Areaクラスに分割単位の値をセットすればいいのでwild7life さんが書きました:defaultSize及び、
分割単位の値は外部からファイル読み込みで取得
Deviceクラスでのみ持てばいい感じがしますが・・・
ただしこれは一般的な考え方とは違うかもしれません。
そもそもプログラムに一般的な解なんてありません。
実装しやすいと思うのであればどんどん実装してください。
written by へにっくす
Re: クラス設計に関して
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はないですね。
ありがとうございます。質問に対しての
回答という形になりますが、もう少し
詳しくまとめさせていただきました。
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はないですね。
Re: クラス設計に関して
如何せん何のプログラムかはっきりしませんが、おそらくdefaultSizeというのは幅や高さを持つものではなく、データのサイズなのですね。
AreaやDeviceなどという名前から幾何学系かと思いました。
ここも憶測になります。もう少し「何がしたいプログラムなのか」はっきりしていただけるとこちらの想像の手間が省けます。
部品をもう少し細かくして考えてみましょうか。
仮に、何分割されたかは気にせず、データのサイズを保持する だけ のSizeクラスを作ってみたとします。
DataはSizeを継承しており、更にそのサイズをもつデータのファイル名 だけ を保持しています。
ここでDataはあくまでもデータの最小単位を持っているだけに過ぎず、全体のサイズを知っているのは不自然です。
Dataにはサイズとファイル名だけ持たせておけばいいのです。
全体のサイズ(defaultSize)を保持していて、全体のサイズと分割単位から細かいデータを作成し、管理するクラスを、DataManagerとします。
Dataを構築する際に、DataManager側でサイズを計算して、渡してあげればよい話です。
今回は全体のサイズ(defaultSize)が変化しないとのことですから、構築の際に指定してあげれば良いだけの話かと思います。
仮に変化するとしても、全体のサイズが変化した時にDevice側から再計算した値を渡せばいいだけだと思います。
ここでのDataとAreaに違いはありますでしょうか。
DataManagerはDeviceに値しませんか。
AreaやDeviceなどという名前から幾何学系かと思いました。
ここも憶測になります。もう少し「何がしたいプログラムなのか」はっきりしていただけるとこちらの想像の手間が省けます。
複数のエリアが持てるデータとはなんですか?複数のAreaが持てるデータを
保持するクラスになります。
つまり、全体のサイズということですね。A1)defaultSizeは分割する前のArea1つの
サイズになります。
部品をもう少し細かくして考えてみましょうか。
仮に、何分割されたかは気にせず、データのサイズを保持する だけ のSizeクラスを作ってみたとします。
DataはSizeを継承しており、更にそのサイズをもつデータのファイル名 だけ を保持しています。
ここでDataはあくまでもデータの最小単位を持っているだけに過ぎず、全体のサイズを知っているのは不自然です。
Dataにはサイズとファイル名だけ持たせておけばいいのです。
全体のサイズ(defaultSize)を保持していて、全体のサイズと分割単位から細かいデータを作成し、管理するクラスを、DataManagerとします。
Dataを構築する際に、DataManager側でサイズを計算して、渡してあげればよい話です。
今回は全体のサイズ(defaultSize)が変化しないとのことですから、構築の際に指定してあげれば良いだけの話かと思います。
仮に変化するとしても、全体のサイズが変化した時にDevice側から再計算した値を渡せばいいだけだと思います。
ここでのDataとAreaに違いはありますでしょうか。
DataManagerはDeviceに値しませんか。
先ほどの例えでは、Dataはdefaultsizeを必要としませんでしたが、Areaはどうしてもdefaultsizeが必要ですか?Deviceクラスが持つdefaultsize変数をAreaクラスの処理でも使用するのですが、
✜ で C ご ✜
: す + 注 :
¦ か + 文 ¦
: ? Is the は :
✜ order C++? ✜
: す + 注 :
¦ か + 文 ¦
: ? Is the は :
✜ order C++? ✜
糸冬
――――――――
制作・著作 NHK
――――――――
制作・著作 NHK
Re: クラス設計に関して
体調を崩してしまい、返信が遅れてしまいました。
申し訳ありませんでした。
また、説明を読んだ感じでは、DataManagerはDeviceと考えて問題なさそうです。
nullptrさんのおっしゃる通り、Dataを構築する際にDataManager側でサイズ等を計算して、
渡してあげる方針で設計をしてみようと思います。
最後になりますが、数々の助言ありがとうございました。
大変勉強になりました。
申し訳ありませんでした。
Dataが複数のデータを持っているとすれば違いはありません。ここでのDataとAreaに違いはありますでしょうか。
DataManagerはDeviceに値しませんか。
また、説明を読んだ感じでは、DataManagerはDeviceと考えて問題なさそうです。
nullptrさんのおっしゃる通り、Dataを構築する際にDataManager側でサイズ等を計算して、
渡してあげる方針で設計をしてみようと思います。
最後になりますが、数々の助言ありがとうございました。
大変勉強になりました。