类之间的循环依赖关系

问题描述:

我遇到了两个类之间的依赖问题。 问题是:类之间的循环依赖关系

我有两个类,时间戳和异常。异常是抽象的,所有可能的异常都来自这个抽象类。每个异常都有一个时间戳来告诉什么时候抛出异常。因此,异常需要包括(我使用的语言称为导入)时间戳类。 但是,可能会出现使用时间戳错误的问题,以便引发异常。因此,时间戳类必须导入异常类。

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

我会放弃整个“Exception-has-timestamp-property”的想法。例外情况应该表明特殊的行为,没有别的。也许你想做一些日志记录?记录器记录时间戳并将其与适当的例外进行配对更有意义。

问问自己什么是异常的工作。显然,一个例外的工作就是抛出。这是否取决于何时抛出?不。例外情况是否关心这一点?不。还有别的事吗?是的,例外记录器。但是,由于记录器是关心时间戳的人,记录器也应该得到这些时间戳,并且与它们一起做。毕竟,这是它工作的一部分。而且,在适当的设计中,记录器不会将部分工作外包给例外。

解决了循环依赖。

+0

其实我不确定他是否在谈论这种例外。如果他是,你的回答肯定比我的更有价值。 – danijar 2013-04-04 16:16:15

+1

我认为他指的是异常 - 例外 - “但是,工作时间戳错误可能发生,所以引发异常。”也就是说,遇到异常行为(例如失败)时会引发异常。无论如何,这正是作者让我们理解的。 – 2013-04-04 16:18:06

+0

我觉得你的建议非常好。是的,我使用异常的方式只是...异常。它们被抛出并可能被捕获(或者可能不被捕获)。 所以实际上没有Exception Logger,但是如果有一个异常被捕获,就有一种方法来记录它。但要做到这一点,它将转换成一条消息,然后从调试管理器记录。 所以异常应该知道它何时被抛出。 或者你认为最好不要抛出异常,而是让异常管理器抛出异常,像工厂一样使用它? – M0rgenstern 2013-04-04 21:54:35

好问题,特别是你想避免循环依赖,而不是让它工作。但是考虑一下循环依赖并不是不好的做法。在你的情况下,我合理地利用两个班级。

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

class Timestamp; 

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

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

稍后,您将定义整个Timestamp类。

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

但请注意,将两个班这种方式使他们非常依赖。没有其他人就不能使用他们中的一个。

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