Расчет зависимостей плагина - PullRequest
7 голосов
/ 09 июня 2011

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

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

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

Что останется во временном списке, это плагины, которые либо не имеют их 'Re зависимости найдены, или имеют круговую зависимость.(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]

Ответы [ 2 ]

5 голосов
/ 09 июня 2011

Алгоритм, который вы описали, звучит так, как будто он будет работать, но с трудом обнаружит циклические зависимости.

То, что вы ищете, это Топологическая сортировка ваших зависимостей.Если вы создаете график своих зависимостей, где ребро от A до B означает, что A зависит от B, тогда вы можете выполнить Поиск в глубину , чтобы определить правильный порядок.Вы захотите сделать вариант обычной DFS , которая может обнаруживать циклы, чтобы вы могли напечатать ошибку в этом случае.

Если вы используете упорядоченный список в каждой вершине для хранения соединенийна графике вы можете добавлять зависимости, используя их порядковые номера.Преимущество использования DFS состоит в том, что результирующий отсортированный список должен соответствовать порядку вашей последовательности, если он не конфликтует с порядком зависимостей.(Я верю; мне нужно это проверить.)

2 голосов
/ 09 июня 2011

A топологическая сортировка расставит все по порядку.

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