2016-12-09 10 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'] 

종속성 조건이 다음 방금 조건을 구성 할 수있는 간단한 ID 매칭보다 더 복잡합니다. 다음은 위와 같은 종속 구성을 달성하기 위해 술어를 사용하여 의사 코드 샘플입니다 :

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

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

뿐만 아니라 Matrjoschka 클래스가이 컨테이너에 대해 알 필요가 없기 때문에이 디자인이 훨씬 더 유연 당신보다하지만, 그것은 또한 의존성 규칙에 대해서 알 필요가 없다.

+0

도움이되었습니다. 이 아이디어로 나는 저를 위해 작동하는 해결책을 운동 할지도 모르다. 고맙습니다! – Christian