|
Теорема Бома — Якопини реалистична? или снова про goto | ☑ | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0
MatrosoV AleXXXand_R
28.06.11
✎
15:32
|
Теорема Бома — Якопини — утверждение о структурном программировании, согласно которому любой исполняемый алгоритм может быть преобразован к структурированному виду, то есть такому виду, когда ход его выполнения определяется только при помощи трёх структур управления: последовательностей (sequence), ветвлений (selection) и повторов (repetition).
Теорема была сформулирована и доказана итальянскими математиками Коррадо Бомом (англ. Corrado Böhm) и Джузеппе Якопини (Giuseppe Jacopini) в их статье 1966 года[1]. В статье также описывались методы преобразования неструктурированных алгоритмов в структурированные. Публикация теоремы была толчком к началу дебатов о структурном программировании. Спустя 2 года вышла статья Эдсгера Дейкстры «Go To Statement Considered Harmful»[2], в которой он критиковал использование оператора GOTO и высказывался в пользу улучшения стиля программного кода за счёт использования структур управления и отказа от других инструкций, управляющих ходом алгоритма. wiki:Теорема_Бома_—_Якопини А как вы считаете - можно ли обойтись в программировании без GOTO (Перейти)? И считается ли плохим стилем программирования его использование или нет? |
|||||||||||||
429
Волшебник
07.07.11
✎
11:09
|
(427) Так лучше:
Если ЭтоВася или ЭтоФедя или (ЭтоСтепа и СтепаСогласен()) Тогда |
|||||||||||||
430
МастерВопросов
07.07.11
✎
11:10
|
(427)(429) нифига себе! Заводить отдельную функцию "СтепаСогласен()", в которой еще громоздить кучу кода это вы считаете улучшением читабельности?
|
|||||||||||||
431
extrim-style
07.07.11
✎
11:17
|
обойдусь без GOTOв
Да, GOTO - нельзя использовать |
|||||||||||||
432
IKSparrow
07.07.11
✎
11:42
|
Если ЭтоВася() = Истина Тогда
Перейти ЭтоВася КонецЕсли; Если ЭтоВася() = Ложь Тогда Перейти ЭтоНеВася; КонецЕсли; Лучше использовать, чем чаще, тем лучше |
|||||||||||||
433
Ненавижу 1С
гуру
07.07.11
✎
11:44
|
(430) не надо ничего заводить, это метакод, замени ее своим Вопрос()
|
|||||||||||||
434
vs84
07.07.11
✎
11:57
|
Во всем нужно руководствоваться здравым смыслом, а не догмами.
Другое |
|||||||||||||
435
МастерВопросов
07.07.11
✎
12:00
|
(433) я пробовал так:
"Если (СокрЛП(глПользователь.Код)="0003") И (Вопрос("Стёпа, хочешь это сделать прямо сейчас?",4)=6) Тогда" Вопрос у каждого юзера вылазит. |
|||||||||||||
436
Ненавижу 1С
гуру
07.07.11
✎
12:07
|
(435) в 8-ке нет ))
|
|||||||||||||
437
Rabbit
07.07.11
✎
12:10
|
(425) можно ввести цикл с параметром и брякать его
|
|||||||||||||
438
Fragster
гуру
07.07.11
✎
12:12
|
Если НужноЧтотоДелать() Тогда
// что-то делаем КонецЕсли; и весь свой овнокод в функцию локализовать, чтобы человека, который потом это будет читать - сразу на клавиатуру не вырвало |
|||||||||||||
439
Reset
07.07.11
✎
12:58
|
В (425) не пример использования goto, а пример неумения построить стройные логические конструкции. Каша после такого программиста будет равно нечитаемой как с goto, так и без.
|
|||||||||||||
440
МастерВопросов
07.07.11
✎
13:01
|
(437)(438) вот меня как раз уже тошнит от ваших бесконечных функций и прыганий по ним, а от шедевра:
Для НомерИтерации=1 П 2 Цикл Если НомерИтерации=1 Тогда ... иначе ... КонецЕсли КонецЦикла материться хочется |
|||||||||||||
441
Rabbit
07.07.11
✎
13:04
|
(440) чо?... а что это у тебя?
|
|||||||||||||
442
МастерВопросов
07.07.11
✎
13:04
|
(439) Задача озвучена.
Твоё стройное решение в студию... З.Ы.: Обязательным условиям является повышенная читабельность кода |
|||||||||||||
443
fisher
07.07.11
✎
13:07
|
(435) Не понял. А в исходном коде почему тогда не вылазит? Всех троих Стёпой обзывать должно.
|
|||||||||||||
444
Rabbit
07.07.11
✎
13:11
|
(440)
Пользователи = "0001,0002,0003"; Если Найти(Пользователи,СокрЛП(глПользователь.Код))>0 Тогда Для БудетПрерывание=1 По 1 Цикл // сразу говорит о прерывании Если (СокрЛП(глПользователь.Код)="0003") И (Вопрос("Стёпа, хочешь это сделать прямо сейчас?",4)<>6 Тогда) Тогда Прервать; КонецЕсли; //начало неких действий //... //конец неких действий КонецЦикла; КонецЕсли; |
|||||||||||||
445
vudo
07.07.11
✎
13:13
|
Использовал метки в обработке подключения торгового оборудования. Связано было с тем, что касса свои порты опрашивает в цикле, и если ВК не попадала, то связь не получалась... Также могла отвалится по тайм-ауту и приходилось переподключаться. Метки позволили избежать многократного повторения отдельных участков кода. Я просто накручивал счетчик ошибок и перемещался к нужной метке для следующего процесса подключения. Код стал прост и понятен, несмотря на использования меток, а было черт ногу сломит!
Использовать можно, но в крайнем случае |
|||||||||||||
446
Reset
07.07.11
✎
13:14
|
(442) лол
СтепаСогласен=Истина; ВходитВСписокТрех=СписокТрех.НайтиПоЗначению(текПользователь); // или как там будет задано правило. Если ВходитВСписокТрех тогда Если текПользователь=Степа тогда СтепаСогласен=Вопрос(блабла); КонецЕсли; КонецЕсли; Если ВходитВСписокТрех И СтепаСогласен тогда /// КонецЕсли; |
|||||||||||||
447
proger2011
07.07.11
✎
13:15
|
Вирите нет? Всю жизнь обхожусь без меток, прервать и продолжить как учили. Когда ваяю код в мысли даже не приходят варианты с этими опереторами.
Да, GOTO - нельзя использовать |
|||||||||||||
448
smaharbA
07.07.11
✎
13:15
|
пингвинофилы есть в ветке ?
|
|||||||||||||
449
smaharbA
07.07.11
✎
13:17
|
именно так
Лучше использовать, чем чаще, тем лучше |
|||||||||||||
450
Rabbit
07.07.11
✎
13:19
|
(446) какой Стёпа на всё согласный))
|
|||||||||||||
451
Reset
07.07.11
✎
13:20
|
Не помню, отвечал или нет на голосовалку.
При реальной необходимости использовать можно. Но это возникает чрезвычайно редко. Совершенно не помню, когда использовал последний раз, наверное в школе на gw basic (это было Очень давно :) ). Использовать можно, но в крайнем случае |
|||||||||||||
452
Reset
07.07.11
✎
13:21
|
(450) Ну да, получается, в отсутcnвие Степы считаем его согласным на все по дефолту :D
|
|||||||||||||
453
alxxsssar
07.07.11
✎
13:40
|
(451) Точно. Я за 10 лет работы с 1с только 2 или 3 раза пользовал и то можно было обойтись, но код громоздкий получался
|
|||||||||||||
454
Torquader
07.07.11
✎
13:49
|
Если рассматривать язык 1С как язык программирования, то в нём без Goto приходится сильно извращаться, так как:
- Нет стандартного цикла Do {Тело} Loop While {Условие}, а писать While 1=1 ещё более глупо, чем Goto. - Нет возможности выхода сразу из нескольких циклов. Приходится или писать Goto за пределы цикла (что очень неудобно из-за необходимости вводить метки и задавать им имена) или выносить циклы в отдельную процедуру, чтобы использовать Return (что тоже не всегда удобно и сильно усложняет читаемость). - Возможность повторения кода с начала после устранения ошибки. Тут или Goto или "вечный цикл" и Continue (не знаю, но применение Goto выглядит более понятным, чем цикл). Поэтому, если и используется Goto, то нужно писать комментарий, чтобы было понятно, где у нас находится метка. Использовать можно, но в крайнем случае |
|||||||||||||
455
Fragster
гуру
07.07.11
✎
13:51
|
(454) все реализуется подпрограммами
|
|||||||||||||
456
Rabbit
07.07.11
✎
13:53
|
(455) не всегда наглядно
|
|||||||||||||
457
Найч
07.07.11
✎
13:58
|
а что такое GoTo ? =)
|
|||||||||||||
458
Fragster
гуру
07.07.11
✎
13:58
|
(456) это да. но у меня, например, при массовом перепроведении и блокировках используется конструкция
Для СчПопыток = 1 по МаксимумПопыток Цикл Попытка // действия Прервать; Исключение Если НеОшибкаБлокировки(ОписаниеОшибки()) Тогда Прервать; КонецЕсли; глПауза(20); КонецПопытки; КонецЦикла; |
|||||||||||||
459
Fragster
гуру
07.07.11
✎
13:59
|
фигово, но с метками - хуже
|
|||||||||||||
460
Torquader
07.07.11
✎
13:59
|
(455) Иногда для понимания алгоритма проще, чтобы был один текст, который занимает два-три экрана, чем пять-шесть экранов процедур, в которые приходится передавать кучу параметров.
|
|||||||||||||
461
Torquader
07.07.11
✎
14:01
|
(459) А если понадобится внутри алгоритма повторить выполнение его сначала (например, поменяли условие), то цикл будет выглядеть ещё более непонятно (особенно, если выход нужно сделать из вложенного цикла) - с метками проще, чем заводить всякие флаги завершения или переключения режима обработки.
|
|||||||||||||
462
Fragster
гуру
07.07.11
✎
14:04
|
(461) в (459) и есть "повторение алгоритма сначала"
|
|||||||||||||
463
Fragster
гуру
07.07.11
✎
14:07
|
меня бесит только отсутствие конструкции ОбработкаПрерыванияПользователя("ЧтоВыполнятьВСлучаеПрерывания"). ну и лямбда фукнкций вместо "выполнить()"
|
|||||||||||||
464
МастерВопросов
07.07.11
✎
14:07
|
(460) Воооот! Истину глаголишь!
+мульон и всё такое прыгание по функциям и процедурам весьма весьма за... особо когда один и тот же параметр стописят раз переименовывется от функции к функции |
|||||||||||||
465
Fragster
гуру
07.07.11
✎
14:08
|
(464) а ты не переименовывай
|
|||||||||||||
466
Torquader
07.07.11
✎
14:08
|
В (459) Нет вложенных циклов.
Например: // Начало алгоритма While 1=1 Do // исполняем предварительную часть DoPart1(); // Исполняем какой-то цикл ContinueFlag=0; For i=1 To 10 Do // что-то выполняем DoPart2(); If RepeatCondition()=1 Then // здесь предполагается переход на начало // то есть проще было бы написать Goto ~НачалоИсполнения; ContinueFlag=1; Break; EndIf; EndDo; If ContinueFlag=1 Then Continue;EndIf; EndDo; |
|||||||||||||
467
Torquader
07.07.11
✎
14:10
|
(465) Основная проблема в скорости исполнения, если при каждом вызове функции мы передаём три-четыре параметра.
Хотя, при достаточном умении можно и вложенные циклы в один загнать. |
|||||||||||||
468
GoldenDawn
07.07.11
✎
14:10
|
наверное когда просят примеры кода прислать они не только сами кодить не умеют на 1С но ещё и ищут GOTO
всё так серьёзно с этим GOTO |
|||||||||||||
469
Fragster
гуру
07.07.11
✎
14:11
|
(466) херня какая-то написана. зачем там флаг - непонятно
|
|||||||||||||
470
Torquader
07.07.11
✎
14:12
|
(469) А как перейти к началу, если мы находимся во внутреннем цикле ?
|
|||||||||||||
471
Fragster
гуру
07.07.11
✎
14:13
|
(470) я так понял, что после If ContinueFlag=1 Then Continue;EndIf; ты забыл написать, что там типа еще код есть
|
|||||||||||||
472
proger2011
07.07.11
✎
14:14
|
(470) Пересмотреть алгоритм, сделать по другому. Я не знаю почему но когда я кодидирую мне даже в мысли не приходять break, continue, goto. Я бы точно такое не написал (466)
|
|||||||||||||
473
Torquader
07.07.11
✎
14:15
|
(471) Ну да - предполагается, что условие проверки на повторение в середине вложенного цикла (и проверяется на каждой итерации), а после вложенного цикла могут быть другие вычисления и, в том числе, тоже вложенные циклы.
|
|||||||||||||
474
Torquader
07.07.11
✎
14:17
|
(472) Проще вложенные циклы вынести в отдельные процедуры, которые возвращают код результата, а уже по этому коду и действовать, но, переписывать передачу параметров и не забывать их считать и правильно передать - тоже не так просто.
|
|||||||||||||
475
Torquader
07.07.11
✎
14:19
|
Например, в VbScript или Java (JavaScript) goto нет, но никто от этого не умер.
А в 1С создатели, видимо, без Goto не справились - и, слава богу, что нельзя использовать GoTo для входа в циклы и условия - то есть "макаронные сопли" исключены. |
|||||||||||||
476
proger2011
07.07.11
✎
14:19
|
У меня может опыта кодирования мало, но я вобще не понимаю где такая конструкция может пригодиться
While 1=1 Do |
|||||||||||||
477
Fragster
гуру
07.07.11
✎
14:20
|
(470) для (458) есть ВызватьИсключение.
просто так сохраняются логические блоки, а с перейти - предсказать, куда автор эту самую метку поставил - невозможно |
|||||||||||||
478
Rabbit
07.07.11
✎
14:20
|
(476) мало у тебя опыта
|
|||||||||||||
479
proger2011
07.07.11
✎
14:21
|
Или вот это например. Чётко указали что хотим сделать десять шагов и тутже Break. Я так не могу кодить...
For i=1 To 10 Do // что-то выполняем DoPart2(); If RepeatCondition()=1 Then // здесь предполагается переход на начало // то есть проще было бы написать Goto ~НачалоИсполнения; ContinueFlag=1; Break; EndIf; EndDo; |
|||||||||||||
480
Reset
07.07.11
✎
14:21
|
(466) В даннном конкретном случае - заменить While 1=1 на
While ContinueFlag Можно еще изобретать конструкции, где goto необходимо. На поверку в 99% случаев окажется, что плохо спроектирован алгоритм. В 1% (или 0.1%) случаев - да, пригодится. У меня за, наверное, с полсотни тысяч строк на 1С, таких случаев не было. |
|||||||||||||
481
Fragster
гуру
07.07.11
✎
14:21
|
потому что 1с - филосовский язык:
Пока Истина... |
|||||||||||||
482
GoldenDawn
07.07.11
✎
14:24
|
вот ниачем ваще спор - сколько раз запускал замер производительности - любая кодова охинея ничто по сравнению с чтением какого-нибудь чего-то
никто не обязан придерживаться каких-то стандартов читабельность главное, отступы интервалы и имена переменных, а то некоторые пишут как на коленке дыр налезает на пыр как бы там ни было гениально а читать эту срамоту противно |
|||||||||||||
483
smaharbA
07.07.11
✎
14:31
|
(459) тыж истинный пингвинофил, как же тогда это (ведь элементарно без готушек) ?
|
|||||||||||||
484
ado
07.07.11
✎
15:19
|
(425) А так не проще?
|
|||||||||||||
485
ado
07.07.11
✎
15:23
|
+(484) Либо так:
|
|||||||||||||
486
fisher
07.07.11
✎
15:26
|
(476) Нигде. Это просто плохой стиль, который удобно применять, если лень задумываться о читабельности кода.
|
|||||||||||||
487
ado
07.07.11
✎
15:33
|
+(485) На худой конец так:
|
|||||||||||||
488
ado
07.07.11
✎
15:51
|
(484)(485)(486) Но лучше всего так, как преложено в (446), ибо опираться на особенности вычисления 1С-ом логических выражений я бы не стал.
|
|||||||||||||
489
fisher
07.07.11
✎
17:15
|
(488) Тогда так:
Если ЕстьПраво() Тогда Отказ = Ложь; Если НужноИнтерактивноеПодтверждение Тогда Отказ = НЕ ПолученоИнтерактивноеПодтверждение(); КонецЕсли; Если НЕ Отказ Тогда КонецЕсли; КонецЕсли; |
|||||||||||||
490
smaharbA
07.07.11
✎
23:27
|
пингвинофилы слились ?
|
|||||||||||||
491
Rabbit
07.07.11
✎
23:29
|
(490) боюсь что я не они а они молчат
|
|||||||||||||
492
МуМу
07.07.11
✎
23:31
|
Не читал все. Мое мнение, если бюджет ограничен(цель оправдывает средства) - это оправдано. Сами используем.Но это не стратигичесткое и не управляемое решение.
|
|||||||||||||
493
smaharbA
07.07.11
✎
23:36
|
"бонзы" подтянулися ))
|
|||||||||||||
494
Rabbit
07.07.11
✎
23:38
|
(493) давай, клевещи))
|
|||||||||||||
495
Torquader
08.07.11
✎
00:51
|
Кто бы что ни говорил, но написать алгоритм вида "клеточный автомат" без меток достаточно непросто, кроме того теряется изящность и читаемость кода.
В остальных случаях использование меток серьёзных преимуществ не даёт. P.S. лучше бы в 1С грамотно реализовали вызов исключений, чем goto (реализация goto - очень простая задача). |
|||||||||||||
496
Ахиллес
12.07.11
✎
11:12
|
(492) Софтпоинт занимается оптимизацией 1С с помощью гоуту? :-)
А в связке с "если бюджет ограничен" очень двусмысленно читается. -Щас мы вам тут задёшево наоптимизируем, хренак, хренак, нафтыкали гоуту. ВСЁ! Работа сделана! :-) |
|||||||||||||
497
ado
12.07.11
✎
11:20
|
(496) Гы. Внезапно :)
|
|||||||||||||
498
palpetrovich
12.07.11
✎
11:33
|
пипец, 5 страниц из-за goto ...ивращенцы :)
|
|||||||||||||
499
ado
12.07.11
✎
11:36
|
(495) Чушь.
|
|||||||||||||
500
Ненавижу 1С
гуру
12.07.11
✎
11:36
|
500
|
|||||||||||||
501
ado
12.07.11
✎
11:37
|
(500) Ты во всех ветках караулишь? Или бота написал? :-)
|
|||||||||||||
502
Ненавижу 1С
гуру
12.07.11
✎
11:38
|
(501) нет, просто по случаю стреляю иногда
|
|||||||||||||
503
ЗлобнийМальчик
12.07.11
✎
12:06
|
мало что ли способов по другому усложнить код
Да, GOTO - нельзя использовать |
|||||||||||||
504
GANR
12.07.11
✎
14:01
|
За каким ???
Да, GOTO - нельзя использовать |
|||||||||||||
505
Rabbit
12.07.11
✎
15:12
|
только из классовой ненависти к гоутуненавистникам
Лучше использовать, чем чаще, тем лучше |
|||||||||||||
506
NS
12.07.11
✎
15:17
|
(505) Если человек не умеет использовать (допустим без потери читабельности текста) все возможности языка программирования, то он по определению ущербен. Это как шахматист, который "не играет конями".
|
|||||||||||||
507
wladimir90
12.07.11
✎
15:50
|
Любой код можно написать без использования GOTO, но иногда ставя всего лишь одну метку можно избавится от головной боли и существенно уменьшить размер кода, количество условий и прочее. Так что иногда можно и ставить метку. Но именно иногда и обязательно её комментируя.
|
|||||||||||||
508
wladimir90
12.07.11
✎
16:01
|
(506) Если ДлинаЛогина <= 2 Тогда
Сообщить("человек по определению ущербен"); КонецЕсли; |
|||||||||||||
509
NS
12.07.11
✎
16:14
|
(508) Бегом марш в википедию, читать определение ущербности.
|
|||||||||||||
510
Rabbit
12.07.11
✎
16:14
|
(508) сочувствую
|
|||||||||||||
511
wladimir90
12.07.11
✎
16:21
|
(509) Зачем? Ты тоже дал прекрасное определение, записав более чем 39%(по последним данным опроса) программистов в ущербные.
|
|||||||||||||
512
NS
12.07.11
✎
16:22
|
(511) Я не давал определение ущербности, учись читать.
|
|||||||||||||
513
wladimir90
12.07.11
✎
16:23
|
(512) отмазки левые.
|
|||||||||||||
514
NS
12.07.11
✎
16:29
|
(513) Ссылку на данное мной определение приведешь?
Или кроме значения слова "ущербный", ты в придачу не знаешь и значения слова "определение"? Что такое "ссылка" знаешь? :) |
|||||||||||||
515
wladimir90
12.07.11
✎
17:29
|
(514) Конечно дам! вот она - (506)
Признай уже что ступил. ПС Человек человеку волк, а зомби зомби зомби. |
|||||||||||||
516
NS
12.07.11
✎
18:06
|
(515) Точно, значение слова "определение" ты естественно не знаешь.
Там написано "по определению", но самого определения нет, ибо мне казалось что все знают определение (и значения) этого слова. |
|||||||||||||
517
360i
12.07.11
✎
19:02
|
Да, GOTO - нельзя использовать |
|||||||||||||
518
wladimir90
13.07.11
✎
17:23
|
(516) ПоОпределению(<Определение в озвучании писателя>). Читай СП РусЯза!
|
|||||||||||||
519
NS
13.07.11
✎
17:27
|
(518) Ну ты тормоз.
Использующий не в полной мере называется неполноценным, а неполноценный - синоним ущербного. Вот определение. Которого я в своем посте конечно-же не давал. |
|||||||||||||
520
wladimir90
13.07.11
✎
17:31
|
(519) Перечитываю твой пост 506 и сравниваю с постом 519 - один в один твое "определение", тока заменил один синоним другим.
|
|||||||||||||
521
NS
13.07.11
✎
17:36
|
(520) Я умываю руки, чему сейчас в школе учат?
Поколение пепси уже не отличает определение от его использования... |
|||||||||||||
522
Ms Test
13.07.11
✎
17:44
|
(506) +1 :)
Использовать можно, но в крайнем случае |
|||||||||||||
523
NS
13.07.11
✎
17:48
|
(520) (521) Виноват. 90-ый это уже не поколение пепси.
|
|||||||||||||
524
wladimir90
13.07.11
✎
17:57
|
(523) Скорее поколение Виндовс XP
|
|||||||||||||
525
wladimir90
13.07.11
✎
17:58
|
Может поспорим что считать поколением? :)
|
|||||||||||||
526
NS
13.07.11
✎
18:07
|
"современная Яга-школота, она же «поколение Next», поколение гламура и Камеди клаб.
Стоит отметить высер быдла, что «хуже Поколения Пепси не будет ничего». Оказалось будет. Поколение Яги тому пример. Даже сами поцреоты таки это признают." :) (с) Лукморе. http://lurkmore.ru/index.php?title=Поколение_Пепси&stable=1 |
|||||||||||||
527
Господин ПЖ
13.07.11
✎
18:25
|
я один раз использовал - доктор, я буду жить?
Использовать можно, но в крайнем случае |
|||||||||||||
528
wladimir90
13.07.11
✎
18:31
|
(526) Дааа. В наше время такого не было. Все девочки были целочки до 30 лет, а парни ходили в армию на 10 лет.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |