我在两个类之间的依赖关系方面遇到了麻烦。问题如下:
我有两个类,时间戳和异常。异常是抽象的,所有可能的异常都派生自这个抽象类。每个异常都有一个时间戳来告诉异常何时被抛出。所以例外需要包括(在我使用的语言中称为导入)时间戳类。但是使用时间戳可能会发生错误,从而引发异常。因此时间戳类必须导入异常类。
还有我的循环依赖。现在我的实际问题是(这就是它独立于语言的原因):在这种情况下,避免循环依赖的正确设计是什么?我无法解决这个问题,因为我想不出一个解决方案来让这些类像现在这样独立但没有循环依赖。
我在两个类之间的依赖关系方面遇到了麻烦。问题如下:
我有两个类,时间戳和异常。异常是抽象的,所有可能的异常都派生自这个抽象类。每个异常都有一个时间戳来告诉异常何时被抛出。所以例外需要包括(在我使用的语言中称为导入)时间戳类。但是使用时间戳可能会发生错误,从而引发异常。因此时间戳类必须导入异常类。
还有我的循环依赖。现在我的实际问题是(这就是它独立于语言的原因):在这种情况下,避免循环依赖的正确设计是什么?我无法解决这个问题,因为我想不出一个解决方案来让这些类像现在这样独立但没有循环依赖。
我会放弃整个“Exception-has-timestamp-property”的想法。异常应该表示异常行为,仅此而已。也许你想做一些日志记录?记录器跟踪时间戳并将它们与适当的异常配对更有意义。
问问自己异常的工作是什么。显然,异常的工作是被抛出。这取决于它何时被抛出?没有。异常是否关心这个?没有。有别的在乎吗?是的,异常记录器。但是,由于记录器是关心时间戳的人,记录器也应该获取这些时间戳,并用它们做一些事情。毕竟,这是它工作的一部分。而且,在适当的设计中,记录器不会将他的部分工作外包给异常。
解决了循环依赖。
好问题,特别是你想避免循环依赖而不是让它工作。但考虑到循环依赖通常不是坏习惯。在你的情况下,我可以合理地使用这两个类。
因此,许多语言允许您定义类原型。我猜你正在使用 python,虽然在 C++ 中这看起来是这样的。
class Timestamp;
您现在可以定义Exception
类并将Timestamp
对象用作成员。当然你不能使用它的方法,因为它们还没有定义。但是如果Timestamp
构造函数将它的实例初始化为当前时间,您可能不需要访问Exception
类中的成员。
class Exception
{
// ...
Timestamp timestamp;
};
稍后你定义整个Timestamp
类。
class Timestamp
{
Timestamp()
{
// initialize to current time
}
};
但请注意,以这种方式耦合两个类会使它们非常依赖。如果没有另一个,您就不能使用其中之一。
因此,您可能想放弃使用Timestamp
异常类来存储它们发生的时间的想法。我想在大多数操作系统上获取实际时间戳只需要你几行代码。因此,如果您不需要整个Timestamp
课程,我建议复制代码以获取当前时间。这可能是最实用的方法,例如,如果您想在日志文件中写入异常及其时间。