Я люблю Lua. I love Lua.

Избавление от циклических зависимостей модулей

Posted in Uncategorized by ilovelua on Март 14, 2014

Итак, у вас есть два модуля, каждый из которых использует другой.

ModuleA.lua:

local ModuleB	= require('ModuleB')

return {
	fun1 = function() print('~~~ModuleA fun1') end,
	fun2 = function() print('~~~ModuleA calls ModuleB.fun1()', ModuleB().fun1()) end,
}

ModuleB.lua:

local ModuleA	= require('ModuleA')

return {
	fun1 = function() print('~~~ModuleB fun1') end,
	fun2 = function() print('~~~ModuleB calls ModuleA.fun1()', ModuleA().fun1()) end,
}

В главной программе вы наивно пытаетесь их включить:

local ModuleA = require('ModuleA')
local ModuleB = require('ModuleB')

и получаете ошибку:

can't load module_test.lua: [string "ModuleB.lua"]:1: loop or previous error loading module 'ModuleA'

Как быть? Шаблон Медиатор приходит на помощь!

ModuleMediator.lua:

return {
	getModuleA = function() return require('ModuleA') end,
	getModuleB = function() return require('ModuleB') end,
}

Исправляем файлы модулей.
ModuleA.lua:

local ModuleMediator	= require('ModuleMediator')

return {
	fun1 = function() print('~~~ModuleA fun1') end,
	fun2 = function() print('~~~ModuleA calls ModuleB.fun1()', ModuleMediator.getModuleB().fun1()) end,
}

ModuleB.lua:

local ModuleMediator	= require('ModuleMediator')

return {
	fun1 = function() print('~~~ModuleB fun1') end,
	fun2 = function() print('~~~ModuleB calls ModuleA.fun1()', ModuleMediator.getModuleA().fun1()) end,
}

В главной программе все осталось по старому:

local ModuleA = require('ModuleA')
local ModuleB = require('ModuleB')

ModuleA.fun1()
ModuleA.fun2()

ModuleB.fun1()
ModuleB.fun2()

Запускаем:

~~~ModuleA fun1
~~~ModuleB fun1
~~~ModuleA calls ModuleB.fun1()
~~~ModuleB fun1
~~~ModuleA fun1
~~~ModuleB calls ModuleA.fun1()

Работает!
Я там маленько ошибся, когда вызывал функцию другого модуля, которая ничего не возвращает, внутри функции print(), но переписывать не хочется, извините.

Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: