Имя: Пароль:
IT
Наука
Теорема Бома — Якопини реалистична? или снова про goto
,
0 MatrosoV AleXXXand_R
 
28.06.11
15:32
1. Использовать можно, но в крайнем случае 46% (42)
2. Да, GOTO - нельзя использовать 38% (35)
3. Другое 9% (8)
4. Лучше использовать, чем чаще, тем лучше 7% (6)
Всего мнений: 91

Теорема Бома — Якопини — утверждение о структурном программировании, согласно которому любой исполняемый алгоритм может быть преобразован к структурированному виду, то есть такому виду, когда ход его выполнения определяется только при помощи трёх структур управления: последовательностей (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) тыж истинный пингвинофил, как же тогда это (ведь элементарно без готушек) ?


static int set_one_prio(struct task_struct *p, int niceval, int error)
{
       int no_nice;

       if (p->uid != current->euid &&
               p->uid != current->uid && !capable(CAP_SYS_NICE)) {
               error = -EPERM;
               goto out;
       }
       if (niceval < task_nice(p) && !capable(CAP_SYS_NICE)) {
               error = -EACCES;
               goto out;
       }
       no_nice = security_task_setnice(p, niceval);
       if (no_nice) {
               error = no_nice;
               goto out;
       }
       if (error == -ESRCH)
               error = 0;
       set_user_nice(p, niceval);
out:
       return error;
}
484 ado
 
07.07.11
15:19
(425) А так не проще?


Пользователи = "0001,0002,0003";
Если Найти(Пользователи,СокрЛП(глПользователь.Код))>0 Тогда
  Если НЕ((СокрЛП(глПользователь.Код)="0003") И (Вопрос("Стёпа, хочешь это сделать прямо сейчас?",4)<>6)) Тогда
      //начало неких действий
      //...
      //конец неких действий  
  КонецЕсли;    
КонецЕсли;    
485 ado
 
07.07.11
15:23
+(484) Либо так:


Пользователи = "0001,0002,0003";
Если Найти(Пользователи,СокрЛП(глПользователь.Код))>0 Тогда
  Если (СокрЛП(глПользователь.Код)<>"0003") ИЛИ (Вопрос("Стёпа, хочешь это сделать прямо сейчас?",4)=6) Тогда
      //начало неких действий
      //...
      //конец неких действий  
  КонецЕсли;    
КонецЕсли;    
486 fisher
 
07.07.11
15:26
(476) Нигде. Это просто плохой стиль, который удобно применять, если лень задумываться о читабельности кода.
487 ado
 
07.07.11
15:33
+(485) На худой конец так:

Пользователи = "0001,0002,0003";
Если Найти(Пользователи,СокрЛП(глПользователь.Код))>0 Тогда
  Если (СокрЛП(глПользователь.Код)="0003") И (Вопрос("Стёпа, хочешь это сделать прямо сейчас?",4)<>6) Тогда
  Иначе
      //начало неких действий
      //...
      //конец неких действий  
  КонецЕсли;    
КонецЕсли;    
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 лет.