我正在尝试实现外观模式来访问两种不同的文件类型,但是我一直遇到循环依赖项。这很常见吗,如果可以的话,避免这种情况的标准方法是什么?
我在单独的模块中有两种文件类型(A和B),可以由立面在另一个单独的interface.py
模块中进行访问。 Facade模块需要从每个模块导入FileType类以返回对象,并且还实现方法determine_file_type(path)
和自定义错误类IncorrectFileType
。
我现在希望向FileTypeA添加一个add_data_from_another_file
方法。它需要做的第一件事是确定要从中添加数据的文件的类型,但是如果不创建循环依赖项,它就无法访问interface.determine_file_type
方法。由于相同的原因,我也无法从任一IncorrectFileType
模块中引发file_type_a,b
错误。
## Module: interface.py
from file_type_a import FileTypeA
from file_type_b import FileTypeB
def get_file(path):
if determine_type(path) == "typeA":
return FileTypeA(path)
elif determine_type(path) == "typeB":
return FileTypeB(path)
def determine_file_type(path):
...
return file_type
class IncorrectFileTypeError(ValueError):
pass
## Module: file_type_a.py
class FileTypeA():
def add_data_from_another_file(self, path):
file_type = determine_file_type(path) ### CAN'T IMPORT THIS
if file_type == "typeB":
raise IncorrectFileTypeError() ### CAN'T IMPORT THIS
## Module: file_type_b.py
class FileTypeB():
pass
一种解决方案可能是将determine_file_type
作为静态方法实现在AbstractFileType
类上,但是如果我需要在其中一个具体类中引发异常,这对我没有帮助。 (在我的真实示例中,这感觉也很混乱,但这可能是一个单独的问题!)
这感觉就像是Facade模式的经典用法,那么我在这里缺少的明显技巧是什么?