2016-12-09 20 views
0

У меня проблема с дизайном кода. Я пытаюсь прочитать некоторые файлы и создать для каждого файла один или несколько экземпляров (зависит от содержимого). Но некоторые экземпляры зависят от других файлов в списке, так что каждый экземпляр должен знать верхний класс. Следующий пример должен пояснить, что я имею в виду:Зависимые экземпляры в одном списке

class SetOfAll(object) 
    def __init__(self): 
     self.matrjoschkas = [] 
    def add(self, matrjoschka): 
     self.matrjoschkas.append(matrjoschka) 
    def create_matrjoschkas(self): 
     for file in glob.glob('*.txt'): 
      self.add(Matrjoschka(file, self)) 

class Matrjoschka(object) 
    def __init__(self, file, container): 
     self._container = container 
     ... 
     if some condition: 
      self._container.add(Matrjoschka(..., self._container)) 

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

ответ

1

Ну, конечно, есть много способов сделать это, но из того, что я вижу, вам просто нужен способ явно указать зависимости между файлами. Затем вы можете попросить фабрику создать список файлов на основе источника файла и настроенных зависимостей.

Псевдо-код:

filesFactory = new FilesFactory({ 
    file1: ['file2', 'file3'] //file1 depends on file2 and file3 
}); 

filesSource = new GlobFilesSource('*.txt'); //FilesSource could be an abstraction and GlobFilesSource a concrete implementation 

allFiles = filesFactory.resolveAllFilesFrom(filesSource); // ['file1', 'file2', 'file3'] 

Если условия зависимостей являются более сложными, чем просто совпадение идентификаторов, то вы можете просто настроить предикаты. Вот пример псевдо-кода, используя предикат для достижения той же конфигурации зависимостей, как указано выше:

[ 
    { 
     predicate: function (currentFiles) { 
      return currentFiles.contains('file1'); 
     }, 

     files: ['file2', 'file3'] 
    } 
] 

Эта конструкция является гораздо более гибким, чем у вас, потому что не только Matrjoschka класс не должен знать о том, что это контейнер, но он также не должен знать о правилах зависимостей.

+0

Это было полезно. С этой идеей я мог бы разработать решение, которое будет работать для меня. Спасибо! – Christian