оператор goto или рудимент убивающий ваш проект

Предыдущая тема Следующая тема Перейти вниз

оператор goto или рудимент убивающий ваш проект

Сообщение  Eric-S в Ср Авг 19, 2009 10:07 am

Давайте поговорим об этом многострадальном поператоре. Сейчас это уже история и он оставлен только для совместимости. Но как показало общение с новичками оператор goto по прежнему используеться современными кодерами, что меня просто ужасает.

Оператор goto выполняет переход на указанную строчку или метку.

Код:

10 print "Hello!"
20 cls
30 input a
40 if a = 0 then goto 60
50 goto 20
60 print "goot bie"

В годах этак 60'ых, когда собственно бэйсик и придумали этот код был единственно возможным.
В прочем чему тут удивляться? Ведь программульки были совсем крохотные, а бэйсик носил больше учебный характер, чем реально использовался.
А оператор goto был прямым отражением процессорной команды jmp.

Потом появились метки, а номера строк стали не обязательны. И наш код можно было записать так.


Код:

print "Hello!"

start:
cls
input a

if a = 0 then goto quit
goto start

quit:
print "goot bie"


Потом появились подпрограммы. А для них оператор gosub - перейти к подпрограмме.

Поклонники бэйсика вздохнули с облегчением. Теперь они смогли писать программы более наглядные и менее запутанные. Вот например

Код:

goto start

misubproj:
print "enter number"
input a
resume

start:
print "Hello!"

question:
gosub misubproj
if a = 0 then quit
goto question

quit:
print "goot bie"

Но прогресс не стоит на месте и появился ещё более удобный механизм - процедуры и функции.

А кроме простого условного оператора if ... then и цикла for появились петли do ... loop и многовариантный выбор select case.

И примерно в середине 80'ых годов от goto решено было избавиться, как от устаревшего и вызывающего многочисленные ошибки, а код делающий неудобочитаемым. Его крайне не рекомендуют использовать.

Я с этим полностью согласен. Ещё на заре своей практики писал подобные программы, но уже через неделю не мог в них разобраться, так как путался в своих же метках и прыжках.

В прочем выжить без goto можно легко. Есть множество средств, о которых уже выше сказано. Их использование много удобнее и не вызывает путаницы.

Вот например наша програмка

Код:

print "Hello"

do
cls
print "enter number"
input a
loop while a = 0

print "goot bie"


На сегодняшний день оператор goto в некотором виде используеться только для обработки ошибок.

Использование оператора goto это признак начинающего незрелого программиста изучавшего бэйсик по книгам которые устарели ещё до его рождения.

Это критика в адрес современной образовательной системы, которая до сих пор учит школьников писать программы, как это делалось более полувека назад.

Если вы хотите писать серьёзные проекты, срочно забудте об операторе goto! Это будет трудно только первые пару дней.
Спрашивайте прямо здесь и я дополню главу соответствующими примерами.

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 34
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: оператор goto или рудимент убивающий ваш проект

Сообщение  tux в Ср Авг 19, 2009 1:11 pm

так, к слову...
Код:
[tux@nb777 linux-2.6.30.1]$ grep -rl 'goto' ./|wc -l
6073
avatar
tux

Сообщения : 365
Дата регистрации : 2008-04-06
Возраст : 29
Откуда : Сибирь

Посмотреть профиль http://tux.nsk.ru/

Вернуться к началу Перейти вниз

Re: оператор goto или рудимент убивающий ваш проект

Сообщение  electrik в Ср Авг 19, 2009 8:17 pm

согласен с тем, что с goto через неделю, можно не разобраться со своими исходниками. как-то я разбирал программу, правдо на c, якобы крутого старого программера. там на 3 кб кода, пока читал, запутался в goto. когда я у него спросил, он отмазался мол, так ближе к ассемблеру. я подумал мммда.
впринципе goto можно и не убирать, мне он не мешает.
начинающие, не бойтесь, goto только вредно на языках высокого уровня. если вы начнете учить ассемблер, там без goto (jmp) необойтись.
впринципе в ассемблере есть петли, типа loop с различными условиями, переходы по условию, если меньше,больше,равно, неравно и т.д., но все-равно без jmp не обходится.

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: оператор goto или рудимент убивающий ваш проект

Сообщение  Eric-S в Чт Авг 20, 2009 12:04 am

goto ещё неплох, тогда когда ваша программка совсем крохотная, а в противном случае это действительно начинаеться чёрти что.

Ведь кажеться пространство имён на метки не влияет.. Да и одноименные метки, в двух разных классах нельзя использовать.
Что заставляет придумывать им уникальные имена.

Последний мой проект, где я пользовал goto загнулся именно из-за того, что я всего лиш написав 3200 строку, окончательно запутался в метках.
(ух, прошло столько лет а я даже помню, сколько строк! Вот ведь, на что приходилось обращать внимание. А там ещё были проблемы что весь проект в память за один раз не грузился, а был всего-то 120 kb в компильнутом состоянии. )

И я считаю, что избегание goto это хороший тон.
Кроме того логика структурного программирования его так же не приветствует.

А вот assembler... Ну что тут сказать? куда же без jmp и прочих фишек? На сём ведь и держиться ветвление.
А циклы это лишь жалкое подобие конструкций высокоуровневых языков.

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 34
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: оператор goto или рудимент убивающий ваш проект

Сообщение  Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения