Как избежать циклических зависимостей при использовании шаблона фасада между несколькими модулями - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь реализовать шаблон фасада для доступа к файлам двух разных типов, но продолжаю сталкиваться с круговыми зависимостями. Это распространено, и если да, то каков стандартный способ избежать этого?

У меня есть два типа файлов (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, так что это очевидный трюк? м здесь отсутствует?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...