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

Рефакторинг


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

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

 

Как я это представляю, кроме введения и обсуждений в формате "все ни о чем":

 

Создается паралельно более специализированная тема, типа "динамическое подключение функций" (это если вопрос достаточно синкретичен), или "нетпакеты", или "таймеры", или вот прямо конкретно "_g.script".

А здесь черкается заметочка.

 

"Все ни о чем" обсуждаем прямо здесь.

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


Ссылка на сообщение
(изменено)

Тема "нетпакеты". Пока только скрипт с выдранным из amk и заоптимизированным по скорости.

 

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

 

_g.script

Просто гравипушка и поправка/альтернатива

Таймеры. И сон.

Изменено пользователем Dennis_Chikin
  • Полезно 1

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


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

По тому что тема более обширная. Просто там сейчас всего одна статья. Что, будем после каждого поста переименовывать ?

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


Ссылка на сообщение
(изменено)

Гм... Вообще-то не вижу какого-то особого энтузиазма. Скорее - "ну что там этот идиот опять награфоманил" - если вообще хоть кто-то в раздел еще заглядывает.

 

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

Мда, знали бы вы, как меня с этой солянкой достало, когда что-то написал, отладил, и даже работает, но  только у меня. А просить попробовать кого-то другого - надо опять откатывать под древние уежища, возвращая кучу только-что вычищенного индокитайского мусора, и не факт,  что получится.

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

 

И вообще все эти правки и "адаптации", когда меняется ради 10 строк чего-то нового 20 других скриптов в 20 местах каждый, непонятно зачем...

Но, ведь, блин, всем нравится и всех устраивает.

Не понимаю...

 

 

Мда, а что я сказать-то хотел ?

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

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

Сохранять древний апи или мистическую "совместимость" смысла не вижу.

И то, и другое надо заново делать.

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

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


Ссылка на сообщение
(изменено)

2abramcumner: Мы все умрем, да !

И про то, что у каждого свои видЕния и привидения - спасибо, Кэп, я помню.

 

Вот только совместимости ни какой реально ни где нет. Ни по сэйвам, ни по апи, ни по чему вообще.

Есть набор странных ритуалов, типа изменил где-то одну строку - измени еще 50 скриптов в 50 местах.

И НИ по каждому чиху. Добавил непися, убрал непися, добавил ствол, убрал ствол, спилил мушку - НИ.

 

Хотя в действительности 99.9% НИ обязаны все тому же ритуалу.

 

И, да, Артосокод мне тоже нравится. Студентам давать хорошо, ибо "солдат, который ни чем не занят..."

Вот только kee\/\/1_hAcckePssKaIY-aaЯ запись имен переменных и функций... Э-эээ, несколько печалит. А опечаток и неумышляемых результатов копипасты при этом - не так чтоб уж ну очень сильно меньше, чем у меня.

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

Ну и с инкапсуляцией - все-таки перебор, да. Перебор.

А так - все в нем здорово, можно издаваться, аки Дийкстре. Кроме шуток.

 

Да, гитхуб - идя, конечно, хорошая. Кто-б занялся... А свина - таки фффтопку. Ибо опыт - крайне негативный.

 

И, конечно, да - мы все умрем !

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

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


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

Карлан, кстати, спасибо: я понял, в каких примерно случаях нужен стиль написания кода Артоса.

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

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


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

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

  • Согласен 1
  • Полезно 1

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


Ссылка на сообщение
(изменено)

Он самый.

 

А вот смысл этого действа... Вот что-то типа такого:

    local treasure_mgr
    local dfcy = pk:r_u8()    -- Загружаем уровень сложности
    if dfcy >= 128 then
        dfcy = dfcy - 128
        treasure_mgr = true
    end
еще что-то грузится...
    if treasure_mgr then
        treasure_manager.init()
        treasure_manager.load( pk )
    end

грузится список тайников с метками. Которые снимаются, когда актор в тайник заглянул. Ну и зачем ? При этом в модах сверху понаворочено еще по стописят скриптов, которые тоже что-то делают с этими тайниками и метками.

Итоговый вывод - рудимент. В смысле, вообще весь скрипт.

 

Всю информацию о тайниках следует хранить в самих тайниках.

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

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


Ссылка на сообщение
(изменено)

Самое смешное, что он - есть ! Просто в одном флаконе со всякими дверями, прожекторами и прочими бтр'ами.

Кстати, почищенный и отформаченный: https://dl.dropboxusercontent.com/u/27871782/bind_physic_object.script

 

Убраны операции бессмысленные и беспощадные (закомменчены).

Оставленное - черная магия, без которой не работает.

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

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


Ссылка на сообщение
(изменено)

local nfo = {}; self.treasure_info = nfo

...

r, id, v = ini:r_line( "list", i, "", "" )

...

nfo[id] = { ... }

 

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

 

то есть, индексы - не последовательные. То есть, # вернет бред.

 

Пока на скорую руку набросал паллиатив https://dl.dropboxusercontent.com/u/27871782/treasure_manager.script

- не жрет по 3-5 секунд при загрузке - да и ладно.

А потом - просто снести совсем за полной ненуностью и неземной кривизной. Вместе с раскиданными по локациям из олспавна "тайниками".

 

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

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

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


Ссылка на сообщение
(изменено)

Грубо говоря, вот такое, например:

 

function action(obj,...)
    local arg = {...}
    local act = entity_action()
    local i = 1
    while true do
        if (arg[i] ~= nil) then
            act:set_action(arg[i])
        else
            break
        end
        i = i + 1
    end
    if (obj ~= nil) then
        obj:command(act,false)
    end
    return  entity_action(act)
end

-- вот кто-нибудь знает, ЧТО ЭТО ?

Не, то, что это - похмельный бред - я сам знаю.

 

А про "кому надо, кому не надо" - вот то я и смотрю, что сплошь и рядом вместо, скажем, parse_custom_data()/gen_custom_data(), как оно причесано выше в меру на сколько лениво было и задней левой, по 10-20 копий где попало не далеко ушедшего от того, что под спойлером.

 

А если какой-нибудь get_obj_name(), как обычно, 50 вызовов через 20 скриптов, то вообще - ни в сказке сказать, ни в слух произнесть. А ежели здесь написать - то сразу 7 суток бана по 2.1

 

 

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

То есть, если, например, в скрипте ПРОСТЫХ быстрых таймеров используется переменная, добавленная в _g, так не надо было каждый раз ее обратно заменять на набор из 20 монстрофункций, и в итоге опять получить "45-е мая". ;)

 

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

 

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

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

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


Ссылка на сообщение
(изменено)

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

По моим прикидкам в той же соли мегабайта 3 xml'ов сразу уйдет, остальное надо смотреть. И кой-чего добавится, что давно надо, но xml-ами это делать - нафиг-нафиг.

 

По скриптотаблицам после выноса отовсюду в отдельный скрипт (было что-то руками вбито, включая устаревшее и с ошибками, что-то из ltx больше ни для чего не нужного формировалось - десятками экземпляров по всем местам), получилось итого 200 кил мгновенно читаемого (а не по полминуты каждый раз). Минус всякого рода "прихрамывания" на чтениях вот этого вот самого.

 

"Даже взять тебя, ты надеешься что твой мод кто-то возьмет и будет на его основе что-то лепить" - я это возьму по любому. Хотя не факт, что не придется "драконить" на части с более простыми вызовами. Но оно в любом случае того стоит, чем с нуля делать.

 

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

 

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

 

"Самодаптирующееся" должно быть. Впрочем, мы уже по кругу пошли, и вообще это в более соседнюю тему.

 

Upd: "Самоадаптирующееся? Ну давайте тут все соберемся и напишем ... что-бы все понятно было как использовать" - ну, кое-что есть. Не Юбер, но зато просто и изящно.

Собсьтвенно, тот же _g зачищаемый с комментариями начал выкладывать, по тому как кусочек маленький туда втыкается. И для того же просил версий класс-регистратора, чтоб уж совсем все "на автомате" подцеплялось. Немножко тормознулся тут на разных других вещах, но намерен продолжить.

 

Upd2: "именно первое открытие, далее все было быстро" - а вот это нынче легко лечится. Года 4 назад просто готовить не умели такие вещи.

 

 

Да тут можно даже не "собираться-договариваться", а банально, с миру по нитке. Вот прямо в те темы. Кой чего уже закинули, кой чего перенесу - будет время/настрой - так и кусочками выделю/вставлю туда, куда вижу...

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

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


Ссылка на сообщение
(изменено)

Все просто: ветки. А поскольку язык - скриптовый, мы здесь до конфликта библиотек вряд-ли доживем.

 

Все проблемы с "адаптациями" пока что успешно сводятся к тому, чтобы впихать мусор среди мусора (и поправить мусор в 20 скриптах), плюс отсутствие одной переменной, из за которой надо добавить себе 50 килобайт мусора, поскольку одну переменную добавить - религия не позволяет.

 

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

 

Ну вот типа гляньте на тот xr_meet в "прозекторской" - там в комментариях даже отчасти цензурно. ;)

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

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


Ссылка на сообщение
(изменено)

Я поступил пока просто и незатейливо:

 

-- "ручная" инициализация модулей, для контроля корректности
-- и обеспечения порядка инициализации для зависимых модулей

string_format = string.format

function log( ... ) _util.log( "_init", ... ) end
function abort( ... ) _util.abort( "_init", ... ) end


local t = {	-- последовательность важна !

["start"] = {	-- инициализация глобальных таблиц и менеджеров
	"_util",		-- служебные функции
	"_tbl_npc",		-- разные забавные особенности неписей
	"_tbl_protected",	-- защищенные предметы
	"_tbl_global",		-- соответствия классов и типов
	"_tbl_outfits",		-- костюмы
	"_tbl_levels",		-- уровни
	"_tbl_treasures",	-- тайники
	"_tbl_deathmgr",	-- лут
	"_tbl_sounds",		-- звуки
	"sound_theme",
	"amk_netpk",		-- работа с нетпакетом
	"xl_imgr",		-- кэши параметров предметов
	"amk"			-- управляющий скрипт амк (помойка на самом деле)
	},

["amk"] = {},	-- дополнения amk

["actor"] = {	-- скрипты, требующие актора
	"actor_data",		-- данные актора, нужны для всего онлайнового
	"ui_amk_options",	-- опции солянки
	"fix_it",		-- правки глюков allspawn 2010.14.08
	"amk_timers",		-- таймеры (сохраняются в pstor)
	"xr_sound",		-- звук
	"news_manager",		-- типсы, init не нужен, но пусть будет
	"sr_psy_antenna",	-- пси-излучение, самоинициализируется, но для контроля вставим
	"bind_restrictor",	-- обновление рестрикторов (в основном всякие "разрывающиеся рюкзаки" и прочая ересь
	"amk_spawn",		-- спавн amk
	"inv_manager",		-- инвентарь актора
	"dialogs",		-- функции для диалогов
	"xl_offline",		-- состояние объектов в офлайне (требует level)
	"amk_anoms",		-- аномалии
	"bind_art",		-- арты, для детектора, и будет еще для "контейнеров"
	"death_manager",	-- лут
	"xl_online",		-- состояние объектов в онлайне
	"xr_box",		-- лут из ящиков
	-- не включать - init() дергается из конфигов -- "bind_physic_object"	-- всякая всячина, от ящиков до БТР
	"news_data",		-- тексты новостей
	"news_main",		-- новости
	"level_weathers",	-- смена погоды
	"ui_rad",		-- шкала радиации
	"actor_effects",	-- эффекты актора

	"treasure_manager",	-- тайники
	"task_manager",		-- квесты
	"dialog_manager",	-- диалоги
	"sr_territory",		-- стрельба на особых территориях, инициализация не нужна, но пусть будет
	"xl_relations",		-- сообщества и отношения
	"bind_heli",		-- вертолет
	"mob_combat",		-- схемы монстров, не нужно, но чтобы было, для контроля
	"mob_death", "mob_panic", "mob_trade", "mob_trader",
	"arc_diary",		-- дневники контролеров
	"bind_monster",		-- онлайн-монстры
--	"xr_motivator",		-- онлайн-неписи
	"xr_wounded",		-- ранения, чтобы было
	"sak",			-- функции сюжета и диалогов Сяка
	-- "amk_offline_alife",	-- офлайн, устарело
----	"tag_spb",		-- превращение трупов в зомби при выбросе
	"amk_mod"		-- большая помойка от АМК
	},

["np_pda"] = {	-- требуют netpacket_pda в онлайне
	"spawn_level_changer",	-- телепорты и принудительные смены уровня
	"bind_mteleport",	-- внутриуровневые телепорты, создание/удаление здесь же
----	"flamethrower",		-- огнемет
----	"repair_check",		-- ремонт и апгрейд
----	"aem_manager",		-- арена
--	"storyline",		-- сюжет
	"escape_dialog",
----	"braad_test",		-- функции сюжета, прибито гвоздями к all.spawn
	"kostya_dialog",	-- функции сюжета и диалогов
----	"new_dialog",		-- функции сюжета и диалогов
----	"wawka_dialog",		-- функции сюжета и диалогов
--	"arhara_dialog",	-- функции для диалогов Архары
	"actor_devices",	-- функции шмоток актора
--	-- "amk_artmod",	-- варка артов
--	-- "ui_pda_art_mod",	-- какой-то девайс для варки артов, устарело
	"biodetector",		-- детектор монстров (раньше не нужен)
	"sleep_manager"		-- сон
} }


local m_name = false


function check( blk )
	local f, pt1
	local tt = t[blk]
	local pt2 = profile_timer()
	pt2:start()
	for i = 1, #tt do
		if m_name then abort( "error in module [%s]", m_name ) end
		m_name = tt[i]
		f = _G[m_name].init
		if f then
			pt1 = profile_timer()
			pt1:start()
			if f() then
				pt1:stop()
				log( "init", "init %s [%s], ok (%s)", m_name, blk, pt1:time() )
			else
				pt1:stop()
				log( "warning", "init %s [%s], !true (%s)", m_name, blk, pt1:time() )
			end
			m_name = false
		else abort( "init, no %s.init() [%s]", m_name, blk )
	end	end
	pt2:stop()
	log( "init", "profile time: %s", pt2:time() )
end

 

Дергается из трех разных мест. А из соответствующих init() подключаемся в заранее предназначенные точки. Как бы пока достаточно.

Ну, измерение времени - понятно для чего.

 

Образец init() можно по ссылке выше посмотреть.

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

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


Ссылка на сообщение
(изменено)

Таки не совсем без телодвижений. Есть еще зависимости, когда одно без другого не заводится. Иди еще бывают рекурсивные ссылки, которые пока еще все от всюду вычистишь... Ну вот я напрягаться и не стал, а просто заношу в нужном порядке.

 

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

 

Ну как бы уже писал - гонюсь не за универсальностью и академичностью, а за минимумом телодвижений и возможностью "охватить взглядом" хотя бы нужный блок, если уж не функцию. В смысле, и что у него внутри делается, а не только на уровне псеВд00смЬIслЕнНыхНаZвАниЙ.

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

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


Ссылка на сообщение
(изменено)

"И вероятно свои пять копеек в эту копилку закинем. И хоть квартетом хоть как угодно. Хуже то точно не будет, правда?)"

О ! Собственно, ради чего, и.
Кстати, в скриптах недавно хваленые Артосомодули исправленные закидывали. У меня просто руки не доходят перенести куда надо.

 

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

На самом деле даже короткий анонс  - и тот полезен.

 

Ну и про "не видите явных ошибок" - см. выше про те же артосомодули. Да и недавнего кровососа из скриптования тоже в сюда же можно вспомнить. По скольку раз  его уже исправляли ? Вот так вот чисто прикинуть ?

 

P.S. Да, неписи, в кострах сидящие, полагаю, у всех 5 лет назад исправлены ? А то я вот на парочке соседних форумов буквально пару месяцев опять видел рассуждения, про то, что в пути надо "_task" добавлять. ;)

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

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


Ссылка на сообщение
(изменено)

Фигня это, пр круглый стол, и единый синтаксис. Не нужная.

 

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

А занялся чем-то более приоритетным.

 

Если меня тот ПЛА не устроит чем-то - так поправлю, как надо будет. Делов-то...

 

Что нужно на самом деле: вот этот долбаный actor в _G я заявил, и дальше уже не парюсь, чтобы весь свой код обратно низводить до "совместимости с 1.0004".

amk_netpk выложил - теперь Struck таки будет xr_wounded.script смотреть - так знает, где найти, если что. Впрочем, там все то же самое, что было в амк, только быстрое, и ошибки исправлены.

 

Как-то так.

 

 

"выяснить явные косяки скриптов, исправить их (написать свои или взять готовое),"

Ну так подключайтесь.

 

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

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

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


Ссылка на сообщение
(изменено)

Desertir, затем, что есть, например, та же солянка, которая пока в "подполье" не ушла - много чего написали именно совместно. Кто-то что-то выложил, другой заинтересовался и допилил, что-то с чем то утрясли, оно теперь там худо-бедно, но есть.

 

Да и к ОП2, если присмотреться, там правки не только "все сломать", но и кой-какой новый функционал понаделали, а кой-чего и исправили, что давно надо было. Не самым лучшим образом, но тем не менее.

 

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

 

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

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

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


Ссылка на сообщение
(изменено)

Усе будет, но не все мгновенно.

 

"что же ты все цепляешься за солянки и ОП2?" какие есть под рукой примеры - те и привожу. И, да, за базу в свое время взял солянку, так на той базе и делаю. По тому что там были карты - много. И куча всякого сразу в распакованном виде. и идея собрать все, что на тот момент где-то было, в одном месте. И таки собрали, хоть и криво-косо.

 

А вот скриптики от нее отвязываю, по-тихоньку.

 

 

2 Shadows: на самом деле даже

function action( obj, ... )
	local act = entity_action()
	for i, v in ipairs( { ... } ) do act:set_action( v ) end
	if obj then obj:command( act, false ) end
	return entity_action( act )
end


function action_first( obj, ... )
	local act = entity_action()
	for i, v in ipairs( { ... } ) do act:set_action( v ) end
	if obj then obj:command( act, true ) end
	return entity_action( act )
end
- просто не дошли руки до выкладывания следующего куска, поскольку не проверено и не оттестировано нормально. А вот всего скрипта, пригодного к выложить - как-то до сих пор нет. Полуфабрикат какой-то... Вот и откладывал в долгий ящик.

 

Зачем это надо было бы переписать - да чтоб хотя-бы понятно было, какие функции там вообще есть, и как их использовать. А не гадать, что там за if ... == nil then break, и есть ли в этом глубокий сакральный смысл, который нам неизвестен.

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

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


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

local arg = {...} - на самом деле вот это присвоение здесь совсем лишнее.

Ну и pairs vs. ipairs.

 

Почему не оставить arg, и не for i = 1, #arg do что-то там arg ? - А вот как раз доли наносекунд ловить уже лениво. Этож еще специально тест писать, чтоб проверить... А громоздкость конструкции - на лицо.

 

Но ежли кому не лень - да, проверьте варианты. Интересно. ;)

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


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

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

AMK-Team.ru

×
×
  • Создать...