1

首先,我不确定标题是否准确地描述了我所指的内容,因此请随时就如何称呼它发表评论,或者如果您有代表,请自行重命名。

例如,假设我有 2 个课程,书籍和图书馆。图书馆包含一个属性,该属性是它拥有的所有书籍的列表。一本书有一个属性,它是它所属的所有库的列表。

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

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

就实现这一点而言,我不确定的是,如果我只是调用普通的公共方法,那么我最终会得到每个方法调用另一个方法的无限循环。我可以创建一个不清理的单独的内部属性(在 C# 中工作),但感觉就像我用一种只能从另一个方法调用的方法乱扔 API。或者,我可以将底层集合公开为内部集合,这会更好一些,但它似乎仍然不理想。有没有更好的解决方案,或者我只需要使用这两个中的一个,或者确保调用代码本身进行清理?

4

1 回答 1

1

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

顺便说一句,这只是伪代码(可能无法编译)

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

于 2009-04-27T03:48:37.757 回答