Я пытаюсь реализовать шаблон фасада для доступа к файлам двух разных типов, но продолжаю сталкиваться с круговыми зависимостями. Это распространено, и если да, то каков стандартный способ избежать этого?
У меня есть два типа файлов (A и B) в отдельных модулях, доступ к которым осуществляется фасадом в другом отдельном модуле interface.py
. Модуль фасада должен импортировать классы FileType из каждого модуля для возврата объектов, а также реализует метод determine_file_type(path)
и пользовательский класс ошибок IncorrectFileType
.
Теперь я sh добавлю метод add_data_from_another_file
в FileTypeA. Первое, что ему нужно сделать, это определить, к какому типу файла он добавляет данные, но он не может получить доступ к методу 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
, но это не помогает мне, если мне нужно вызвать исключение в одном из конкретных классов. (Мне также кажется, что в моём реальном примере это может быть грязно, но это, вероятно, отдельная проблема!)
Это похоже на классическое c использование шаблона Facade, так что это очевидный трюк? м здесь отсутствует?