モデルからコードへの変換の作法

設計で作成されたモデルが実際のC++コードではどのような実装になるのかのメモ書き。


多重度「1」

多重度「1」の関連の場合、ClassAが存在する限り、ClassBが常に存在することを意味します。





UML1
Class A{
private:
    ClassB* roleB; 

public:
    ClassA(ClassB* relatedB){
        setRoleB(relatedB);
    }

    void setRoleB(ClassB* relatedB){
        this.roleB = relatedB;
    }
};

多重度「0..1」

多重度「0..1」の場合、ClassAのインスタンスが生成されたときに、必ずClassBのインスタンスポインタを持っている保障はないと考えるのが一般的。





UML1
Class A{
private:
    ClassB* roleB;

public:
    ClassA(){}

    void setRoleB(ClassB* relatedB){
        roleB = relatedB;
    }
};

多重度「*」

多重度「*」は、0個以上の複数のClassBオブジェクトが存在するということになります。





UML1
Class A{
private:
    std::vector<ClassB*> vRoleB;

public:
    ClassA(){}

    void setRoleB(ClassB* relatedB){
        vRoleB.push_back(relatedB);
    }
};

多重度「0..n」

多重度「0..n」は、関連を表す属性に複数のオブジェクトを登録可能ですが、登録数に上限があるように実装しなければならない。





UML1
Class A{
private:
    ClassB* vRoleB[n];

public:
    ClassA(){}

    void setRoleB(int index, ClassB* relatedB){
        vRoleB[index]=relatedB;
    }
};

集約

集約関係の場合は、明示的に「連鎖的削除の概念」が無いことを示すことができます。





UML1
Class A{
private:
    ClassB* roleB;

public:
    ClassA(ClassB* relatedB){
        setRoleB(relatedB);
    }

    void setRoleB(ClassB* relatedB){
        roleB = relatedB;
    }
};

コンポジション

コンポジションは、より強い集約の一種です。ClassBインスタンスはClassBインスタンスと共に生存し、消滅すると考えられます。





UML1
Class A{
private:
    ClassB* roleB;
    
public:
    ClassA(){
        *roleB = new ClassB();
    }

    ~ClassA(){
        delete roleB;
    }

    void operation(){
        ..........
        roleB.operation();
        ..........
    }
};

依存

依存関係は、パラメータ参照やオブジェクト生成といった一時的な関係を表します。





UML1
Class A{
private:
    
public:
    ClassA(){}

    ~ClassA(){}

    void operation(){
        ClassB classB;
        classB.operation();
    }
};

Valid XHTML 1.1! Valid CSS! 初版更新日 2006/02/13   最新更新日 2006/02/24