Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Компактность и красота кода |
Автор: drZmeu 5.2.2007, 13:17 |
Есть вопрос… Точнее даже предложение скидывать в этой теме свои примеры: Что имеется в виду: А имеется в виду преобразование допусти ERROR в 0xBAD или DWORD ver = MAKEWORD(2,2); WSAStartup(ver,&wsa); В: WSAStartup(0x0202,&wsa); |
Автор: bilbobagginz 5.2.2007, 13:21 | ||
DWORD ver = MEKAWORD(2,2); ты наверное имел в виду:
и что-же по-твоему красивее и компактнее ? |
Автор: Kuvaldis 5.2.2007, 13:30 |
ИМХО, по теме есть хорошая книжка Керниган, Пайк "Практика программирования" |
Автор: drZmeu 5.2.2007, 13:51 |
Я имел в виду замену DWORD ver = MAKEWORD(2,2); на 0x0202 ... |
Автор: Vyacheslav 5.2.2007, 15:07 | ||||
это типа, что красиввее
или
? ![]() |
Автор: V.A.KeRneL 5.2.2007, 22:37 |
Имхо, дело вкуса. А больше контекста (кода, в котором находится строчка/строки). Главное, в общем случае, чтобы было максимально понятно и прозрачно именно в данном конкретном случае. |
Автор: drZmeu 5.2.2007, 22:52 |
V.A.KeRneL -> Я с тобой полностью согласен ![]() |
Автор: EvgenZ 5.2.2007, 23:01 | ||||
Дяденька Дьюхэрст.
что эквивалентно:
|
Автор: Sartorius 5.2.2007, 23:05 | ||
Читать такое невозможно, а код порождается ИМХО такой же как в if-ах |
Автор: Fixin 5.2.2007, 23:17 |
Получение максимально короткого, правильного и быстрого кода - все это оптимизация, которая, в конечном счете в любом случае необходима, т. к. конечного пользователя всегда интересует производительность. |
Автор: zkv 5.2.2007, 23:42 | ||
ни с кем не спорю, просто интересный, на мой взгляд, пример:
как считаете, насколько красиво варьировать значение константы при инициализации? Мне кажется, что это может лишь запутать код, интересно зачем тогда оставлена такая возможность? Побочный эффект? |
Автор: nickless 6.2.2007, 00:49 | ||
Дурное дело нехитрое... ![]() Хотя с другой стороны, может я хочу иметь случайное число, которое генерируется во время старта и не должно изменяться после этого? Константы вообще константны тем, что их нельзя изменить после инициализации, а как их инициализируют, это дело программиста. |
Автор: bilbobagginz 6.2.2007, 01:04 | ||
я могу сказать в соторону MAKEWORD(2,2), а не в сторону 0х202 что она читабельнее, и независима от платформы, т.е. более переносима. ( если оставим факт, что MAKEWORD - макро из винды ) даже более, я бы сделал вообще так:
вот. читабельность в 99% важнее, чем мнимая оптимальность кода на высоком языке - как Си/Си++, так как компилятор занимается оптимизацией кода. Ессно, что алгоритмически должна быть оптимальность, но не в таком направлении как здесь: и читабельный и нечитабельный код соберутся в идентичный бинарник, поэтому нет смысла код запутывать ( а потом через пару лет шаманить с бубном, пытаясь понять его ) вот вам мои 5 коп. |
Автор: Voldemar2004 6.2.2007, 12:55 | ||
|
Автор: bilbobagginz 6.2.2007, 13:13 | ||
не совсем понимаю о чем вы. Если я вас правильно понимаю, всё что написано в файлах, которые скармливают компилятору - и макро и процедуры и т.д. - это всё "код", и не важно подменяется ли часть его препроцессором или нет, главное, чтобы в исходной форме он был понятен читателю ( да и писателю ![]() |
Автор: Vyacheslav 6.2.2007, 14:26 | ||||
О "красоте" конкретного примера ![]()
В данном случае выясняем, что делает MAKEWORD(2,2) и делаем это вместо него в уме. Результат подставляем в код
|
Автор: FelikZ 7.2.2007, 01:46 | ||
Я за:
|
Автор: bilbobagginz 7.2.2007, 02:04 | ||
Вячеслав. извините конечно, как говорится "the beauty is in the eye of the beholder", т.е. красота - в глазах узрившего. вы понимаете, что вы просто таким действием сказали Бьярну Страуструпу, что он полный страус ? что-то из серии: "Бьярн, вот скажите, ну на фига было придумывать препроцессоры, макро в Си++?" повторяю. когда вы работаете с 1 числом, которое нужно создать таким образом его можно запомнить, и чтить. а если таких скомпонованных чисел десятки или сотни ? для этого и придумали МАКРО. мейкворд создаёт слово, это к версии не относится, поэтому создаём надстройку: мейквершен. и тогда даже через 200 лет, если люди будут программировать, прочитая этот код, понятно, что данная строка: version=MAKEVERSION(2,3) как то создаёт число-версию. пока. |
Автор: skyboy 7.2.2007, 02:30 | ||||
эээ... если я правильно уловил суть, вы оба - за то, чтоб не делать работу за препроцессор, создавая более запутанный и непонятный код ![]() ![]()
никто не спорит. но добиваться скорости путем проделывания работы за препроцессор, замену умножения сдвигом и т.д. - это просто какая-то мания. или фобия. особенно, когда при этом массив на 1500 элементов сортируется "пузырьком" ![]() |
Автор: drZmeu 7.2.2007, 10:07 |
Sorry давайе не будем сорится ![]() Я несупер кодер на C++ но стараюсь стать лучше... Любые претензии в мой адрес выслушаю... мне интересно если я делаю так: DWORD ver=MAKEWORD(2,2); WSAStartup(ver,&wsa); то тут я ещё обьявляю переменную DWORD...] А если я делаю так WSAStartup(0x0202,&wsa); То тут мне не приходится обьявлять эту переменную... Код стаёт меньше... Но я незнаю что конкретно получится в .exe файле... Если логически посудить то получится что размер должен уменьшится ![]() |
Автор: Vyacheslav 7.2.2007, 14:06 | ||
Простите Вы топик от начала до конца прочитали? Что такое смайлики в курс?. Что понимается под "красотой" можете сообразить? ( в кавычках ) А если в курсе нефиг читать мне нотации. Я тут весь топик пытаюсь доказать, что такая замена никак не тянет на красивый код. Причем подробно разъясняю свою точку зрения. А Вы мне страусом грозите. "пока" |
Автор: Vyacheslav 7.2.2007, 14:22 | ||
Что же я считаю действительно красивым кодом, то Вы можете судить по данному фрагменту http://forum.vingrad.ru/index.php?showtopic=133613&view=findpost&p=1011551 Это решение мне понравилось, даже несмотря на то что я его автор ![]() Добавлено @ 14:28
И кстати, только счас обратил внимание. А Вы сами а Страступа читали? В смысле не последние, а первые редакции, где он прямо говорит об нежелательности использовать макросы в С++ ![]() |
Автор: SergeCpp 7.2.2007, 17:12 | ||||
Vyacheslav, main возвращает int, вообще-то Вот Ваш текст
А вот на такой текст мне смотреть приятнее
P.S. Исправил multiset<string> на multiset< string > (см. вопрос ниже). Прошу извинить за невнимательность. В рабочем коде (при многочисленных просматриваниях) я бы это непременно заметил и поправил. Неудобно тут писать ![]() ![]() |
Автор: Vyacheslav 7.2.2007, 17:45 |
Да. Это конечно очень серьезная ошибка, не спорю ![]() В смысле скопировать и через строчку? Да без разницы. Раз нравится - пишите через строчку. Вопрос не в том, как располагать, а в том что поставленная задача потребовала 5 строчек кода. |
Автор: skyboy 7.2.2007, 18:08 |
SergeCpp, скажи, а почему в отступов нет, а в каждый из двух типов обрамлен пробелами? я не прикапываюсь, просто интересно ![]() здесь ведь речь не об эффективности, а об эстетике, правда? а тут уже личные вкусы играют роль ![]() |
Автор: Любитель 7.2.2007, 19:04 | ||||||||
В плюсах по стандарту main может ничего не возвращать (хотя в сигнатуре пишется int) - подразумевается 0.
Ну тогда почему здесь перед звёздочкой нет пробела, а после есть? ![]() ![]()
drZmeu, разочарую тебя - уж столь отривиальные случаи компилер точно сведёт в одно. Оптимизатор в современном компиляторе - очень жестокая вещь. Он мжоет перевернуть код гораздо серьёзнй (без последствий логике). |
Автор: Rockie 7.2.2007, 19:24 | ||
+1 скорее "современные компиляторы добавят return 0, если такового не имеется" |
Автор: Любитель 7.2.2007, 19:26 |
Можно сказать точнее - "явно ничего не возвращать". |
Автор: Vyacheslav 8.2.2007, 11:25 | ||||
Ну тогда извините. Под красотой я прежде всего понимаю возможность максимальное использование возможностей языка, а не отступы, строчки - черезстрочки. Хотя для читабельности кода это играет далеко не второстепенную роль. И для меня одним из фрагментов, написанных на С++, который стразу приходят на ум когда говорят о красивом коде, является фрагмент из двух строчек, помещенных в предисловии Скотта Мейерса к книге Александреску "Современное проектировние на С++"
|
Автор: bilbobagginz 8.2.2007, 11:33 | ||
это я конечно загнул, для полного стирания кода из моей памяти нужно просто зкончить один проект, и перейти на другой. т.е. и пары месяцев хватает чтобы ПОЛНОСТЬЮ забыть что я там написал. |
Автор: SergeCpp 8.2.2007, 12:49 | ||
Вспомнилось... Занимался я как-то извлечением механизма обработки регулярных выражений из Perl'а... Увидел исходники... Брался несколько раз и откладывал... Потом как-то набрался мужества и осилил ![]() Столько там встретил интересного ![]() В общем, считай, заново переписал Ужас — одно слово. Просто — ужас Вот сейчас скачал версию 5.8.8 stable Полюбуйтесь на файл http://rsdn.ru/File/44396/regcomp.c Вот функция, имеющая отношение к оптимизации регулярного выражения... Ровно 1000 строк! Ну, чуть больше, просто в SciTE сейчас смотрю, свернул её "плюсиком", открывающая скобка на 674 строке, а следующая за свёрнутым блоком строка — 1674 ![]() Пусть Ларри Уоллу будет стыдно ![]()
А метка в конце — finish ![]() |
Автор: Sartorius 8.2.2007, 13:23 | ||
SergeCpp, чего-то я перехода на этот финиш тут не вижу ![]() ЗЫ Упс сорри . Наверно он здесь
Но вообще то действительно финиш ![]() |
Автор: comnimh 11.2.2007, 18:13 | ||||
Читаю ветку и сижу удивляюсь, как такая толпа сишников могла забыть про byte order. Ведь результат работы:
В винде это будет, как я понимаю (не знаю, как там работает MAKEWORD, сорри) 0x0203 (host order), а вот в той же FreeBSD уже будет 0x03020000 (в случае DWORD, в WORD будет 0x0302) (network order). И, уже говоря об оптимизации - зачем объявлять эту переменную DWORD и потом присваивать ей вывод MAKEWORD? Два байта лишних ![]() |
Автор: FelikZ 11.2.2007, 18:19 | ||
DWORD = unsigned long; sizeof(DWORD) = 4! |
Автор: comnimh 11.2.2007, 18:22 |
FelikZ, ну да. Все правильно. Размер DWORD - 4 байта, они пишут в него WORD, размер которого - два байта. Итого два байта лишних. |
Автор: bilbobagginz 11.2.2007, 18:27 |
comnimh, a как вы запишите версию вида: 3.21 ? |
Автор: FelikZ 11.2.2007, 18:28 | ||
comnimh, звеняй не так понел ![]()
когда можно просто подставить MAKEWORD(2,3) куда надо? |
Автор: comnimh 11.2.2007, 18:36 | ||
bilbobagginz, 3.21 влезет в WORD, если вы об этом. Если о byte order - то тогда - тест на это на этапе ./configure и соответствующие телодвижения при компиляции. А вообще, честно говоря, не понимаю, зачем хранить версию таким образом. Гораздо проще, на мой взгляд, сделать:
Добавлено @ 18:37 FelikZ, ну мало ли - не факт, что ты будешь один раз в программе использовать эту переменную. |
Автор: FiMa1 13.2.2007, 17:46 | ||
Ребята кто знает где взять? Давно ищу... |
Автор: Rockie 13.2.2007, 18:05 |
искать пробовал? Добавлено @ 18:07 http://www.google.md/search?hl=ru&q=%D0%9A%D0%B5%D1%80%D0%BD%D0%B8%D0%B3%D0%B0%D0%BD%2C+%D0%9F%D0%B0%D0%B9%D0%BA+%22%D0%9F%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D0%B0+%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%22%2C+%D1%81%D0%BA%D0%B0%D1%87%D0%B0%D1%82%D1%8C&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&lr= http://www.mini-soft.ru/book/tech_prog/index.php |