Здравствуйте, superlexx, Вы писали:
S>им просто надо было использовать __COUNTER__ вместо __LINE__ под MSVC. Сейчас навалял себе небольшой вспомогательный класс с __COUNTER__, очень понравилось. Практически получается C#-овский yield (не так же красиво, но всё-таки).
После этого код бы собирался? Это хорошо. Но все равно, он остался бы нечитаемым.
Здравствуйте, azzx, Вы писали:
A>А они точно кодогенерацию не применяют нигде? У меня бывают в СПЕЦИФИЧЕСКИХ случаях такие методы — но всегда в том или ином варианте используется кодогенерация, ибо я не идиот это ручками поддерживать. Так что вся "поддержка" такого кода заключается в изменении настроек кодогенератора ( и не важно что это — список вызовов макросов в
отдельном файле, Excel-таблица с макросами на VBA или действительно специально написанная программа).
Если бы там была кодо-генерация, то вопросов бы не было. Но тогда к исходникам надо прилагать скрипт из которого эти функции генерятся. Этого там нет. Следовательно, это не кодогенерация. Кроме того, там форматирование съехавшее. Такое обычно бывает при ручном написании кода.
Здравствуйте, Константин Л., Вы писали:
КЛ>Здравствуйте, Lonely Dog, Вы писали:
КЛ>[]
КЛ>имею дело с thunderbird. резюме — дерьмо. методы на 1500 строк в порядке вещей. свичи на 1500 строк в порядке вещей. написано просто грязно. как это работает я не представляю.
ну, мне как пользователю он очень нравицца особенно если вспомнить что запускается мгновенно, а The Bat! минуту шуршит.
Здравствуйте, Lonely Dog, Вы писали:
RO>>If one calls nextMove() repeatedly, one would get something like RRRDRRURRRRRRRRDRURR... (the return value depends on the place where the function returned the previous time). LD>Неужели этого нельзя добиться менее грязным способом?
Это была задачка с топкодера. Нужно управлять буром, который добывает минералы по мотивам флеш-игры «Motherload». Нужно сделать функцию наподобие char move(Field), т. е., они тебе информацию о ближайших видимых ячейках (которые содержат (или не содержат) полезные ископаемые), а ты им 'U', 'D', 'L' или 'R'.
Вот ты уже принял решение: нужно опуститься на глубину 42 единицы, т. е., ближайшие 42 раза нужно возвращать 'D'. Как бы ты это сделал?
Здравствуйте, OCTAGRAM, Вы писали:
>> C>Нормально его поддерживают. Я вот Putty на GTK2 под Линукс помог >> перенести, сейчас пакет делаю (https://launchpad.net/putty2). >> А зачем он там нужен? Чем он лучше, чем сочетание вашего любимого >> эмулятора терминала с комманд-лайновым ssh клиентом? OCT>В команд–лайновом нужно помнить esc-последовательности, чтобы порты OCT>форвардить. Ты вот их помнишь?
Нажми «~?», будет тебе хелп, нажми «~C» и набери «help», будет тебе хелп по командной строке.
Лично я, впрочем, использую исключительно /usr/bin/ssh. Если требуется -L, то лучше для этого завести отдельный ssh -fNT (и ControlMaster auto в ssh_config). А EscapeChar у меня всё равно отключен.
Консольный ssh чем хорош — во-первых, есть автодополнение хостов, во-вторых, можно работать в одном окне вперемежку с разными машинами, в-третьих, можно просто выполнять команды по одной (ssh servercommand).
Чего не хватает, и, насколько я знаю, в PuTTY этого тоже нет — чтобы ssh-agent (Pageant) задавал вопрос при попытке аутентификации через ForwardAgent. Иначе root системы, куда я логинюсь, может свободно пользоваться моим агентом. Ключ не узнает, но изменить PATH и положить затрояненную sudo сможет.
Здравствуйте, Roman Odaisky, Вы писали:
RO>Это была задачка с топкодера. Нужно управлять буром, который добывает минералы по мотивам флеш-игры «Motherload». Нужно сделать функцию наподобие char move(Field), т. е., они тебе информацию о ближайших видимых ячейках (которые содержат (или не содержат) полезные ископаемые), а ты им 'U', 'D', 'L' или 'R'.
RO>Вот ты уже принял решение: нужно опуститься на глубину 42 единицы, т. е., ближайшие 42 раза нужно возвращать 'D'. Как бы ты это сделал?
Я бы сделал вариацию на тему:
queue<char> m_vNextMoves;
char GetCharFromNextMoves()
{
char chRet = -1;
if (m_vNextMoves.size())
{
chRet = m_vNextMoves.front();
m_vNextMoves.pop();
}
return chRet;
}
public:
char move(int iField)
{
if (m_vNextMoves.size())
return GetCharFromNextMoves();
..........
for (int i = 0; i < 42; i++)
{
m_vNextMoves.push('D');
}
return (GetCharFromNextMoves());
............
}
Ну там естественно от задачи все зависит, может вообще рекурсивно в каждой ячейке смотрел бы куда идти. Может и развернул бы эту рекурсию в цикл. В общем, обойти можно по разному, но только не таким извратом.
Кстати, расскажите, чем конкретно эти дикие define лучше кода выше? По читаемости и сопровождаемости, ИМХО, этот лучше.
Но может меня тут переубедят и я проникнусь и так же писать начну...
Simon Tatham (born May 3, 1977) is an English programmer known primarily for creating and maintaining PuTTY,
Implementations for C
Several attempts have been made, with varying degrees of success, to implement coroutines in C with combinations of subroutines and macros. Simon Tatham's contribution[8] is a good example of the genre, and his own comments provide a good evaluation of the limitations of this approach. The use of such a device truly can improve the writability, readability and maintainability of a piece of code, but is likely to prove controversial. In Tatham's words: "Of course, this trick violates every coding standard in the book... [but] any coding standard which insists on syntactic clarity at the expense of algorithmic clarity should be rewritten. If your employer fires you for using this trick, tell them that repeatedly as the security staff drag you out of the building."
Здравствуйте, max779, Вы писали:
M>Ну там естественно от задачи все зависит, может вообще рекурсивно в каждой ячейке смотрел бы куда идти. Может и развернул бы эту рекурсию в цикл. В общем, обойти можно по разному, но только не таким извратом. M>Кстати, расскажите, чем конкретно эти дикие define лучше кода выше? По читаемости и сопровождаемости, ИМХО, этот лучше. M>Но может меня тут переубедят и я проникнусь и так же писать начну...
Алгоритм понимать необязательно, но обрати внимание, как часто вызывается YIELD. С точки зрения программирования, YIELD магическим образом обновляет состояние класса и продолжает выполнение (а на самом деле там return, после которого функция вызывается еще раз с обновленными параметрами).
Заодно здесь хорошо виден недостаток этого подхода — приходится объявлять переменные заранее.
И еще здесь есть «if(false\n||», но это из другого флейма :-)
А вот кусок решения этой же задачи участником, который занял второе место. Ты уверен, что так лучше?
Здравствуйте, Константин Л., Вы писали:
КЛ>Здравствуйте, squid, Вы писали:
КЛ>[]
S>>ну, мне как пользователю он очень нравицца особенно если вспомнить что запускается мгновенно, а The Bat! минуту шуршит.
КЛ>мне тоже, поэтому я и удивляюсь, как _это_ работает
вывод — если хорошо работает и все нравицца — нефиг смотреть как оно сделано
Здравствуйте, Maxim S. Shatskih, Вы писали:
LD>>Мне интересно, весь open-source написан так же или это мне так повезло?
MSS>Примерно так.
LD>>Как при таком качестве кода они умудряются что-то разумное делать?
MSS>Видимо, высокое качество исходного кода не особо и нужно
Я думаю, что качество закрытого кода мегатонн всякого фри- и шароварного барахла немного ниже. Просто этого никто не видит.
Детский сад! У нас на работе есть магическая мега-функция оставленная нам "демиургами", её длинна на данный момент ~1800строк, она набита свичами и goto, причём можно ивдеть и такие вещи как:
case тра-ля-ля:
goto три рубля
break;
case тра-ля-ля:
goto три рубля
Как параметр эта функция принимает структуру, объявление которой занимает ~200 строк, что составляет примерно 150 параметров, примерно 1/3 которых некоментированы, и не имеют вменяемых названий...
И наконец эта функция вызывается ресурсивно...
Ну Хто ещё чем похвастает?
---=== С наилучшими пожеланиями, Phoenics ===--- _
Я это всё к чему? К тому что дело тут не в том Open Source у нас или нет. Дело в программистах, но и не только в них.
Треша везде хватает, и к сожалению для его появления иногда бывают объективные (хотя чаще и субьективные) причины. Например я в своём опенсорсном проекте стараюсь всё содержать в чистоте.
Но в опенсорсе этот нерпиглядный код всегда навиду, из-за чего может сложится впечатление что оно всегда так, а в комерческих продуктах всё зашибись. Нет, я думаю я далеко не единсвтенный кто может привести примеры совершенно неоправданного мегатреша в успешном комерческом продукте.
---=== С наилучшими пожеланиями, Phoenics ===--- _
Здравствуйте, Roman Odaisky, Вы писали:
RO>Алгоритм понимать необязательно, но обрати внимание, как часто вызывается YIELD. С точки зрения программирования, YIELD магическим образом обновляет состояние класса и продолжает выполнение (а на самом деле там return, после которого функция вызывается еще раз с обновленными параметрами).
Вот именно, что магическим образом обновляет... Я больше чем уверен, что это все можно было переписать просто рекурсией.
Второй вариант явно лучше только потому, что там нет этих магических обновлений. Правда там тоже перестарался, видимо разворачивал рекурсию в цикл. И явно этот код можно было написать лучше.
В общем, меня не убедили. А основной косяк этого подхода вот в чем: вот ты пишешь программу и пользуешься этими магическими YIELD и т.д. Потом ты увольняешься, на твое место приходит другой кодер и он не знаком с этим делом... Он конечно познакомится рано или поздно и перепишет весь твой код без этих макросов. И только потому что, чтобы хранить в уме эти магические обновления и переходы надо намного больше усилий... В общем, его мнение о тебе будет таким же как у Lonely Dog об open source.
Помните: программы пишутся для человека, а не для машины. Машина разберется в любых goto, а вот у человека голова опухнет...
Здравствуйте, Константин Л., Вы писали:
КЛ>Здравствуйте, squid, Вы писали:
КЛ>[]
S>>вывод — если хорошо работает и все нравицца — нефиг смотреть как оно сделано
КЛ>мне туда лазить приходится. и при любой такой необходимости к каждому члену нашей команды приходит депрессия
всякое бывает. судя по этому форуму (за последний месяц) плохие вещи принято писать на Дельфи а не на Сях.
вообще я реально люблю Thuderbird и на дух не переношу Firefox. как раз потому что птичка летает а лиса тормозит
Здравствуйте, Sergey, Вы писали:
S>squid пишет:
>> вообще я реально люблю Thuderbird и на дух не переношу Firefox. как раз >> потому что птичка летает а лиса тормозит
S>Странно, а мне наоборот показалось Особенно на ньюсах — тормознее S>птички я ни одной ньюсочиталки не видел.