一个列表中的依赖实例

Dependent instances in one list

我的代码设计有问题。我尝试读取一些文件并为每个文件创建一个或多个实例(取决于内容)。但是有些实例依赖于列表中的其他文件,因此每个实例都必须知道顶部 class。以下示例应该可以说明我的意思:

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))

是否有一种优雅的方法可以避免每个实例都必须知道顶部 class?因为我的情况有点复杂,如果有工厂能做就好了。

嗯,当然有很多方法可以做到这一点,但据我所知,您只需要一种方法来明确声明文件之间的依赖关系。然后,您可以要求工厂根据文件的来源和配置的依赖项创建文件列表。

伪代码:

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 class 不需要知道它的容器,而且它也不需要知道依赖规则。