You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Не к работе сейчас. Замер и раскладка на будущее, чтобы не считать заново. Открытых PR и так хватает на тестирование; браться — когда Стрибог решит. Родительская задача — #3807.
Слой 1 из #3807 — вынести глобальные буферы buf, buf1, buf2, arg, smallBuf (utils.h:638) из кода. Ниже — что остаётся после первых трёх файлов (#3813).
Сколько осталось
Считано без комментариев и без файлов, где переменная с таким именем объявлена локально:
162 файла содержат от одного до двенадцати обращений — суммарно 817. Каждый закрывается за один заход и навсегда уходит из списка. Часть — вообще холостые: в do_kill.cpp, bash.cpp, manadrain.cpp глобальный arg используется один раз как временное хранилище под one_argument, и заменяется локальной строкой.
Предлагаемый порядок (когда дойдут руки)
Пачки «однострочников» — по подсистемам, один PR на пачку. Например, все gameplay/skills: 201 вхождение больше чем в двадцати файлах, правка механическая, риск близок к нулю.
punishments.cpp (98) — один файл, целиком про сообщения богов.
Тяжеловесы — по одному в PR, начиная с do_stat.
Признак, что слой закончен: из utils.h можно удалить пять extern char.
Чем мерить
python3 - <<'PY'
import io,glob,re,collections
real=collections.Counter()
for f in glob.glob('src/**/*.cpp',recursive=True):
if 'third_party' in f: continue
s=io.open(f,encoding='utf-8').read()
local={m.group(1) for m in re.finditer(r'\bchar\s+(buf|buf1|buf2|arg|smallBuf)\s*\[', s)}
n=sum(len(re.findall(r'\b%s\b'%name, line.split('//')[0]))
for line in s.split('\n') for name in ('buf','buf1','buf2','arg','smallBuf') if name not in local)
if n: real[f]=n
print('файлов:', len(real), ' вхождений:', sum(real.values()))
PY
Что уже усвоено на первых трёх файлах
локальный char[] вместо глобального — не решение: half_chop копирует остаток с оглядкой на kMaxStringLength, а one_argument длину не проверяет вовсе. Нужен std::string;
строковый разбор аргументов уже есть — utils::ExtractFirstArgument, не надо писать свой;
при переносе с half_chop помнить про регистр: тот понижал, ExtractFirstArgument — нет;
ширину колонки добирать внутри цветовых кодов, иначе семь невидимых символов съедают её;
в каждом разобранном файле пока находился настоящий баг («кто боги», пропавшее сообщение в setall, ширина в кто -s) — значит, смотреть надо на смысл кода, а не только на замену буферов.
Слой 1 из #3807 — вынести глобальные буферы
buf,buf1,buf2,arg,smallBuf(utils.h:638) из кода. Ниже — что остаётся после первых трёх файлов (#3813).Сколько осталось
Считано без комментариев и без файлов, где переменная с таким именем объявлена локально:
258 файлов, 5323 обращения. Тремя разобранными файлами снято 190 — 3,5%.
engine/ui— команды игрока и боговgameplay/mechanicsengine/olcengine/scriptinggameplay/skillsgameplay/economicsengine/coregameplay/communicationadministration/punishments.cppgameplay/clansgameplay/craftinggameplay/fightТяжеловесы
engine/scripting/dg_scripts.cppengine/ui/cmd_god/do_stat.cppengine/olc/oedit.cppengine/olc/medit.cppgameplay/mechanics/obj_sets_olc.cppgameplay/mechanics/identify.cppengine/olc/zedit.cppengine/ui/cmd/do_score.cppengine/olc/redit.cppengine/ui/cmd_god/do_show.cppadministration/punishments.cppgameplay/clans/house.cppgameplay/mechanics/named_stuff.cppСамое выгодное
162 файла содержат от одного до двенадцати обращений — суммарно 817. Каждый закрывается за один заход и навсегда уходит из списка. Часть — вообще холостые: в
do_kill.cpp,bash.cpp,manadrain.cppглобальныйargиспользуется один раз как временное хранилище подone_argument, и заменяется локальной строкой.Предлагаемый порядок (когда дойдут руки)
gameplay/skills: 201 вхождение больше чем в двадцати файлах, правка механическая, риск близок к нулю.do_score(137),do_give,do_drop. Там вывод, и попутно всплывают такие же баги, как «кто боги» и ширина колонки в refactor: слой 1 -- "кто", setall и разбор аргументов (#3807) #3813.punishments.cpp(98) — один файл, целиком про сообщения богов.do_stat.Признак, что слой закончен: из
utils.hможно удалить пятьextern char.Чем мерить
Что уже усвоено на первых трёх файлах
char[]вместо глобального — не решение:half_chopкопирует остаток с оглядкой наkMaxStringLength, аone_argumentдлину не проверяет вовсе. Нуженstd::string;utils::ExtractFirstArgument, не надо писать свой;half_chopпомнить про регистр: тот понижал,ExtractFirstArgument— нет;setall, ширина вкто -s) — значит, смотреть надо на смысл кода, а не только на замену буферов.