- yuzuhiko
- 会議室デビュー日: 2006/09/10
- 投稿数: 1
|
投稿日時: 2006-09-10 03:37
お世話になります。中田と申します。
現在、業務でC++による開発を担当し始めたのですが
この業界に入って間もないため、シーケンス図やC++
などでおじけづいています。
今、下記のようなシーケンス図(?)を元にコーディングを
しようとしています。
コード: |
|
|~~~~~~~| |~~~~~~~|
|class a| |class b|
~~~|~~~ ~~~|~~~
| method |
| ------------>|
| |
| |
上の図では class a から class b のメソッド "method"を
呼ぶという意味だと思いますが、上では実際のコーディング
的には以下のようでいいのでしょうか?
class class_b{
public:
void method()
{
cout << "class_b's method is called.." << endl;
};
};
class class_a{
public:
// クラス class_b のインスタンスを返すメンバ関数
class_b getinstance(){
class_b b_instance;
return b_instance;
}
};
int main(){
class_a a;
a.getinstance().method();
return 0;
}
|
※ class_b のインスタンスはグローバルに持つ
のはコーディング的によくないと教わりました。
class_aクラスでclass_bクラスのインスタンス
をゲットするメソッドを定義し、そのメソッド経由
でcalss_bのメソッド "method" を呼びます。
稚拙な質問であり、質問する内容的にも不十分な
点が多数あるとは思いますが、よろしくお願いいたします。
[ メッセージ編集済み 編集者: yuzuhiko 編集日時 2006-09-10 03:39 ]
|
- 囚人
- ぬし
- 会議室デビュー日: 2005/08/13
- 投稿数: 1019
|
投稿日時: 2006-09-10 04:30
class a が class b の method を呼んでいるのだから、
コード: |
|
class class_a{
public:
void hoge(){
bins.method();
}
};
|
じゃないでしょうか。(bins は class b のインスタンス。どこに持つかは状況次第)
個人的には、シーケンス図が先にありきの実装はあまり好かないですね。
既に存在する実装を説明するときに使うぐらいです。
_________________ 囚人のジレンマな日々
|
- ピカード
- 常連さん
- 会議室デビュー日: 2006/09/01
- 投稿数: 37
- お住まい・勤務地: 関西
|
投稿日時: 2006-09-10 07:37
オブジェクトのライフサイクルや、メッセージの同期/非同期などの条件で実装方法が変わると思いますが、これらを考えていますか?
|
- 暁
- 大ベテラン
- 会議室デビュー日: 2006/06/28
- 投稿数: 116
|
投稿日時: 2006-09-10 10:31
シーケンス図を記述した方に確認できるなら、記述の意図を確認した方が良くないでしょうか?
メッセージがmethodでは何をしたいのか解らないです。
あとコーディングですが、
「getinstance」というメソッド名は混乱を招くためよくないです。
「getinstance」、「instance」などは大概自身のインスタンスを返すためのメソッド名として使用されます。
ここはgetBInstanceなどにしておいた方が良いです。
|
- Tdnr_Sym
- ぬし
- 会議室デビュー日: 2005/09/13
- 投稿数: 464
- お住まい・勤務地: 明石・神戸
|
投稿日時: 2006-09-10 15:28
こんにちは。
UMLのシーケンス図ですね!?
文字だけでUMLを記述するのは限度がありますので
間違っていたらごめんなさい。
コード: |
|
|~~~~~~~~~| |~~~~~~~~~|
|a:class_a| |b:class_b|
~~~|~~~~~ ~~~|~~~~~
| method |
| -------------->|
| |
| |
|
シーケンス図だけでは「関連(Association)」などの情報がわからないのですが、
「多重度0..1の単方向関連」だと仮定し
methodが「同期メッセージ」とした場合、
シナリオ1のシーケンス図のコードはこんな感じだと思います。
コード: |
|
#include <iostream>
using namespace std;
class class_b{
public:
void method()
{
cout << "class_b's method is called.." << endl;
};
};
class class_a {
class_b* _b;
public:
class_a() : _b(0) {}
class_a(class_b* b) : _b(b) {}
void set_b(class_b* b) { _b = b; }
void scenario1() {
_b->method();
}
};
int main()
{
// class_aとclass_bとの「関連(Association)」定義
class_a* a = new class_a();
class_b* b = new class_b();
a->set_b(b);
// シーケンス図のシナリオ1
a->scenario1();
// 後始末
delete a;
delete b;
}
|
|