类之间的循环依赖关系

时间:2013-04-04 14:16:09

标签: design-patterns architecture language-agnostic

我遇到两个类之间依赖关系的麻烦。 问题如下:

我有两个类,Timestamp和Exception。异常是抽象的,所有可能的异常都来自这个抽象类。 每个异常都有一个时间戳来告诉抛出异常的时间。所以异常需要包括(在我使用它的语言中称为import)时间戳类。 但是,如果使用时间戳错误,则会发生错误,从而抛出异常。因此,timestamp类必须导入异常类。

还有我的循环依赖。 现在我的实际问题是(这就是为什么它独立于语言):在这种情况下,为避免循环依赖,什么是正确的设计?我无法解决这个问题,因为我无法找到一个解决办法让这些类像现在一样独立但没有循环依赖。

2 个答案:

答案 0 :(得分:11)

我放弃了整个“Exception-has-timestamp-property”的想法。例外情况应该表明特殊行为,而不是其他。也许你想做一些伐木?记录器更有意义地跟踪时间戳并将它们与适当的例外配对。

问问自己异常的工作是什么。显然,一个例外的工作就是被抛出。这取决于何时被抛出?不。异常是否关心这一点?不。还有其他事情吗?是的,异常记录器。但是,由于记录器是关心时间戳的人,因此记录器也应该获取这些时间戳,并对它们进行处理。毕竟,这是其工作的一部分。而且,在适当的设计中,记录器不会将部分工作外包给例外。

解决了循环依赖。

答案 1 :(得分:1)

好问题,特别是你想要避免循环依赖,而不是让它工作。但是考虑到循环依赖性通常不是坏习惯。在你的情况下,我有理由相互使用这两个类。

因此,许多语言允许您定义类原型。我猜你使用的是python,虽然在C ++中看起来就是这样。

class Timestamp;

您现在可以定义Exception类并使用Timestamp对象作为成员。当然你不能使用它的方法,因为它们尚未定义。但是,如果Timestamp构造函数将其实例初始化为当前时间,则可能不需要访问Exception类中的成员。

class Exception
{
    // ...
    Timestamp timestamp;
};

稍后您将定义整个Timestamp类。

class Timestamp
{
    Timestamp()
    {
        // initialize to current time
    }
};

但请注意,以这种方式耦合两个类会使它们非常依赖。没有另一个,你不能使用其中一个。

所以你可能想放弃使用Timestamp类来处理异常只是为了存储它们发生的时间。我想在大多数操作系统上获取实际时间戳只需要几行。因此,如果您不需要整个Timestamp类,我建议复制代码以获取当前时间。这可能是最实用的方法,例如,如果您想在日志文件中编写异常及其时间。