![]() |
|
|
![]()
|
|
||
|
|
| Chingachguk |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: нет Всего: 18 |
Ага. Тогда вот что я скажу. Пусть есть такая реализация:
Но гораздо элегантнее написать так:
Это сообщение отредактировал(а) Chingachguk - 16.1.2004, 10:14 -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
||||
|
|||||
| Secandr |
|
|||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: 2 Всего: 39 |
Chingachguk А если таких goto стоит куча и они посылают не только за пределы цикла,... Как такое читать?
|
|||
|
||||
| shedon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1209 Регистрация: 17.1.2003 Где: Нижнiй Новгородъ Репутация: нет Всего: 11 |
Я всегда делаю по первому примеру. -------------------- Programming is like sex: One mistake and you have to support it your lifetime |
|||
|
||||
| Deface |
|
|||
|
def ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2041 Регистрация: 22.11.2002 Где: г. Дубна, МО Репутация: нет Всего: 21 |
Не, если ГОТО много, то в программе разобраться нереально!
-------------------- Когда я умер, не было никого, кто бы это опроверг (с) |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: нет Всего: 232 |
Chingachguk, плагиатор !!!
-------------------- ![]() |
|||
|
||||
| oleg1973 |
|
|||
![]() asm fanat ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3283 Регистрация: 16.7.2003 Где: Italy Репутация: нет Всего: 34 |
да ладно нормальный оператор
-------------------- SST 465555 icq 200-512-712 |
|||
|
||||
| Chingachguk |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: нет Всего: 18 |
и
Ну так способов испортить код существует много ... Например, часто нажимая на insert+past... Фишка в том, что надо делать как лучше а не так, как учат профессора ;) -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
||||
|
|||||
| December |
|
|||
![]() Antitheorist ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4423 Регистрация: 14.8.2002 Где: Харьков Репутация: нет Всего: 57 |
Всё равно наличие Goto говорит о непродумманости алгоритма. Пусть я напишу больше букв в коде, но через месяц я пойму, что имел в виду, просматривая этот кусок. С гоуту буду разбираться на порядок дольше.
|
|||
|
||||
| DENNN |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
December, согласен. В школе долго не понимал чем плохо использование goto. В какой-то книге по GWBASIC прочитал: "уровень профессионализма программиста уменьшается с каждым использованием в програме оператора goto", и там же теорему о том, что "любой алгоритм, в котором применяется оператор безусловного перехода можно переписать не используя данный оператор". Стало обидно, попробовал - интересно, но вроде ничего особенного. Потом еще несколько раз "заставил" себя не пользоваться GOTO и понял что это действительно так - без goto алгоритм выходит намного лучше, а последующие модификации проги выполняются почти безболезненно. Все равно как ООП и линейное программирование - в больших проектах для внесения изменений приходиться "разрушать и перепланировать" часть кода.
P.S. Бейсиком к тому моменту уже давно не пользовалься. |
|||
|
||||
| Dov |
|
|||
![]() аСинизатор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1721 Регистрация: 10.5.2003 Где: Эрец-Исраэль Репутация: нет Всего: 88 |
Имхо, это извращение. Запивать бутылку пива ящиком водки.
Я бы сделал так:
-------------------- Тут вечности запах томительный, И свежие фрукты дешевые, А климат у нас – изумительный, И только соседи – #уевые. Игорь Губерман. |
|||
|
||||
| Chingachguk |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: нет Всего: 18 |
По поводу непродуманности и сопровождаемости.
Никто не грит, что нужно писать первое, что приходит в голову. Если посвятил достаточное количество усилий по разработке наилучшего варианта и в нем есть goto - оставть его. Если можешь написать лучше без него - кто же спорит. Сопровождение. Вроде как все согласны, что маленькие проекты ведешь один и тебе так удобнее и т.п., то можно. Если большие - то нельзя. 1. В больших проектах есть несколько уровней. Есть системные библиотеки, к примеру. Ее лучше написать один раз и навсегда верно. Если ее переделывают каждый день, то это скорее не системная библиотека, а ошибка проектирования. 2. Опять-таки к вопросу о качестве кода. Удачное проектирование подразумевает, что каждый пишет свой модуль и потом все сопрягают свои усилия. Если модуль правило N человек, где N>10, то, скорее всего, в фирме какая-то фигня с текучкой кадров. 3. Понятие "читабельный код". Нет никаких четких правил по его написанию. Мне, к примеру, неудобно читать вложенные циклы, условия в них, опять циклы в условях и т.д. с многочисленными отступами. В результате тело самого внутреннего цикла начинается где-то с 50-ой позиции или еще далее. Отлично ! Никому не интересные проверки лежат рядом, а вот то, что интересно для анализа, нифига не видно. Но формально все правильно написано. 4. Из пункта 3 следует и 4: есть неудобство чтения goto, а вот мне намного неудобнее читать неоптимальный код. Если программер писал "лишь бы работало", то просматривать кучи чужих кодов вообще мрак. Обычно я такое удаляю и делаю заново. Но это гемор. Гораздо больший, нежели раз матернуться на чужой goto и ... все понять с первого раза. 5. Из пункта 4 следует и 5: реальность. Мы про что говорим ? Про реальные проекты или про "идеальные" ? Если про реальные, то везде, где я работал, я в той или иной мере видел все "достоинства", которые я перечислил в п.п. 3 и 4. Это неизбежный недостаток коммерческого программирования, когда надо "быстрее, а там видно будет". В той или иной степени такие вещи писали разные программеры и среди них были и неплохие. Но... никогда в реальной коммерции не будет отлажен код на таком уровне, что самым большим недостатком будет наличие goto в коде. Ну а идеальные проекты пишутся на ... ассемблере ;) Потому, что иделаьные проекты не требуют переносимости - в идеальном проекте и машины одинаковые и архитектура - лучшие и не нужен си. Потому, что самый быстрый код и самый короткий код можно написать только на нем. Пример идеального проекта вы видели... в фильме "Терминатор" (1 часть). Код терминатора был написан на ассемблере ;) Ну а в ассемблере как бы нормально писать goto, просто там он именно в том виде, которым должен быть, а не в том, что реализован в языках HLL - условном. Респект, Dov ! Ты единственный, кто попробовал улучшить мой пример без goto.
Вообще-то обычно бывает именно так ;) Сначала "только по одной пива". Потом водки. Ну а потом нужно "залакировать"
Неплохо, неплохо. Не буду придираться. Но это пока не лучше моего варианта - по крайней мере, по скорости работы кода ;) Это сообщение отредактировал(а) Chingachguk - 17.1.2004, 21:06 -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
||||
|
|||||
| shedon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1209 Регистрация: 17.1.2003 Где: Нижнiй Новгородъ Репутация: нет Всего: 11 |
Я сейчас посмотрел, оказывается библиотека MFC во всю пользуется операторам goto.
Похоже её писали ламеры. -------------------- Programming is like sex: One mistake and you have to support it your lifetime |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: нет Всего: 232 |
У них там в основном везде одна метка (в конце функции), на которую идёт переход из разных точек функции -- типа такой глобальный Cleanup в конце функции, без которого не обойтись, и который если не выполнить (скажем, сделать "return FALSE" вместо "goto Cleanup") - выйдет некорректное действие. Например, когда выполняется очень сложная инициализация очень сложной структуры, с кучей сложных проверок и циклов - то любая ошибка при инициализации оставит кусок (ресурсы WinAPI, открытый файл, выделенную память и пр.), который нужно корректно вернуть системе. Имхо, всё это можно было бы реализовать и без goto, грамотно разделив каждый такой сложный процесс на подуровни (скажем, в виде отдельных функций). Но. Нигде в MFC и речи нету о повсеместных "прыжках взад-вперёд-налево"! То есть, M$ взращивает идею "мы против goto, но если без goto никак уже не обойтись (или сроки жмут) - тогда Ok, давайте вставим один-два оператора, но не более того". -------------------- ![]() |
|||
|
||||
| oleg1973 |
|
|||
![]() asm fanat ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3283 Регистрация: 16.7.2003 Где: Italy Репутация: нет Всего: 34 |
а ктонить сравнивал генерируемый код с гото и без а? поверьте господа есть разница
-------------------- SST 465555 icq 200-512-712 |
|||
|
||||
| Dov |
|
||||||
![]() аСинизатор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1721 Регистрация: 10.5.2003 Где: Эрец-Исраэль Репутация: нет Всего: 88 |
Chingachguk, ты не поверишь, но я предполагал, что рано или поздно встанет вопрос о скорости работы кода, хотя я, написав свой вариант, хотел показать, только, небольшую разницу в читабельности кода, так сказать, внешнее восприятие и не более того. Просто, я (уж не знаю, почему) не люблю не только goto, но и break'и с continue'ями и, по мере возможности, стараюсь их обходить, не очень-то задумываясь об этой самой скорости. Но, раз уж пошла такая тема, мне хотелось бы кое-что уточнить для себя. Давай возьмём твой код и мой код и посмотрим, что же у нас, на самом деле, происходит. Предположим, что CanIAnswerMyNameGood() изначально, т.е. до входа в первый цикл for равна FALSE. Вот твой код:
Что же произойдёт дальше? Давай посмотрим(пока мы при памяти). 1. Проверяем, есть ли ещё у нас пиво - Pivo > 0. // ЕСТЬ 2. Пьём бутылочку - DrinkOnePivo(true). // хотя не должны этого делать, так как уже - FALSE 3. Проверяем, есть ли ещё у нас водка - Vodka > 0. // ЕСТЬ 4. Пьём бутылочку - DrinkOneVodka(true). // хотя не должны этого делать, так как уже - FALSE 5. Проверяем, а не FALSE ли у нас - if ( !CanIAnswerMyNameGood() ). // FALSE 6. И, только сейчас, выходим из цикла - goto IsEnough. Вот мой код:
Посмотрим, что же здесь. 1. Проверяем - CanIAnswerMyNameGood() == TRUE ??? // нет, водку уже не проверяем, в цикл даже не заходим Вопрос: почему ты считаешь, что твой код быстрее? Даже при условии, что он будет работать корректно. -------------------- Тут вечности запах томительный, И свежие фрукты дешевые, А климат у нас – изумительный, И только соседи – #уевые. Игорь Губерман. |
||||||
|
|||||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Продвижение и оптимизация сайтов | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |