
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.14.90] |
![]() |
|
Страницы: (7) « Первая ... 3 4 [5] 6 7 все ( Перейти к последнему сообщению ) |
![]() |
Сообщ.
#61
,
|
|
Как-то писал парсер HTML кода, в самой процедуре парсирования у меня есть несколько безусловных переходов.
Вот примерный код с этого парсера: ![]() ![]() Sub Parce(B() As Byte) Dim i As Integer Dim OpenQuote As Byte Dim Pos As Long Dim Buffer() As Byte ReDim Buffer(UBound(B)) For i = 0 To UBound(B) Select Case B(i) Case 34, 39 If OpenQuote <> B(i) Then GoTo CASE_ELSE OpenQuote = B(i) Case 60 Case 62 Case Else CASE_ELSE: Buffer(Pos) = B(i) Pos = Pos + 1 Next End Sub Т.е. суть, как перейти с одного ветвления select case в другой ??? Без нагрузки процессора лишними условиями! т.к. для парсера время критично. |
Сообщ.
#62
,
|
|
|
Эх, сейчас это разве goto - так, слабое подобие.
Вот раньше в Паскале действительно goto был всем gotoям goto! Это было круче, чем нынешний exception (удивляюсь, как его могли реализовать при тех компиляторах). ..Если кто помнит, можно было из функций делать переход вовне через любое число уровней, причем не только вперед, но и назад. Вот против такого goto тогда в основном и выступали.. поскольку продолжение выполнения безобидного x:=f(y) можно было ожидать на любой метке. |
Сообщ.
#63
,
|
|
|
Цитата Adil, 22.02.2006, 17:06:02, 1023927 a) Удобно читать - что означает "удобно отлаживать" и удобно "сопровождать". После того, как мне пришлось поучаствовать в паре проектов по отладке/сопровождению "чужого" кода, я ставлю это на первое место. Да и в своем коде, через пару лет после написания ... ой-ой-ой. б) оптимизировать выполнение кода (но только если это на самом деле необходимо - иначе - ассемблер в руки, или может в машинных кодах?) в) было удобно писАть. Если на а) стояло бы "оптимизировать выполнение кода" языки высокого уровня просто бы никогда не появились, про интерпретаторы я вообще молчу. удобство чтения - бред. как я уже говорил, я в любом коде легко разбираюсь, если он написан на знакомом мне языке и снабжён грамотными комментами, и я очень неуважаю так называемых "программистов", которые не то что свой код не умеют грамотно писать, а даже в готовом разобраться не могут. Свой код - проверял пару дней назад: читал свои сорцы 98 года... нашел несколько неудачных, на мой нынешний взгляд, решений, разобрался легко, несмотря даже на то, что ТОГДА мне вообще наср@ть было на структурность и ооп. Цитата Lucifer, 22.02.2006, 21:51:51, 1024160 Либо ты видиш этой смысловой нагрузки. Я говорю о языках, поддерживающие ООП, где функция длинной в два экрана - НОНСЕНС не хочу грубить, но ты заблуждаешься. если бы мне не было жалко трафика - дал бы пару сотен примеров функций длинной в два экрана и больше ![]() никакой ООП не в состоянии уменьшить код функции. насчёт ооп - большей тупости, чем "ООП ради ООП" даже представить не могу. всё хорошо в меру. я никогда не стану выделять что-то в объект, если с точки зрения логики оно не может быть ПРЕДСТАВЛЕНО объектом. не надо забывать, что ООП служит не для структурирования как такового, а для наглядного обозначения структуры и связей. Цитата Adil, 22.02.2006, 17:06:02, 1023927 Цитата BlackSnake, 22.02.06, 03:42 Что-то это как-то поверхностно звучит, точнее, не по-боюсь этого слова, - по-дилетански. Скорее "для 32-х разрядной ОС на 32-разрядном процессоре, для поддерживающего такой процессор компиляторе и то - не всегда ". Например, для той же win32 на 64-битном процессоре бывает оптимальнее использовать __int64... и то - не всегда ".(для Win32 это означает, что все переменные,какие удастся, описываются как Long. Это даёт до 7% прироста эффективности.), окажутся недостаточными) вин32 на проце64 - изврат. просто я писал не для дилетантов, а для понимающих людей... поэтому ПОДРАЗУМЕВАЕТСЯ, что речь идёт о 32х разрядной ОС, работающей на 32х разрядном процессоре, и само собой, речь о программе, скомпилированной 32х разрядным компилером. насчёт вин32 на 64-битном процессоре - непроверял и пока не собираюсь. года через два-три, не раньше. Итак, фанатам борьбы с GOTO - слив засчитан, т.к. аргументов не приведено. Цитата Adil, 22.02.2006, 17:06:02, 1023927 Закоренелые - остнуться, а "сомневающиеся" будут смотреть на аргументы. Единственным стОящим аргументом за goto было подмена break в switch, но Люцифер его опроверг одним мановением руки . Про удобство использования goto в функциях по 800 строк, принимая во внимание мой пункт а), я лучше по-молчу, чтоб не прослыть хамом. твой пункт а) во внимание принят быть не может, ибо ты защищаешь неграмотных. незачот. функции по 800 строк, если тебе доводилось писать проги хотябы в 50 000 строк, не кажутся большими. незачот. настоящий программер пишет так, как считает правильным в каждой конкретной ситуации. если надо использовать goto - то НАДО его использовать, а не тратить время, изобретая путь через ж-пу, зато без него. |
Сообщ.
#64
,
|
|
|
BlackSnake, а вы не с ЛОРа ли будете с такой безапелляционностью, самоуверенностью и лексикой?
|
Сообщ.
#65
,
|
|
|
Цитата BlackSnake, а вы не с ЛОРа ли будете с такой безапелляционностью, самоуверенностью и лексикой? Судя по холивара, он, наверное, с ВОРа -- windows.org.ru, буде такой появится. Недопрограммистов, пишущих функции по 800 строк, надо рефакторить на пилораме. Чтобы другим неповадно было. Почему? Чтобы такие команде день не портили, ежели им придется в нормальном коллективе работать. Цитата удобство чтения - бред. как я уже говорил, я в любом коде легко разбираюсь, если он написан на знакомом мне языке и снабжён грамотными комментами, и я очень неуважаю так называемых "программистов", которые не то что свой код не умеют грамотно писать, а даже в готовом разобраться не могут. Ради Аллаха, не требуй только с такой "гениальностью" повысить тебе зарплату, если хочешь остаться в живых при нормальном начальнике. Ибо твоя гениальность не гребет никого, если код пишет более одного человека. |
![]() |
Сообщ.
#66
,
|
|
Цитата SCINER @ ![]() ![]() Sub Parce(B() As Byte) Dim i As Integer Dim OpenQuote As Byte Dim Pos As Long Dim Buffer() As Byte ReDim Buffer(UBound(B)) For i = 0 To UBound(B) Select Case B(i) Case 34, 39 If OpenQuote <> B(i) Then GoTo CASE_ELSE OpenQuote = B(i) Case 60 Case 62 Case Else CASE_ELSE: Buffer(Pos) = B(i) Pos = Pos + 1 Next End Sub Т.е. суть, как перейти с одного ветвления select case в другой ??? Без нагрузки процессора лишними условиями! т.к. для парсера время критично. часть: ![]() ![]() Case 34, 39 If OpenQuote <> B(i) Then GoTo CASE_ELSE OpenQuote = B(i) в приведённом примере, ненужна, и вообще бессмысленна уж лучше в Case Else проверку на равенство выполнить Цитата а не тратить время, изобретая путь через ж-пу, зато без него goto ж0№а ![]() |
Сообщ.
#67
,
|
|
|
Цитата Gregory Petrosyan, 23.02.2006, 01:08:25, 1024283 BlackSnake, а вы не с ЛОРа ли будете с такой безапелляционностью, самоуверенностью и лексикой? нет. 1. безапелляционность??? наоборот, я - то сторонник свободного подхода... это некоторые граждане тут безапелляционно орут "goto плохо"... а я смотрю на проблему спокойно, хочу, буду юзать goto, нехочу - обойдусь без него... в каждом конкретном случае я рашаю "по месту"... (зы: просмотрев свои сорцы за последние месяцы, не нашёл ни одного goto. но это не значит, что "гото мастдай"...) 2. самоуверенность? отсутствует. есть совершенно нормальная (не чрезмерная) уверенность в себе. Я вовсе не считаю себя правым всегда и во всём, как, например, один человек с явно китайско-вьетнамским именем ![]() 3. лексика? что не так в моей лексике? Ho Im, я тебя уважаю, но ты совершенно невыносимый тип. Цитата Ho Im, 23.02.2006, 03:07:01, 1024332 Недопрограммистов, пишущих функции по 800 строк, надо рефакторить на пилораме. Чтобы другим неповадно было. Почему? Чтобы такие команде день не портили, ежели им придется в нормальном коллективе работать. Ho Im, почитай сорцы ядра твоей любимой ОСи, там и не такое есть. Реально, такие длинные функции для меня всё-таки не правило, а исключение, и применяю я их, как уже говорилось, только в маленьких проектах, ибо там в этом есть смысл. В больших - действительно, такие вещи применять смысла обычно нет. Цитата Ho Im, 23.02.2006, 03:07:01, 1024332 свой уровень, как программерский, так и IQ, я считаю средним (т.е. неглуп, но не гений Ради Аллаха, не требуй только с такой "гениальностью" повысить тебе зарплату, если хочешь остаться в живых при нормальном начальнике. Ибо твоя гениальность не гребет никого, если код пишет более одного человека. ![]() насчёт "повысить зарплату" - уже второй год, слава богу, не работодатель решает, хочет ли он меня нанять, а я решаю, хочу ли на него работать... Я работаю с командой, которая полностью разделяет мои взгляды, и ставит на первое место собственное удобство, а не абстрактные "правила" (это не означает нигелизма, просто отсутствие комплексов типа "goto юзать нельзя". если это экономит рантайм или объём - значит можно. Отдельно хочу добавить, что, возможно, столь спокойное отношение к goto происходит от наличия некоторого опыта работы с ассмом, что накладывает нокоторый отпечаток на стиль программинга.) |
Сообщ.
#68
,
|
|
|
Цитата ассмом Таки по Фрейду ![]() Я не знаю, очень ли ты внимательно читал сорцы ядра Linux, но там есть правило: если функция больше 50 строк, переписать так, чтобы было меньше, а если нельзя, то написать объяснительную с доказательством, что иначе не получится. Линус, тот самый Линус, которому на мнение Вирта плевать и который оправдывает goto, утверждает, что ему искренне влом разбираться с неструктурированным кодом. goto в коде ядра обычно стоят там, где сам по себе код устаканен (так, что рефакторить его наверняка не придется), и где остальные практики просто не имеют смысла. Тем более, у нас там задействовано системное программирование, оно осложнено несколько более другими понятиями. С другой стороны, перл и пхп позволяют выйти из цикла на любой уровень вложенности. С пхп, если мне предстоит писать гигантский switch, я его никогда не пишу, а вместо этого создаю много функций и вызываю их по табличке. Кстати, я когда-то тоже асмом баловался, так что понятие "таблица переходов" очень оказалось кстати. А это нам дает удобство тестирования (как хочешь, так юнит-тесты и дробишь), и удобство рефакторинга -- перестраивай вызовы функций как хочешь, а сами функции, если они работают как надо, рефакторить не надо вообще. Использование goto лишает напрочь код такой гибкости. |
![]() |
Сообщ.
#69
,
|
|
Цитата часть: ![]() ![]() Case 34, 39 If OpenQuote <> B(i) Then GoTo CASE_ELSE OpenQuote = B(i) в приведённом примере, ненужна, и вообще бессмысленна уж лучше в Case Else проверку на равенство выполнить 1. как ненужна ![]() если встретилась открывающая кавычка, тогда закрываем ее, иначе надо добавить в буфер параметра тега, а для этого чтобы не дублировать код необходимо переместиться на другую ветку Select Case'а 2. И как интересно выглядит проверка переменной OpenQuote в Select Case ? |
Сообщ.
#70
,
|
|
|
Кстати, некоторые языки поддерживают nested functions. Для них ИМХО goto не нужен. Пример:
![]() ![]() def f(): def g(): do_stuff def h(): do_some_other_stuff def cleanup(): perform_cleanup if a: if a1: g() elif a2: cleanup() elif b: if b1: h() elif b2: cleanup() else: cleanup() |
Сообщ.
#71
,
|
|
|
А так разве не проще?
![]() ![]() def f(): def g(): do stuff def h(): do other stuff def cleanup(): do cleanups if (a and a1): g() elif (b and b1): h() else: cleanup() |
Сообщ.
#72
,
|
|
|
a1, a2, b1, b2 -- вовсе не обязательно константы, кроме того, после elif a2 и до cleanup() вполне может идти ещё какой-то код, etc etc etc. Само собой, этот пример не несёт никакого _практичесого_ смысла, его единственная цель -- донести до людей идею о том, что при наличии nested functions значительная область применения goto переходит, вполне естественным образом, к этим самым вложенным функциям.
|
Сообщ.
#73
,
|
|
|
Цитата a1, a2, b1, b2 -- вовсе не обязательно константы Это не имеет значения. Можешь убедиться, что для всех возможных значений a* и b* функции выполняют одинаковое действие. Кстати о топике. Еще я вижу смысл в goto в том случае, если интерпретатор не имеет понятия о хвостовых вызовах, а "наглядная" в таких случаях рекурсия отъедает слишком много памяти. Тогда метка в самом начале функции и понеслась... |
Сообщ.
#74
,
|
|
|
Решил сутра почитать какой-нить холивар, позабавило)
А теперь немного по теме: - убили функции по 800 строк - сам использовал goto только для выхода из большого кол-ва вложенных циклов, сейчас в основном на java пишу, где goto слово, конечно, зарезервированное, но благо не компилящееся. Ибо сделали нормальный способ эти циклы покинуть. - тут приводился пример case и говорилось, почему же не заменить break на goto + label, это какое-то программирование недовысокого уровня получается. Ведь вроде бы защитники goto кричали, про убогость неиспользование всех возможностей языка. К тому ж если так тяготеете к безусловным переходом и расшифровкой того, что было выделено в отдельный оператор (как continue, break, etc.), пишите на асме, вам никто слово не скажет. ![]() |
Сообщ.
#75
,
|
|
|
Цитата Kheor, 24.02.2006, 11:00:52, 1025261 в time-critical функциях это ОЧЕНЬ оправдано, т.к. вызов функции (даже из этого проекта) занимает достаточно много времени. Ещё такие вещи оправданы в пхп-скриптах, когда необходимо всю функциональность разместить в одном файле.- убили функции по 800 строк Цитата Kheor, 24.02.2006, 11:00:52, 1025261 - тут приводился пример case и говорилось, почему же не заменить break на goto + label, это какое-то программирование недовысокого уровня получается. речь шла не о том, чтоб так писАть, а о том, что с с точки зрения компилера это АБСОЛЮТНО идентичные вещи, просто написанные разными буквами. Цитата Kheor, 24.02.2006, 11:00:52, 1025261 ну, я никогда не стану пользоваться какой-то возможностью языка, просто потому, что она есть, если она мне не нужна Ведь вроде бы защитники goto кричали, про убогость неиспользование всех возможностей языка. ![]() |