Задать вопрос
@modems

Как найти замыкания (закольцованность) в цепочке методов?

Добрый день!

Дано:

есть некий конфиг json (описательный шаблон):

[	
	{
		"name" : "method1", //выходные аргументы method1 являются входными аргументами method2
		"inArgs" : "[inArg1, inArg2, inArg3]",
		"returnArgs" : "[outArg1, outArg2, outArg3]"
	},
	{
		"name" : "method2",
		"inArgs" : "[inArg1, outArg2, outArg3]",
		"returnArgs" : "[outArg4, outArg5, outArg6]"
	},
	.....
	{
		"name" : "method30", //выходные аргументы method30 являются входными аргументами method40, коллизия
		"inArgs" : "[inArg4, outArg70, outArg80]",
		"returnArgs" : "[outArg40, outArg50, outArg60]"
	},
	....
	{
		"name" : "method40", //выходные аргументы method40 являются входными аргументами method30, коллизия
		"inArgs" : "[inArg5, outArg40, outArg50]",
		"returnArgs" : "[outArg40, outArg70, outArg80]"
	},
]


Далее этот json парсится и создается string c методами и подставленными значениями аргументов из конфига и контекста из:

...
[ctx.outArg1, ctx.outArg2, ctx.outArg3] = method1(ctx.inArg1, ctx.inArg2, ctx.inArg3);
[ctx.outArg4, ctx.outArg5, ctx.outArg6] = method2(ctx.inArg1, ctx.outArg2, ctx.outArg3);
...


Далее это все запускается в контексте объекта, в котором есть значения аргументов и заранее описаны все вышеуказанные методы и их логика.:

{
	inArg1: 1,
	inArg2: 2,
	inArg3: 3,
	outArg1: null,
	outArg2: null,
	outArg3: null
}


и значения в этом объекте обновляются.

Постарался полностью описать механику процесса.
Т.к. выходные аргументы одного метода могут являться входными аргументами другого метода (так же через цепочку методов неопределенной вложенности), необходимо вылавливать такие коллизии, желательно на этапе парсинга конфига.
Может кто-нибудь посоветовать оптимальное решение такой задачи, пока в голову приходят только графы.
  • Вопрос задан
  • 114 просмотров
Подписаться 1 Средний 2 комментария
Решение пользователя Сергей К ответам на вопрос (1)
begemot_sun
@begemot_sun
Программист в душе.
Это определенно графы. Непонятна мотивация искать циклы.
Например если вы боитесь что такая программа зациклиться - то нет, если вы будете использовать память для каждого результата.
Если вы использовать память не намерены, и будете вычислять значения аргументов по мере надобности, то тут никаким графом не помочь. Вам всегда будут нужны результаты аргументов, которые зависят от ... которые за висят от .. и т.д. до бесконечности.
Если вы хотите оптимизировать вычисления с помощью ленивости, то в любом случае нужна будет память.
Ответ написан