Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 类之间的循环依赖关系_Design Patterns_Architecture_Language Agnostic - Fatal编程技术网

Design patterns 类之间的循环依赖关系

Design patterns 类之间的循环依赖关系,design-patterns,architecture,language-agnostic,Design Patterns,Architecture,Language Agnostic,我对两个类之间的依赖关系有问题。 问题如下: 我有两个类,时间戳和异常。异常是抽象的,所有可能的异常都派生自该抽象类。 每个异常都有一个时间戳来告诉何时抛出异常。因此,异常需要包括(在我使用的语言中称为import)timestamp类。 但是使用时间戳可能会发生错误,因此会引发异常。因此,timestamp类必须导入异常类 这就是我的循环依赖性。 现在我真正的问题是(这就是为什么它独立于语言):在这种情况下,为了避免循环依赖,正确的设计是什么?我无法解决这个问题,因为我无法找到一个解决方案,使

我对两个类之间的依赖关系有问题。 问题如下:

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

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

好问题,特别是您希望避免循环依赖关系,而不是让它工作。但是考虑到循环依赖不是一般的坏习惯。在你的情况下,我是合理的利用这两个类从对方

因此,许多语言允许您定义类原型。我猜你在使用Python,但是C++中看起来是这样的。
class Timestamp;
您现在可以定义
异常
类并使用
时间戳
对象作为成员。当然,您不能使用它的方法,因为它们还没有定义。但是如果
时间戳
构造函数将其实例初始化为当前时间,则可能不需要从
异常
类访问成员

class Exception
{
    // ...
    Timestamp timestamp;
};
class Timestamp
{
    Timestamp()
    {
        // initialize to current time
    }
};
稍后您将定义整个
时间戳

class Exception
{
    // ...
    Timestamp timestamp;
};
class Timestamp
{
    Timestamp()
    {
        // initialize to current time
    }
};
但请注意,以这种方式耦合两个类使它们非常依赖。如果没有另一个,则不能使用其中一个

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

我会放弃整个“异常具有时间戳属性”的想法。异常应该表示异常行为,而不是其他。也许你想做一些日志记录?对于记录器来说,跟踪时间戳并将它们与相应的异常配对更有意义

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


循环依赖解决了。

事实上,我不确定他是否在谈论这种异常。如果他是的话,你的答案肯定比我的更有价值。我想他指的是例外情况,比如。。。异常-“但是处理时间戳时可能会发生错误,因此会引发异常。”也就是说,当遇到异常行为(例如失败)时会引发异常。无论如何,这就是作者让我们理解的。我觉得你的建议很好。是的,我使用异常的方式只是。。。例外情况。他们被扔了出去,可能被抓住(也可能没有)。所以实际上没有异常记录器,但是如果捕获到异常,就有一种方法来记录它。但要做到这一点,它被转换成一条消息,然后从debugmanager记录下来。因此,异常应该知道它是何时抛出的。或者您认为不只是抛出异常,而是让异常管理器像工厂一样抛出异常会更好吗?为什么不传播异常直到它到达日志记录点?当到达所述点时获取时间戳值。异常传播所需的时间应该无关紧要,它太小了。在几乎任何框架(比如,.NET或Java)中,异常的行为都是这样的,日志记录很少成为问题。对我来说,任何比这更复杂的事情似乎都太过分了。如果在传播过程中添加了一些额外的(手动)延迟,那么调用延迟的对象也应该能够将延迟之前的时间标记为原始时间戳。在这种情况下,您可以让debugmanager侦听来自此类对象的事件。通过事件传递每个异常及其原始时间戳。最终,您也可以通过延迟。但不确定这是否是你的情况。