Расчет зависимостей плагинов

Мне нужно создать систему плагинов, которая будет поддерживать зависимости, и я не уверен, что лучший способ учесть зависимости. Все плагины будут производными от базового класса, каждый со своим собственным execute () метод. В каждом классе плагина я планировал создать атрибут dependencies в виде списка всех других плагинов, от которых он зависит.

При загрузке плагинов я бы импортировал их все и вставил в список и отсортируйте их по зависимостям. Как только они все будут в правильном порядке (чтобы все, что связано с зависимостями, было в списке после указанных зависимостей), я бы перебирал список, выполняя каждый метод execute () метод.

Где I ' m продолжает становиться нечетким - это логика сортировки. Я могу просто начать размещать их в алфавитном порядке, пока не найду тот, у которого есть зависимость - если его зависимостей еще нет в списке, поместите его в список tmp. в конце первого раунда импорта начните с конца временного списка (список, в котором нет ничего, кроме плагинов, которые имеют зависимости) и снова проверьте «список выполнения». Если я нахожу его зависимости в «списке запусков», убедитесь, что у него более высокий индексный номер, чем его самая высокая зависимость. Если его зависимостей нет в списке, задержите его и перейдите к следующему плагину в временном списке. Как только я доберусь до конца списка tmp, начните с начала и попробуйте снова. После того, как все плагины отсортированы, или список tmp не изменит размер после цикла по нему - начните выполнение плагинов.

В временном списке останутся плагины, для которых либо не обнаружены зависимости , или иметь циклическую зависимость. (2 плагина в списке tmp, которые зависят друг от друга)

Если вы все еще читаете И вы можете следовать моей логике; это разумный план? Есть способ попроще? Если бы я хотел реализовать порядковые номера для порядка выполнения, есть ли «простой» способ иметь как последовательность, так и зависимости? (с зависимостями, превосходящими последовательность, если возник конфликт) Или плагин должен использовать последовательность ИЛИ зависимости? (Сначала запускайте плагины с порядковыми номерами, а не с зависимостями?)

TL; DR

Как бы вы написали логику для вычисления зависимостей в системе плагинов?


Редактировать:

Хорошо - я думаю, я реализовал топологическую сортировку со страницы википедии; следуя его логическому примеру для DFS. Кажется, это работает, но я никогда раньше не делал ничего подобного.

http://en.wikipedia.org/wiki/Topological_sorting#Examples

data = {
    '10' :  ['11', '3'],
    '3'  :  [],
    '5'  :  [],
    '7'  :  [],
    '11' :  ['7', '5'],
    '9'  :  ['8', '11'],
    '2'  :  ['11'],
    '8'  :  ['7', '3']
}

L = []
visited = []

def nodeps(data):
    S = []
    for each in data.keys():
        if not len(data[each]):
            S.append(each)
    return S

def dependson(node):
    r = []
    for each in data.keys():
        for n in data[each]:
            if n == node:
                r.append(each)
    return r

def visit(node):
    if not node in visited:
        visited.append(node)
        for m in dependson(node):
            visit(m)
        L.append(node)

for node in nodeps(data):
    visit(node)

print L[::-1]

7
задан tMC 9 June 2011 в 05:59
поделиться