クラス設計初心者です。
クラス設計について質問させてください。
AObject,BObjectで共通で使用するようなメンバー変数が
必要になるケースの場合、
①下記のようにそれぞれで持たせてしまう?
②片方のクラスに持たせておいて、別のクラスからは参照でその
メンバー変数にアクセスする?
③別の手段がある
では、どの対応が一番適しているのでしょうか?
詳しい方ご意見を頂けないでしょうか?
よろしくお願いします。
ちなみに私の考えとしては、カプセル化の観点で考えて
自分のメンバー変数にしかアクセスしない①のが一番
適しているのではないかなあと思ってます。
class AObject
{
public:
private:
unsigned long size_; //この値はunit1_の値を用いて算出する
unsigned long unit1_; ★
};
class BObject
{
public:
private:
unsigned long size_ //この値は、unit1_,unit2_の値を用いて算出する
unsigned long unit1_; ★ //AObjectのメンバ変数と同じ
unsigned long unit2_;
};
クラス設計に関して
Re: クラス設計に関して
夢幻ノ月夜さん、返信ありがとうございます。
同じ変数を使ったクラスが増えるようであれば継承ということですね。なるほど。
ということは、クラスが増えないようであれば、委譲の方が良いということでしょうか?
また、夢幻ノ月夜さんが継承を検討する同じ変数を使ったクラスの数の基準など
ありましたら教えていただけないでしょうか?
同じ変数を使ったクラスが増えるようであれば継承ということですね。なるほど。
ということは、クラスが増えないようであれば、委譲の方が良いということでしょうか?
また、夢幻ノ月夜さんが継承を検討する同じ変数を使ったクラスの数の基準など
ありましたら教えていただけないでしょうか?
Re: クラス設計に関して
AObjectとBObjectの役割,関係等で変化するため,どれが一番適している,というものは存在しません。wild7 さんが書きました:AObject,BObjectで共通で使用するようなメンバー変数が
必要になるケースの場合、
①下記のようにそれぞれで持たせてしまう?
②片方のクラスに持たせておいて、別のクラスからは参照でその
メンバー変数にアクセスする?
③別の手段がある
では、どの対応が一番適しているのでしょうか?
具体的に、AObjectとBObjectはそれぞれどのような役割を持ったクラスで、それぞれの関係はどのようなものでしょうか。
また、「共通で使用する」とはどういう意味を持っていますか。
例えば、名前と型が同じだけで意味が違うのであれば、継承も何もなく独立して持つ、という解になりますが。
基本的に,実装が重なることを理由に継承を行うのは悪手です。夢幻ノ月夜 さんが書きました:もっと同じ変数を使ったクラスが増えるなら継承してはいかがですか?
Re: クラス設計に関して
YuOさん
>具体的に、AObjectとBObjectはそれぞれどのような役割を持ったクラスで、それぞれの関係はどのようなものでしょ>うか。
>また、「共通で使用する」とはどういう意味を持っていますか。
AObjectはメモリ領域を管理するクラスで、BObjectは書き込むデータ量、書き方等を管理するクラスとなります。
今回の共通して持たせようとしているunit1_変数はAObject,BObjectのそれぞれの最小単位となります。
例えば、メモリ領域のサイズが2MBとして、AObjectのメンバ変数unit1_の値が1024であれば、
メンバ変数size_の値は1024になるといった具合です。
>具体的に、AObjectとBObjectはそれぞれどのような役割を持ったクラスで、それぞれの関係はどのようなものでしょ>うか。
>また、「共通で使用する」とはどういう意味を持っていますか。
AObjectはメモリ領域を管理するクラスで、BObjectは書き込むデータ量、書き方等を管理するクラスとなります。
今回の共通して持たせようとしているunit1_変数はAObject,BObjectのそれぞれの最小単位となります。
例えば、メモリ領域のサイズが2MBとして、AObjectのメンバ変数unit1_の値が1024であれば、
メンバ変数size_の値は1024になるといった具合です。
Re: クラス設計に関して
この説明であれば,AObjectとBObjectの関係は,恐らくBObjectがABojectを「持っている」or「参照している」ですよね。wild7 さんが書きました:AObjectはメモリ領域を管理するクラスで、BObjectは書き込むデータ量、書き方等を管理するクラスとなります。
その上で,BObject::unit1_がAObject::unit1_やAObject::size_に依存するのであれば,BObject::unit1_はAObject::unit1_やAObject::size_を取得して計算する,ということになります。
オフトピック
通常はAObjectがsize()などのメンバ関数を用意する。
「何の」最小単位ですか。wild7 さんが書きました:今回の共通して持たせようとしているunit1_変数はAObject,BObjectのそれぞれの最小単位となります。
この説明だけでは,AObject::unit1_とBObject::unit1_が同じ役割なのか別の役割なのか,
そもそもBObject::unit1_はAObject::unit1_に依存するのかどうかもわかりません。
なお,BObjectにはunit1_,unit2_などという名前のメンバ変数があるようなので,もっと具体的な変数名に変更した方がよいでしょう。
e.g.) read_block_size_とwrite_block_size_など。
Re: クラス設計に関して
すみません、分かりづらい説明でしたね。説明ヘタで申し訳ありません。「何の」最小単位ですか。
この説明だけでは,AObject::unit1_とBObject::unit1_が同じ役割なのか別の役割なのか,
そもそもBObject::unit1_はAObject::unit1_に依存するのかどうかもわかりません。
一度アドバイス頂いた内容よりクラス図の変数名を具体的なものに直した上で再度説明させて頂きます。
これで理解してもらえるか自信が持てませんが・・・。
●修正後のクラス図
class LogicalMemory
{
public:
private:
unsigned long memory_block_size_; //この値はblock_unit_size_の値を用いて算出する
unsigned long block_unit_size_; ★
};
class AssignInfo
{
public:
private:
unsigned long assign_block_size_; //この値は、block_unit_size,special_block_sizeの値を用いて算出する
unsigned long block_unit_size_; ★ //LogicalMemoryのメンバ変数と同じ
unsigned long special_block_unit_size_; //ある特殊条件化のときはこの単位になるようassign_block_size_を最終的に調整する
};
●クラスの仕様
最小単位(block_unit_size_)は1048576バイト(1MB)
設定するサイズが最小単位の単位でない場合は桁上げされた値がblock_size_に設定されるものとする
確保したいメモリサイズ(memory_block_size_)は1,074,561,024(1GB+800KB)
アサインしたいサイズ(assign_block_size_)は1,900,000(1.9MB)
上記より、
●LogicalMemoryクラス
最小単位を1MBとしたため、桁上げしてmemory_block_size_に設定される値は1,074,790,400バイト(1GB+1MB)となる
・AssignInfoクラス
同様に最小単位が1MBなので、桁上げしてassign_block_size_に設定される値は2,097,152バイト(2MB)となる
Re: クラス設計に関して
とりあえず,これはクラスの仕様ではないと思いますが……。wild7 さんが書きました:●クラスの仕様
最小単位(block_unit_size_)は1048576バイト(1MB)
設定するサイズが最小単位の単位でない場合は桁上げされた値がblock_size_に設定されるものとする
確保したいメモリサイズ(memory_block_size_)は1,074,561,024(1GB+800KB)
アサインしたいサイズ(assign_block_size_)は1,900,000(1.9MB)
結局の所,LogicalMemoryクラスとAssignInfoクラスには,どのような関連があるのですが。
私は,LogicalMemoryクラスがメモリプールを実装し,
AssignInfoクラスはLogicalMemoryのプールからメモリをLogicalMemoryの仕様にあわせてとってくる,というものかと思いましたが,
そのような記述もないようですし。
クラス間の関連がないのであれば,似た目的の同じ数値であっても独立して値を持つ,というのが答えかと思います。
Re: クラス設計に関して
Yuoさん
AssignInfoオブジェクトを生成してデータの書き込み位置、サイズ等を持たせて、それを元に
LogicalMemoryを更新するようなイメージを持ってました。その際、AssignInfoでの
書き込むサイズ、LogicalMemoryのサイズをblock_unit_size単位としようとし、同じ役割
であったので片方だけ持たせて参照するべきなのか、両方に持たせてしまうべき
なのか判断がつかなかったため、質問させて頂いたというのが経緯です。
Yuoさんが考えていらしたところまでは、正直なところ考えが及んでいませんでした。
Yuoさんから頂いたアドバイスを元に一度考えなおしてみようと思います。
度重なるアドバイス感謝いたします。
AssignInfoオブジェクトを生成してデータの書き込み位置、サイズ等を持たせて、それを元に
LogicalMemoryを更新するようなイメージを持ってました。その際、AssignInfoでの
書き込むサイズ、LogicalMemoryのサイズをblock_unit_size単位としようとし、同じ役割
であったので片方だけ持たせて参照するべきなのか、両方に持たせてしまうべき
なのか判断がつかなかったため、質問させて頂いたというのが経緯です。
Yuoさんが考えていらしたところまでは、正直なところ考えが及んでいませんでした。
Yuoさんから頂いたアドバイスを元に一度考えなおしてみようと思います。
度重なるアドバイス感謝いたします。
Re: クラス設計に関して
block_size(最小単位)はLogicalMemoryのメンバとして、LogicalMemoryのAssignメソッドで
AssignInfoオブジェクトを生成することとしました。
(メモリプールは勉強不足で理解が甘いため使用せず。追々勉強していこうと思います)
使い方のイメージを図に描いてみました。
これにて解決とさせて頂きます。
度重なるアドバイスありがとうございました。
AssignInfoオブジェクトを生成することとしました。
(メモリプールは勉強不足で理解が甘いため使用せず。追々勉強していこうと思います)
使い方のイメージを図に描いてみました。
これにて解決とさせて頂きます。
度重なるアドバイスありがとうございました。