クラス設計に関して

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
wild7
記事: 6
登録日時: 4年前

クラス設計に関して

#1

投稿記事 by wild7 » 4年前

クラス設計初心者です。
クラス設計について質問させてください。

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_;
};

アバター
夢幻ノ月夜
記事: 140
登録日時: 5年前
住所: Stens;Gate世界線

Re: クラス設計に関して

#2

投稿記事 by 夢幻ノ月夜 » 4年前

もっと同じ変数を使ったクラスが増えるなら継承してはいかがですか?
毎回ゲーム作ろうとするたびに壁にぶち当たる

wild7
記事: 6
登録日時: 4年前

Re: クラス設計に関して

#3

投稿記事 by wild7 » 4年前

夢幻ノ月夜さん、返信ありがとうございます。

同じ変数を使ったクラスが増えるようであれば継承ということですね。なるほど。
ということは、クラスが増えないようであれば、委譲の方が良いということでしょうか?
また、夢幻ノ月夜さんが継承を検討する同じ変数を使ったクラスの数の基準など
ありましたら教えていただけないでしょうか?

YuO
記事: 941
登録日時: 9年前
住所: 東京都世田谷区

Re: クラス設計に関して

#4

投稿記事 by YuO » 4年前

wild7 さんが書きました:AObject,BObjectで共通で使用するようなメンバー変数が
必要になるケースの場合、

①下記のようにそれぞれで持たせてしまう?
②片方のクラスに持たせておいて、別のクラスからは参照でその
  メンバー変数にアクセスする?
③別の手段がある

では、どの対応が一番適しているのでしょうか?
AObjectとBObjectの役割,関係等で変化するため,どれが一番適している,というものは存在しません。
具体的に、AObjectとBObjectはそれぞれどのような役割を持ったクラスで、それぞれの関係はどのようなものでしょうか。
また、「共通で使用する」とはどういう意味を持っていますか。
例えば、名前と型が同じだけで意味が違うのであれば、継承も何もなく独立して持つ、という解になりますが。
夢幻ノ月夜 さんが書きました:もっと同じ変数を使ったクラスが増えるなら継承してはいかがですか?
基本的に,実装が重なることを理由に継承を行うのは悪手です。

wild7
記事: 6
登録日時: 4年前

Re: クラス設計に関して

#5

投稿記事 by wild7 » 4年前

YuOさん

>具体的に、AObjectとBObjectはそれぞれどのような役割を持ったクラスで、それぞれの関係はどのようなものでしょ>うか。
>また、「共通で使用する」とはどういう意味を持っていますか。

AObjectはメモリ領域を管理するクラスで、BObjectは書き込むデータ量、書き方等を管理するクラスとなります。
今回の共通して持たせようとしているunit1_変数はAObject,BObjectのそれぞれの最小単位となります。

例えば、メモリ領域のサイズが2MBとして、AObjectのメンバ変数unit1_の値が1024であれば、
メンバ変数size_の値は1024になるといった具合です。

YuO
記事: 941
登録日時: 9年前
住所: 東京都世田谷区

Re: クラス設計に関して

#6

投稿記事 by YuO » 4年前

wild7 さんが書きました:AObjectはメモリ領域を管理するクラスで、BObjectは書き込むデータ量、書き方等を管理するクラスとなります。
この説明であれば,AObjectとBObjectの関係は,恐らくBObjectがABojectを「持っている」or「参照している」ですよね。
その上で,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_など。

wild7
記事: 6
登録日時: 4年前

Re: クラス設計に関して

#7

投稿記事 by wild7 » 4年前

「何の」最小単位ですか。
この説明だけでは,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)となる

YuO
記事: 941
登録日時: 9年前
住所: 東京都世田谷区

Re: クラス設計に関して

#8

投稿記事 by YuO » 4年前

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の仕様にあわせてとってくる,というものかと思いましたが,
そのような記述もないようですし。

クラス間の関連がないのであれば,似た目的の同じ数値であっても独立して値を持つ,というのが答えかと思います。

wild7
記事: 6
登録日時: 4年前

Re: クラス設計に関して

#9

投稿記事 by wild7 » 4年前

Yuoさん

AssignInfoオブジェクトを生成してデータの書き込み位置、サイズ等を持たせて、それを元に
LogicalMemoryを更新するようなイメージを持ってました。その際、AssignInfoでの
書き込むサイズ、LogicalMemoryのサイズをblock_unit_size単位としようとし、同じ役割
であったので片方だけ持たせて参照するべきなのか、両方に持たせてしまうべき
なのか判断がつかなかったため、質問させて頂いたというのが経緯です。

Yuoさんが考えていらしたところまでは、正直なところ考えが及んでいませんでした。

Yuoさんから頂いたアドバイスを元に一度考えなおしてみようと思います。
度重なるアドバイス感謝いたします。

wild7
記事: 6
登録日時: 4年前

Re: クラス設計に関して

#10

投稿記事 by wild7 » 4年前

block_size(最小単位)はLogicalMemoryのメンバとして、LogicalMemoryのAssignメソッドで
AssignInfoオブジェクトを生成することとしました。
(メモリプールは勉強不足で理解が甘いため使用せず。追々勉強していこうと思います)

使い方のイメージを図に描いてみました。
画像

これにて解決とさせて頂きます。
度重なるアドバイスありがとうございました。

閉鎖

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