Перейти к контенту

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


Рекомендуемые сообщения

 

Э... Да, что-то полет мысли... случился, да.
Иногда полезно. В общем случае это так и работает, как там написано.

 

Итог: один из скриптов успевает раньше, а другой - либо должен проверять, что удаляемое все еще существует, либо мы в итоге висим.
Во-первых, проверять не надо - второй не будет вызван.
Во-вторых, можно использовать подход разделения "безопасных" и "небезопасных" колбеков (в случае, если лебедятам не надо удалять объект, можно на on_item_drop_safe подписать).
В-третьих, do_swan_dance и on_drop - разные события: внутри on_drop сказать - станцуйте (без удаления), а потом удалить.
В-четвертых, можно кидать всякие item_will_be_removed или on_release - и подписать любителя лебедей на оба события - on_drop и on_release.
В-пятых - можно таки указать приоритет, если песочница позволяет (но я бы не рекомендовала, не хорошо это)
В-шестых, если уж реально припрет всех пробежать, а удалить после колбека - можно сделать опять же дополнительный тип сообщения. К примеру, он смотрит объект, прошедший через цепочку вызовов, и проверяет наличие свойства need_release. И тогда киается удаление.
Но вот послединй пункт отдает поганым извратом и костылями.
По хорошему в игровой ситуации практически не бывает пересечения интересов.

 

 

Это должен гарантировать скриптер

Естественно, просто принять соглашение, что в таком ивенте трогать "посылку" нельзя.

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

Поделиться этим сообщением


Ссылка на сообщение

 

 

Теоретически, к моменту следующего апдейта все должно утрястись. Там и удалять.

При чем тут апдейты вообще? 

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

Поделиться этим сообщением


Ссылка на сообщение

 

 

А почему так делать не надо - не понимаю.

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

Но мне он не нравится, я бы постаралась спроектировать, чтобы до таких вещей не доходило.

Подобные вещи мне как раз очень напоминают истории с итерациями по массиву при удалении элементов из этого массива.

В общем то, это кривизна реализации движка, а не системы событий.


Кстати, в догонку: пример того, как я вижу решение подобных проблем - фейковый нетпакет в моей библиотеке для работы с ними (с нетпакетами). Он предоставляет точно такой же интерфейс, как и все остальные, но просто ничего не делает.

  • Согласен 1

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

Поделиться этим сообщением


Ссылка на сообщение

Попробую пояснить мысль, как на мой взгляд стоит сделать:

когда подписчик отработал с объектом, он должен просто просигналить в систему (need_delete), что мол этому предмету нужен кирдык и лучше с ним ваще не работать.

есть модуль, который отрабатывает это need_delete - и он единственный. И уж решает, что там дальше делать с этим неудачником по жизни.

В общем, способов много разных в пределах одной концепции.

Но я все же не могу представить реальной ситуации, когда два подписчика могут абстрактно обрабатывать on_drop "просто так": обычно обрабатываются предметы конкретных типов и только одним модулем, больше никакими.

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


 

 

Только остается узнать, - когда этот фейковый объект перестанет быть нужен, и его можно будет удалить?

фейковый пакет как и любой объект в ЛУА существует до тех пор, пока на него ссылаются, как только перестали - он попадает в сборщик мусора. То бишь, вполне может быть так, что ивент запускать не с самим объектом, а оберткой, а у него уже, у объекта этого какие-то свойства, которые будут отрабатывать в месте бросания колбека после отработки стека.

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

  • Нравится 1
  • Согласен 2

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

Поделиться этим сообщением


Ссылка на сообщение

 

 

Водка и энергетик.

Это объекты с разными секциями. Собственно все :)

И все перечисленное тоже легко разносится по какому-либо признаку.

  • Согласен 1

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

Поделиться этим сообщением


Ссылка на сообщение

, нифига. Это просто удобно. Для себя тем более, выше даже примеры приводились.

Изоляция и локализация важных мест - это круто, удобно и эффективно.

Изменено пользователем xStream
  • Согласен 1

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

Поделиться этим сообщением


Ссылка на сообщение

Ну, правда, часть из них потом же и предлагалась, уже как правильные.

Правда, что ли? :-) Рефакторить микросекундные вызовы? Заниматься копипастой? Нененедевидблейн

Вот все то же банальное for i = 1, #t do t().

Да тащемто нет. Подписываются только те, кому надо. И от подобных переборов ты никуда не уйдешь.

Главный цимес, что можно это делать динамически (и вот такие реальные случаи были у меня)

мегасистем

это, кстати, что такое? Изменено пользователем xStream

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

Поделиться этим сообщением


Ссылка на сообщение

@Murarius, да не. Тут уже разговор иссяк.

Краткий пересказ:

- тут зырьте крутая штука

- ты че за ересь принес?

- нормально, не то, что раньше фуфло делали!

- эй, мне стыдно, но как умели. Но есть ништяки!

- Ну и нафига нужны эти ништяки? Мои круче.

- не, ну ты не прав, это полезняк!

- о, ребя, чего это вы тут творите? Не ссорьтесь, все ништяки одинаково полезны.

- не, нифига! Макароны не надо, надо ништяки!

- хм... и правда, ниче так ништяки.

- не, ну смотрите, ништяки ваши легко сломать!

- ну вот вам способ залатать.

- хм, и правда. Ну ок, норм ништяки.

- Эй, вы о каких ништяках ваще?

Изменено пользователем xStream

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

Поделиться этим сообщением


Ссылка на сообщение

@Desertir, ExtJS - просто надстройка над jQuery, а там довольно просто это сделать. Там тот же стек. 

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

Поделиться этим сообщением


Ссылка на сообщение

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

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

Изменено пользователем xStream
  • Спасибо 1

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

Поделиться этим сообщением


Ссылка на сообщение

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

 

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

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

Изменено пользователем xStream

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

Поделиться этим сообщением


Ссылка на сообщение

 

 

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

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

  • Полезно 1

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

Поделиться этим сообщением


Ссылка на сообщение

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

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

Поделиться этим сообщением


Ссылка на сообщение
Поскольку я повёрнут на ООП

Понимат, обнимат. :) Учитывая, что в этом конкретном исполнении - ооп прототипный, это не имеет никакой особой разницы. Мою песочницу можно тоже сделать в нескольких экземплярах, а при небольшой модификации и в полноценный класс превратить. В iOSразработке сталкивалась с тем, что есть несколько notification manager'ов, но все (программисты) используют только DefaultNotificationCenter :) Имхо, по понятным причинам - это довольно таки избыточно, да и смысл появляется только в мультипоточных приложениях.

Возвращаясь к вопросу: зато объект-событие можно передать куда-то, вплоть до того, что внутрь другого события.

Изменено пользователем xStream

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

Поделиться этим сообщением


Ссылка на сообщение

@Andrey07071977, ты не то дал, это инструкция по тому, как делать паблик файлы :-)

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

Поделиться этим сообщением


Ссылка на сообщение
С точки зрения ООП, я так понимаю, что более правильный

Оба варианта не очень. Обычно делают массив положений. А само положение - структура, которая содержит все необходимые характеристики.

А вообще, это уже вопрос архитектуры и проектирования. Само по себе количество классов не имеет значения, пока это приносит удобство, простоту и эффективность. Достаточно вспомнить, например, шаблоны в с++ - это же вообще инкубатор классов :)

Изменено пользователем xStream

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

Поделиться этим сообщением


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

 

 

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

Саш, ты серьезно? О_о Имхо это вообще не так делается: запоминаем ид того, кто должен перейти, и на переход вешаем колбек. Как только перешел в онлайн, выполняем нужное нам таинство.

Хотелось бы пример увидеть, если не сложно

 

 

// Delegate method from the CLLocationManagerDelegate protocol.
- (void)locationManager:(CLLocationManager *)manager
      didUpdateLocations:[b](NSArray *)locations[/b] {
    // If it's a relatively recent event, turn off updates to save power.
  [b] CLLocation* location = [locations lastObject];[/b]
   NSDate* eventDate = location.timestamp;
   NSTimeInterval howRecent = [eventDate timeIntervalSinceNow];
   if (abs(howRecent) < 15.0) {
      // If the event is recent, do something with it.
      NSLog(@"latitude %+.6f, longitude %+.6f\n",
              location.coordinate.latitude,
              location.coordinate.longitude);
   }
}

 

 

Это не взятие позиций через диалог, а обновление при смене положения юзера, но принцип тот же. Жирным выделила собственно ключевые места.

 

 

И да, забыл упомянуть, помимо логики, еще диалоги немного разные в визуальном плане, почему немного?

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

Получается примерно так:

структура положения - хранит координаты

некий сервисный класс, который либо получает положение текущее, либо возвращает значение из списка

контроллер диалога - показывает вьюху и кастомайзит ее

вьюха имеет логику обращения к сервису и просит получить координаты у него

 

 

код будет выглядеть примерно так:

Ну, верно, да :) Просто к положениям это не относится, как и к получению этих положений. И да, не надо плодить разные классы для вьюх.

Изменено пользователем xStream

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

Поделиться этим сообщением


Ссылка на сообщение

Отсюда по всему классу диалога будет код такого вида:

Это ужасно...

 

Вот выше приведенное в пример, показалось мне костылем

А что мешает использовать тот класс, объектом которого является location? Не придется ничего присваивать. 

 

mSettings.setCurLatitude(loc.getLatitude()); 
mSettings.setCurLongitude(loc.getLongitude())

Фиг с ней, с венгеркой, но почему, блин, координаты раздельно то?

 

 

Вопрос вообще заключается не в том, как это сделать, а какой подход более правильный!

"Более лучше" © Как эффективнее, так и лучше. Правильно - не то слово, в данном случае.

Изменено пользователем xStream
  • Нравится 1

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

Поделиться этим сообщением


Ссылка на сообщение

пусть и на несколько байт, но все же

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

 

 

Это не венгерка,

Скажу по секрету - это венгерка :) И что значит "общепринятые"? Я умоляю, пруф в студию. Как минимум к любому языку существует огромное количество code guideline'ов.

 

 

А критерий эффективности какой?

Быстрее получить решение такое, которое если что, потом можно "проапгрейдить". У меня вот такой критерий.

 

 

В общем, мне интересен ответ, я уже несколько раз разжевал на что именно, но ни малейшего приближения к нему я так и не получил...

Эм... ну вроде как написали уже: нет "правильного", есть различные подходы. Я предлагаю, чтобы вью содержала в себе весь функционал, который бы настраивался. Как, в принципе, ты и хотел делать. Изменено пользователем xStream

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

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...