簡體   English   中英

類圖中的構圖關系可以有周期嗎?

[英]composition relationship in class diagram can have cycles?

我想為Java類圖實現模型檢查器。

我已經考慮了很多限制了一段時間。

希望任何人都能幫助我解決。

我這里所說的所有循環都是純循環,只有一種類型的關系。

問題1:假設A類由B類組成,並且A類和B類是不同的類,那么B類是否也可能由A類組成嗎? 此外,構圖關系是否可能具有周期?

問題2:關於類圖中的其他關系,例如聚合,依賴關系和關聯,該怎么辦? 這些關系中的循環是什么意思? 誰能舉一些例子?

感謝您閱讀我的問題,希望有人能幫助我。

問題1:假設A類由B類組成,並且A類和B類是不同的類,那么B類是否也可能由A類組成嗎? 此外,構圖關系是否可能具有周期?

嚴格說來是UML術語...是的,但是很難在代碼中實際實現。 如果你問自己:“如果沒有A,B可以獨自站立嗎?” 和“ A可以沒有B獨立嗎?” 如果您不能同時對這兩個答案都回答“否”,那么您可以使兩個類相互組成。 因為一個人必須能夠獨立站立,而另一個人才能由它組成,所以您不能同時擁有兩者。 但是,由於組合與聚合主要基於設計和上下文,因此並非完全不可能。 例如,您可以具有以下內容:

B包含對A的引用,而A包含對B的引用

public class A {
    B myB;
    String name = "A";

    public A(int num) {
        this.name += num;
    }

    public void setMyB(B b) {
        this.myB = b;
    }

    public B getMyB() {
        return this.myB;
    }

    public String getName() {
        return this.name;
    }
}

public class B {
    A myA;

    String name = "B";
    public B(int num) {
        this.name += num;
        myA = new A(num);
    }

    public A getMyA() {
        return this.myA;
    }

    public String getName() {
        return this.name;
    }
}

在此示例中,我們使用定義的String提供類的標識符,然后在其后附加一個數字,以顯示一些唯一的ID。 我們提供了允許我們訪問AB引用的方法,但是只有B通過構造函數(組成)創建對另一個的引用。

使用這個簡單的測試:

public class Test {
    public static void main(String[] args) {
        A myA = new A(1);
        B myB = new B(2);

        B anotherB = new B(3);

        myA.setMyB(anotherB);

        System.out.println("A = " + myA.getName());
        System.out.println("A's B = " + myA.getMyB().getName());

        System.out.println("B = " + myB.getName());
        System.out.println("B'a A = " + myB.getMyA().getName());
    }
}

我們可以看到以下輸出

A = A1
A's B = B3
B = B2
B'a A = A2

在這個例子中,在B基准A被的上下文之外創建A並通過在作為參數。 如果刪除myB ,則將丟失對其A的引用,但如果刪除myA ,則不會myA (我們仍然還有anotherB

假設我們從A消除了setMyB()方法,並將其移到構造函數中……我們將有一個無限循環的新對象,而您最終會遇到一個StackOverflowError

您可能會很有創造力,並嘗試實現Singleton模式或其他限制創建對象數量的構造,但這樣做將意味着構造函數將需要為私有/隱藏的,這將阻止其他類的擴展。 使用靜態字段來跟蹤創建的數量可能會避免該錯誤,但是隨后您將丟失所有引用,而又沒有一個地方來跟蹤所有引用,最后,您將永遠不會擁有“完美”的組合,因為一類將丟失其組成部分。

經過所有這些“分析”,您最終會得出一種有意義的設計,而不是嚴格符合UML圖上繪制的設計。 UML圖在那里傳達了類之間的“關系”。 您在此處詢問的“獨特”案例可能不會用UML建模解決A在哪里使用B和B在哪里使用A,但是可能需要其他一些設計工作。

問題2:關於類圖中的其他關系,例如聚合,依賴關系和關聯,該怎么辦? 這些關系中的循環是什么意思? 誰能舉一些例子?

關聯關系實際上用於描述由組成,聚合,多對多,一對一等定義的並且取決於上下文的關系類型。 每個關聯中循環的含義將取決於您的設計。

通常,依賴項中的循環意味着類依賴於自身。 這可能用於遞歸函數調用,Singleton設計模式實現或某些其他需要類引用自身的設計模式。

上面已經回答了聚合問題。 從根本上講,它意味着對象“使用”了所有正在聚合的對象。 一個示例是Company聚合People 當公司消失時,人們仍然存在。 這種關系的循環類似於我的示例中所示的循環,不同之處在於,您具有對AB類的外部引用,並將它們作為參數傳遞給對AB的前兩個引用。

最重要的是... UML是顯示類之間關系的工具。 設計和實現將隨之而來,而您擁有使用UML建模的“有趣”關系這一事實並不會幫助您克服嚴重的設計障礙。

希望這有助於闡明您的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM