如何清理双重关联的多对多关系?

时间:2009-04-27 03:31:16

标签: c# many-to-many

首先,我不确定标题是否准确描述了我所指的内容,所以请随意留言,如果您有代表,请自行重新命名。

比方说,我有2个班,书和图书馆。库包含一个属性,该属性是它拥有的所有书籍的列表。 A Book有一个属性,它是它所属的所有库的列表。

On Book我有一个RemoveFromLibrary方法,它从库列表中删除一个库。我也希望用同样的方法来清理另一端,即它所拥有的图书馆的图书清单。另一端也是如此,Library上的RemoveBook方法也清除了Book的包含它的库列表。

首先,这有意义吗?我觉得调用代码不必担心清理而不必调用2个方法来执行一个逻辑操作似乎很方便。我的意思是从一个列表中删除而不是从另一个列表中删除是没有意义的。与此同时,可以说这使得它们的耦合太紧,但我认为如果它成为一个问题我只会重构去耦。

我不确定实现这个,如果我只调用普通的公共方法,那么我最终会调用另一个方法的每个方法的无限循环。我可以创建一个单独的内部属性(在C#中工作),但不会进行清理,但感觉就像我在使用一种只能从另一种方法调用的方法乱丢API。或者,我可以将底层集合暴露为内部,这稍微好一些,但它仍然看起来不太理想。有没有更好的解决方案,或者我只需要使用其中的一个,或者确保调用代码自己进行清理?

1 个答案:

答案 0 :(得分:1)

也许这会奏效。在调用其他类的remove方法之前,请检查它的对象列表(例如,书籍)是否仍包含要删除的对象。

BTW 这只是伪代码(可能无法编译)

class Book
{
    Library[] libraries;

    void RemoveFromLibrary(Library lib)
    {
        libraries.remove(lib);
        if (IsInLibrary(lib) && lib.HasBook(this)) // prevents call-loop
            lib.RemoveBook(this);
    }

    bool IsInLibrary(Library lib)
    {
        return libraries.Contain(lib);
    }
}


class Library
{
    Book[] books;

    void RemoveBook(Book bk)
    {
        books.remove(bk);
        if (HasBook(bk) && bk.IsInLibrary(this)) // prevents call-loop
            bk.RemoveLibrary(this);
    }

    bool HasBook(Book bk)
    {
        return books.Contain(bk);
    }
}

编辑:根据评论修复了代码......写作时我很困倦:P