2017-07-10 12 views
1

umlの構成をコードに変換することを理解しようとしています。 Dogにメモリがあるコードの3つの例について質問があります。これら3つの例は、組成(umlの意味での組成)と考えることができるか?翻訳umlの構成をコードに変換しよう[uml]

例1

class Memory { 
    // CODE 
} 

class Dog { 
    private Memory variable; 

    Dog(Memory variable) { 
     this.variable = variable; 
    } 
} 

class Factory { 
    Dog createDog() { 
     Memory memory = new Memory() // memory contains reference to object Memory only moment and after create dog don't use it 
     return new Dog(memory); 
    } 
} 

例2

class Memory { 
    // CODE 
} 

class Dog { 
    private Memory variable; 

    Dog(Memory variable) { 
     this.variable = variable; 
    } 
} 

class Factory { 
    Dog createDog() { 
     return new Dog(new Memory()); 
    } 
} 

例3

class Memory { 
    // CODE 
} 

class MemoryFactory { 
    Memory createMemory() { 
     return new Memory(); 
    } 
} 

class Dog { 
    private Memory variable; 

    Dog(MemoryFactory memoryFactory) { 
     this.variable = memoryFactory.createMemory(); 
    } 
} 

class Factory { 
    Dog createDog() { 
     MemoryFactory factory = new MemoryFactory() 
     return new Dog(factory); 
    } 
} 

少し異なる例:

class Memory { 
    // CODE 
} 

class Dog { 
    private Memory variable; 

    Dog() { 
     this.variable = new Memory(); 
     Other other = new Other(); 
     other.method(variable); 
    } 
} 

class Other { 
    void method(Memory memory) { 
     // code which don't save reference to memory 
    } 
} 

これは、組成物は?

+0

もう1つの関連性があることを除いて、最後の例との違いは基本的にありません。まず回答を理解してみてください。 –

答えて

2

はい。すべての例は、組成に関しては同じである:

class Dog { 
    private Memory variable; 
} 

enter image description here

と同等です

あなたは犬/メモリを作成する方法は、常に終了され、クラス間の接続に、ここでは関係ありませんそれは同じです。 (組成物の構造についてです。あなたはそれを作成する方法は、行動についてです。)


一時的にメモリのインスタンスを保存する例について:

これが最も可能性の高い一時変数なし例に、コンパイラによって最適化されますしかし、もっと興味深いのは、あなたが参照を保管していればどうなるでしょうか?その場合には犬のメモリ関係は最後の例について


(もWhat is the difference between association, aggregation and composition?参照)は、もはや(UML)複合集約することはないが、最高の状態で会合または共有集約のどちらかになります。それは限り、大丈夫ですThomasによって説明されたライフサイクル管理を維持します。

+0

あなたは間違っているポイントを追加したようです:-)私は私の答え(または補遺)をとにかく残しますが、これは上の投票です。 –

+0

私はあなたの答えを私が入力しているのを見ましたが、あなたはまだ詳細を説明しています。 –

0

私は基本的にピーターの答えに同意します。しかしながら、組成(または正式には複合集合と正確には、意味がほとんどない共有集約とは対照的に)は、オブジェクトの存続期間に関するものである。だからあなたは単純な関連性を持っていて、それが通常十分であることを示しています。あなたの望む言語のランタイム実装がどのように行われるかに応じて、Dogオブジェクトが死んだときにMemoryオブジェクトが死ぬでしょう。この事実は実装からは(直接的に)見ることはできません。例えば。いくつかの言語では、実行時にMemoryオブジェクトを別の場所に使用するかどうかを計算するオブジェクト参照があり、Dogはすでに死んでいます。

UMLダイアグラムにコンポジットアグリゲーションを表示すると、マスターオブジェクトが一旦消滅した場合、コンポジットに残っている参照がなく、メモリ管理がそれをビットグレーブに持ち込むように注意するようコーダに指示します。データベースの実装に関しては、設定が必要な外部キー制約です。 RDBMSは、マスタが削除されたときに集約を削除します(プログラマ/ DBAがコンポジット集計の右の制約を設定している場合:ON DELETE CASCADE)。

+0

DB開発者が分離不可能なコンポーネントの場合に対応するON DELETE CASCADEルールを定義している場合にのみ、「マスタが削除されたときにRDBMSが集約を削除する」という記述があります(https://stackoverflow.com参照)。/a/35214676/2795909) –

+0

@GerdWagnerあなたはおそらく正しいです(私はDBAではありません)。重点はこれまでの2つの文章です(ON DELETE CASCADEに必要なことを意味します)。 –