在多个模块之间使用外观模式时如何避免循环依赖

时间:2020-04-01 16:36:55

标签: python design-patterns

我正在尝试实现外观模式来访问两种不同的文件类型,但是我一直遇到循环依赖项。这很常见吗,如果可以的话,避免这种情况的标准方法是什么?

我在单独的模块中有两种文件类型(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模式的经典用法,那么我在这里缺少的明显技巧是什么?

0 个答案:

没有答案