Jump to content
Азраэль

Курилка программистов

Recommended Posts

Карлан    1,032

@Malandrinus, конкретно я в самом коллбеке определяю наиболее часто используемые параметры и кидаю их в ивент (это юзердата, айди и секция). Ну и далее можем легко и не принужденно вызывать:

function use(e)
return use_functions[e.section] and use_functions[e.section](e.obj) or log('warning: function not exist')
end

Ну и разумеется это все легко доделать до того, как сделано у Дениса (for i = 1, #t do t( item ) end).

 

И да, хоть расстреливайте не вижу ощутимого плюса в сравнении с e.section == 'my_item' and func(e). На мой взгляд так оно даже лучше, т.к. идентифицирующий параметр далеко не только секция может быть, так что городить еще один массив - мартышкин труд.

Edited by Карлан

Share this post


Link to post
Share on other sites
Dennis_Chikin    3,615

"т.к. параметр далеко не только секция." - остальное лично мне попадалось сильно реже.

Поэтому в запросах подписантов принимаются (и, соответственно, проверятся) только "по секции" или "любой".

 

А дальше то же самое можно повторить сколько угодно раз для любого количества параметров. Вот хоть как у Desertir.

 

e.section == 'my_item' and - вот здесь очевидно придется руками каждый раз лазить везде, где надо что-то добавить или убрать. Либо что-то нетривиальное творить.

 

 

Upd: Все, признаю. Вавилонское столпотворение свершилось, и с этого момента я ТОЖЕ уже перестал понимать, кто здесь вообще про что пишет, и что при этом имеет в виду.

Edited by Dennis_Chikin

Share this post


Link to post
Share on other sites
Карлан    1,032

@Dennis_Chikin, в таком случае можно просто через таблицу дополнительных параметров все что нужно докидывать, в этом и есть удобство.

event('drop'):register(drop, {param}, event, ...) 
И опять же не обременять себя построением массива. В случае с ивентами эти таблицы можно выстраивать прямо на ходу под нужды текущей функции/модуля. Далее их можно так же утилизировать без последствий, совсем. Edited by Карлан

Share this post


Link to post
Share on other sites
Zander_driver    5,355

 

 

Я недавно видел в одном скрипте как через loadstring вызывали функцию текущего скрипта в зависимости от аргумента, который формировал имя функции.

Не в моем, часом? у меня есть такое. Мог бы заметить.


а писать в глобал или еще куда - какая в принципе разница, блин?) кому как удобно. если знаешь где лежит, в любом случае эту таблицу дернуть несложно.


08.01.2012 в 03:30, xStream сказал:

Те, у кого свои руки есть, копипастить это не будут, проще свое написать, которое тоже велосипедное, но более понятное автору.

 

Share this post


Link to post
Share on other sites
 xStream    86

На минуточку: в луа конструкция t[obj:section()] и набор колбеков со стоками типа if obj:section() == 'fuck_the_millenium" return end внутри выполнятся одинаково. Именно потому, что получение значения по ключу - тот же перебор, по хешмапу. А тут перебор колбеков до первого подходящего - та же табличка и то же сравнение. Разница только в дополнительном микросекундном вызове одной функции.

Вообще, знаете как работают конструкции типа t ?

Edited by xStream
  • Thanks 1

Все, кто стоит на моем пути: идите нахрен и там погибните! ©

Share this post


Link to post
Share on other sites
abramcumner    925

Именно потому, что получение значения по ключу - тот же перебор, по хешмапу.

Хмм... Не хилое такое заявление про хешмап и перебор.

Share this post


Link to post
Share on other sites
Zander_driver    5,355

malandrinus, xStream. вообще-то t[obj:section()] собственно не для оптимизации нужен.

и размножение ивентов в биндере актора - не с той стороны вообще, от сути вопроса.

  • Согласен 1

08.01.2012 в 03:30, xStream сказал:

Те, у кого свои руки есть, копипастить это не будут, проще свое написать, которое тоже велосипедное, но более понятное автору.

 

Share this post


Link to post
Share on other sites
 xStream    86

--тут был абсурд про хешмап, позор на мои седины--

 

вообще-то t[obj:section()] собственно не для оптимизации нужен.

А для чего тогда, если оно никаких преимуществ не даст? Хардкод даст, макаронный код даст, эффективность не даст. Профит в чем?

Edited by xStream

Все, кто стоит на моем пути: идите нахрен и там погибните! ©

Share this post


Link to post
Share on other sites
Dennis_Chikin    3,615

Добавьте мне в if ... then ... elseif ... что-нибудь из скрипта.

Edited by Dennis_Chikin

Share this post


Link to post
Share on other sites
Карлан    1,032

@Zander_driver, я тебя тогда вообще не понимаю. Я тебе тогда тоже могу сказать, что делать много подписчиков или одного, тоже дело вкуса. Я могу сделать подписчика и передать ему в качестве аргумента всю твою таблицу с функциями (причем как глобальную, так и локальную, так и только что созданную), и мой подписчик будет пользоваться этой таблицей. Я что-то не пойму, ты америку открыть решил? С чего ты взял что такой расклад никто не берет во внимание? Вон сверху Аня все верно написала, и тут уже собственно сам сделай очевидный вывод.

 

Не в моем, часом? у меня есть такое. Мог бы заметить.

В твоем не замечал, я, как-ты догадываешься, их не особо читаю. Но, если там и такое есть, то тогда о какой рациональности ты тогда можешь говорить? ;)

Share this post


Link to post
Share on other sites
abramcumner    925

Хорошо-хорошо, не полный перебор. а бинарный поиск :-)

Это у map - бинарный поиск. У хешмепов время поиска ключу - константа.
  • Thanks 1

Share this post


Link to post
Share on other sites
Zander_driver    5,355

Если я тут еще появлюсь, напомните мне что я обещал тут не появляться.

to all: да окей, вы правы а я ничего не понимаю. я же и не спорил никогда с тем фактом что я начинающий и многое могу не знать или не понимать. как мне самому кажется лучше, так и делаю.


08.01.2012 в 03:30, xStream сказал:

Те, у кого свои руки есть, копипастить это не будут, проще свое написать, которое тоже велосипедное, но более понятное автору.

 

Share this post


Link to post
Share on other sites
Malandrinus    600

размножение ивентов в биндере актора - не с той стороны вообще, от сути вопроса.

Вот тогда я тебя не понимаю. А что тогда ты имел в виду и какое именно использование ивентов/событий на твой взгляд самое кошерное?

 

 

 

Позволю себе несколько пофилософствовать. Ивенты/события/сигналы/колбеки - это вообще реализация шаблона проектирования "наблюдатель". Суть идеи в том, что есть некий процесс, который идёт как идёт, и есть некое неопределённое заранее количество наблюдателей, других процессов, которые хотят что-то делать по факту происходящего в наблюдаемом процессе. Ключевое понятие здесь - "наблюдение", поскольку наблюдение неинтрузивно. Это означает, что наблюдаемый процесс ничего не делает для того, чтобы вызвать некие действия со стороны наблюдателя. И вообще не знает про наблюдателя, или наблюдателей, или их отсутствие, или что они собираются делать.

 

В самом деле, вот идёт актор по Свалке весь уставший в дождливый день после удачной сделки с Сидором и решает хлопнуть пузырь водки. Ясное дело, актору невдомёк, что за ним наблюдает кто-то, кто ждёт именно этого события. И уж тем более невдомёк, что этот злоумышленник собирается сделать. А вот вызов из колбека на дроп в биндере функции типа такого:

function actor_binder:on_drop(obj)
    ...
    if is_vodka(obj) and rainy_day() and self.object:money() > 100500 then
        some_module.gopstop_mi_podoshli_is_sa_ugla()
    end
    ...
end

будет явным нарушением этого принципа. С какой стати актору выдумывать себе неприятности? Иными словами, засорение логики актора не относящейся к нему логикой не есть хорошо. В биндере актора должно быть только то, что относится к актору (по-хорошему, почти ничего там быть не должно). Другой аспект - надо стараться уменьшать связи между разными компонентами, а здесь мы такую связь установили. Связи делают компоненты зависимыми друг от друга. Простейшая зависимость - удаление одного компонента приводит к неработоспособности другого. Я удалю модуль some_module.script и биндер актора будет валиться в месте обращения к нему.

 

Теперь тонкий момент. Шаблон "наблюдатель" подразумевает неинтрузивность наблюдения. С технической точки зрения ясно, что совсем-совсем неинтрузивность обеспечить невозможно или достаточно сложно. Поэтому мы минимизируем степень взаимодействия наблюдаемого с наблюдателем до простого оповещения. Т.е. наблюдаемый объект только кидает ивенты, а кто на них отреагирует, как, и отреагирует ли вообще - его не волнует.

 

function actor_binder:on_drop(obj)
    ...
    self.sm:call("on_drop", obj)
    ...
end

Собственно и всё. В этом весь смысл идеи событий. Всё остальное - всякие дополнительные плюшки, оптимизация, и пр. - это уже детали. Я просто очередной раз пытаюсь донести, чем именно вызван такой подход, какая мотивация за ним стоит. Вот эти два аспекта, разделение логики и снижение зависимости между частями системы, - самые главные. А над ними стоит наша сверх цель - снижение сложности системы.

Edited by malandrinus
  • Like 1
  • Согласен 1
  • Полезно 1

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Share this post


Link to post
Share on other sites
Карлан    1,032

@Zander_driver, сначала говорить что все отсталые, и вообще кругом и везде всё не правильно делают, а потом съезжать на "я начинающий" - как минимум не корректно. Ты себе вот это вроде алиби придумал? Будь добр не прятаться в кусты, а ясно пояснить, что ты имеешь ввиду под "прогрессивным" использованием подобной системы на 2015 год. Ты можешь доказать состоятельность своей претензии, и описать альтернативно-лучший вариант? Я вроде тоже не дурак, и, если что, признаю свою неправоту. Пока я вроде-бы недвусмысленно дал понять, что с помощью ивентов гораздо удобнее манипулировать данного рода схемами, а так же при определенных действиях еще и память сэкономить. Как-нибудь опишу тебе еще некоторые плюсы, которые с ивентами делать куда удобнее, чем городить какие-то отдельные таблицы. Но у меня почему-то ощущение, что ты все равно будешь делать не как надо, а как тебе лучше кажется, притом называясь новичком... 

 

Ну и в догонку:

 

 

а писать в глобал или еще куда - какая в принципе разница, блин?)

Локальные обрабатываются быстрее, и уничтожаются тогда, когда заканчивается их область действия, тем самым освобождая память. Так что разница все-же есть. 

http://www.lua.org/pil/4.2.html

Share this post


Link to post
Share on other sites
Malandrinus    600
писать в глобал или еще куда - какая в принципе разница, блин?

Особенность Lua в том, что переменная ищется начиная от текущего уровня вложенности и вплоть до глобального, поэтому к глобальным переменным на самом деле обращение идёт медленнее. Но, на мой взгляд, это не самое важное. Важнее то, что глобальная область одна, и сваливать туда все переменные - чревато конфликтами по именам. Действительно лучше ограничивать область видимости, ну и как следствие время жизни, переменных.

Народ, как-то реально стало заметно некое напряжение в этой теме. Некоторые комрады, не будем тыкать пальцами, определённо перегибают палку и практически переходят на личности. Это недопустимо. Прошу всех критически отнестись к своему стилю общения и при необходимости пересмотреть.

Edited by malandrinus
  • Thanks 1
  • Согласен 1

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Share this post


Link to post
Share on other sites
Allender    11

Здесь - смысла в таком нет. Хоть и через ивенты, но ваши исполняемые действия выглядят именно так как в приведенном примере. Хотя каждому "подписчику", нужен вполне определенный предмет, и не нужны все остальные.   Ну неужели так сложно сделать хотя бы так _g.script item_reactions = {     matras = function(obj)          end,     medkit = function(obj)          end,     bandage = function(obj)          end     ... } колбек на дроп или где там у вас производят это дело ивенты

 

Не есть хорошо. Например тебе нужны бинты и аптечки, а мне моя секция [beer], все равно придется править _g ручками.

 

 

self.am:call("on_drop_"..obj:section(), obj, sobj)

--Тогда для в модуле для подписки на событие дропа аптечки сделаем так:
function attach(sm)
    sm:subscribe({signal = "on_drop_medkit", fun = this.on_medkit_drop})
end
function on_medkit_drop(obj, sobj)
end
self.am:call("on_drop_"..obj:section(), obj, sobj) -- дроп предмета с секцией
self.am:call("on_drop_"..obj:clsid(), obj, sobj) -- дроп предмета какого-то класса
self.am:call("on_drop_"..(obj:mass() > 10 and "heavy" or "lightweight"), obj, sobj) -- дроп предмета массой больше/меньше 10-и кг 

 

А вот так можно?

function handler(obj)
	if obj.clsid = "WP_LR300" and ... then
		script.onDropSpecial();
	end
end

function onDropSpecial()
end

-- где-то...
self.am:call(loadstring("script.handler("..obj..")")); -- дроп предмета (неважно какого), обработчик разберется

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

 

-- upd:

Пардон, глупость написал с ..obj... Нужен же сам объект. Поправляюсь:

 

-- где-то...
self.am:call(loadstring("script.handler("..obj:id()..")")); -- дроп предмета (неважно какого), обработчик разберется

-- и в script
function handler(sId)
    obj = alife:object(sId);
    ...
end
Edited by Allender

Share this post


Link to post
Share on other sites
 xStream    86

 

 

А вот так можно?

Честно говоря, я вообще не понимаю, что ты хочешь. Loadstring вернет результат выполнения строки (как скрипта) и возникнет сигнал с именем-результатом. Но что-то у тебя уже сработало, то есть по сути ты замену сделал самой системе событий - одна единственная функция с ветвлением. А сигналы тут вообще никаким боком.

  • Полезно 1

Все, кто стоит на моем пути: идите нахрен и там погибните! ©

Share this post


Link to post
Share on other sites
Dennis_Chikin    3,615

Кажется, я понял, что происходит. Здесь все описания того, что кто-либо делает, начинаются примерно с середины.

Ну, типа "историю вопроса все знают, как и зачем сделано - тоже все знают, куда что подключено, что там внутри и зачем оно подключено - тоже все знают. Осталось прояснить одну конкретную особенность реализации". это на самом деле не так.

 

Вот по-этому адресаты и не понимают, зачем им вообще пишут ЭТО, и что, собственно, хотят.

Вопрос - у кого-нибудь найдется время/желание написать все подробно и с самого начала ?

 

 

2 malandrinus: self.sm:call("on_drop", obj) - self. в примере как бы явно указывает на то, что относится к актору, а не к внешней системе, нет ?

Edited by Dennis_Chikin

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

AMK-Team.ru

×
×
  • Create New...