Jump to content
pwseo

Utilização do GOTO

Recommended Posts

pwseo

O goto é uma ferramenta excelente para clarificar código que infelizmente é mal utilizada e tem má fama.

Claro que no exemplo acima n se justificava o seu uso (mas também não é verdade dizer que um repeat é melhor, porque não é), mas a mentalidade de "gotos are evil" tem que acabar. Maus são os programadores que os usam mal :)

Share this post


Link to post
Share on other sites
nunopicado

Cada comando tem a sua razão de ser, por isso é que existe.

Mas a verdade é que o GOTO presta-se a essa fama. Lógico, quem não sabe trabalhar correctamente é que causa a má fama, mas é o próprio conceito do comando que leva a originar bugs, mesmo em quem sabe trabalhar correctamente.

Dou-te um exemplo, nunca tive problema nenhum com o goto. Nunca me originou problemas directamente. Mas não o uso, há vários anos que não o uso. Simplesmente porque:

- Mesmo sabendo trabalhar com ele, qualquer distração pode originar um bug (sim eu sei, qualquer comando mal usado pode levar a bugs. Mas parece-me que a relação facilidade-de-encontrar-os-possiveis-bugs/mais-valia-que-dá-ao-programa deste comando é muito baixinha).

- Tenho sempre solução com ciclos convencionais para resolver o problema de forma mais clara (sim, não concordo que seja excelente ferramenta para clarificar código, quando muito, para o complicar é muito boa :D )

- Deixa-me sempre a sensação (isto é subjectivo é claro) que é uma solução de recurso, daquelas que usamos quando temos um problema e não encontramos mais nenhuma solução para o resolver

Claro que isto é apenas uma opinião... :) Não tenho nada contra quem usa!

Mas sinceramente não gosto, nem vejo utilidade!

:)

It's not evil... It's just no my kind!

PS: Começaste a programar em Basic? Parece-me sempre que quem gosta do goto começou a programar em Basic... lol :cheesygrin: A teoria está correcta?


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
pwseo

A minha primeira linguagem de programação foi o Pascal :)

Por acaso o goto foi das últimas coisas que aprendi a utilizar, o que nem é de admirar, visto que a sua função é a de quebrar a estrutura de um programa.

Ou seja, saber utilizar o goto implica ter uma boa noção do que é a estrutura de um programa e também do problema que ele tenta representar. Há casos onde condições aqui e ali acrescidas de ciclos ali e acolá pura e simplesmente são uma uma "obfuscação estruturada" do problema a resolver, porque nem todos os problemas são intuitivamente representáveis dessa forma. Daí o goto.

Acrescento ainda que hoje em dia não há desculpa para utilizar mal o goto.

EDIT: eu não "gosto" do goto. Eu apenas não o vejo como a última encarnação do Diabo na Terra, mas sim como algo que tem a sua utilidade.

EDIT2: como alguém disse, o goto ficou mal visto antes da maioria das pessoas tirar proveito dele :)

Share this post


Link to post
Share on other sites
nunopicado

A minha primeira linguagem de programação foi o Pascal :cheesygrin:

ARRRGGGGHHHHHHH *

Bolas, estava convencido que tinha ali uma teoria vencedora! lolol

hehehe Curiosamente, existem compiladores actuais que trazem uma opção para desactivar o comando goto.

Pessoalmente acho isto estúpido, mesmo não usando. Mas pronto, alguém achou boa ideia!

O que me leva a não gostar dele é mesmo a quebra do fluxo, coisa que aliás, o goto não é o único a fazer.

Outros comandos, como o exit, o break e o halt "sofrem" do mesmo problema.

Devo confessar que estes até uso, embora tente faze-lo o mínimo possível.

* Demasiados livros do Patinhas hehehehe


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
pwseo

nunopicado,

Mas os comandos break, continue são extremamente úteis. Aliás, são mesmo fulcrais para uma programação eficiente no que diz respeito a ciclos, e são visualmente muito esclarecedores. Além disso são locais, não vão fugir do loop actual para uma função qualquer (assim como o goto está limitado ao procedimento/função actual).

Nem quero imaginar o que seria dos meus loops se tivesse que criar uma cascata de condições umas dentro de outras quando poderia simplesmente utilizar meia duzia de break ou continue :)

Quanto à opção de desactivar o goto sinceramente não percebo a ideia, também.

Share this post


Link to post
Share on other sites
thoga31

Os comandos break e continue são utilizados, e fulcrais, em C, por exemplo. Contudo, confesso que prefiro um outro método em Pascal, inspirado no ciclo geral em VB.NET, o simples Do... Loop.

Neste ciclo é preciso fazer um Exit Do para "saltar" do ciclo. Com base nisto, criei o seguinte esquema:

ExitLoop := false;
repeat
      // comandos...
      if ({condição de saída}) then ExitLoop := True;
until ExitLoop;

Várias condições de saída podem ser criadas, e se após o ExitLoop se tornar True ainda houver código e que não deva ser executado, faz-se:

ExitLoop := false;
repeat
      // comandos...
      if ({condição/ões de saída}) then ExitLoop := True;
      if not ExitLoop then begin
         // comandos quando não é para "saltar" do ciclo
      end else begin
         // comandos a executar mesmo ante de "saltar" do ciclo
      end;
until ExitLoop;

Assim, quando tenho várias condições para sair do ciclo e muitas vezes estas são satisfeitas antes do until, esta estrutura facilita: não temos de fazer complicados "cálculos lógicos" para obter, numa só condição, todas as que precisamos, e é um goto que não quebra a estrutura sequencial. :)


EDIT:

Fiz split do tópico original pois este tema era já puro offtopic. :cheesygrin:

Bom tema de conversa, btw :D


Knowledge is free!

Share this post


Link to post
Share on other sites
SirDave

Quando dizem que o "goto não é assim tão mau" e sabem o que dizem é porque têm experiência. O meu problema com o "goto" é que os programadores inexperientes quando o aprendem adoram-no e ficam como que "agarrados" a ele.

Por exemplo, um amigo meu só sabia VB.NET, e depois numa pequena aula de Python viu-se lixado a fazer um programa que recebia 5 vezes input sem o "goto". Porquê? Porque foi mal habituado.

Eu acho que o "goto" não deve ser ensinado até ao momento em que os programadores já dominam bem imensos conceitos. No entanto, como prevenir essa aprendizagem é impossível, o que se faz é dizer que o "goto é evil", para os manter afastados do uso do "goto".

No entanto, acho que nem os programadores avançados precisam de goto porque é sempre substituível.


Be nice to see your eyes, blink them from time to time to relax your retina when using the computer. Blink now!

Share this post


Link to post
Share on other sites
thoga31

Quando dizem que o "goto não é assim tão mau" e sabem o que dizem é porque têm experiência. O meu problema com o "goto" é que os programadores inexperientes quando o aprendem adoram-no e ficam como que "agarrados" a ele.

Por exemplo, um amigo meu só sabia VB.NET, e depois numa pequena aula de Python viu-se lixado a fazer um programa que recebia 5 vezes input sem o "goto". Porquê? Porque foi mal habituado.

Nos meus tempos de aprendiz de Pascal cedo travei conhecimento com o Goto pois já tinha programado em TI-Basic que, infelizmente, recorre essencialmente ao Goto e Lbl (Label em TI-Basic). Contudo, tive o bom senso de aprender os ciclos e a utilizá-los como deve ser, e logo encontrei soluções que me fizessem sair do goto. Não o utilizo há séculos, e sempre que pego em TI-Basic sinto uma certa dificuldade pois lembro-me a meio que preciso de dividir o programa em blocos porque o comando Menu funciona só com o princípio do Goto...

É pena ver que ainda se criam tão maus hábitos. Nem em VB.NET se utiliza o GoTo, e logo esta linguagem que tem uma panóplia de variações de ciclos e comandos respectivos. :dontgetit:

Eu acho que o "goto" não deve ser ensinado até ao momento em que os programadores já dominam bem imensos conceitos. No entanto, como prevenir essa aprendizagem é impossível, o que se faz é dizer que o "goto é evil", para os manter afastados do uso do "goto".

No entanto, acho que nem os programadores avançados precisam de goto porque é sempre substituível.

Concordo. Um bom programador dispensa o goto (e os "extremistas" chegam mesmo a abominá-lo). :cheesygrin:


Knowledge is free!

Share this post


Link to post
Share on other sites
pwseo

pessoas,

thoga31, eu faria o teu exemplo desta forma (sim, sem goto):

while (true) do
begin
  if condicao then
    break;
  
  // resto do código
end;

(Aliás, o break é um goto disfarçado, por isso repara como ajuda na legibilidade)

Por exemplo, um amigo meu só sabia VB.NET, e depois numa pequena aula de Python viu-se lixado a fazer um programa que recebia 5 vezes input sem o "goto". Porquê? Porque foi mal habituado.

A verdadeira questão aqui é... Onde andam essas pessoas a aprender a programar? Tutoriais do século passado que falavam de BASIC e programação não estruturada? Acho estranho que em aulas actuais se ensinem os alunos a utilizar goto antes de aprender a estruturar um programa com condições e ciclos, entre outras coisas.

Ou então as pesquisas que fazem na net por tutoriais têm graves defeitos.

Eu aprendi Pascal sozinho através de tentativa e erro, com recurso à referência da linguagem (não tinha internet na altura) e nunca tive problemas em utilizar o goto. Nunca. (e não, não o utilizava a torto e a direito...)

Eu acho que o "goto" não deve ser ensinado até ao momento em que os programadores já dominam bem imensos conceitos.

Como eu tinha dito anteriormente, o goto foi das últimas coisas que aprendi a utilizar. Claro que já conhecia e sabia o que fazia, mas não sabia qual era o objectivo da sua existência. Só depois de perceber como funciona um programa é que podemos perceber como funciona o goto.

No entanto, acho que nem os programadores avançados precisam de goto porque é sempre substituível.

Claro, assim como tudo na programação em qualquer linguagem Turing-complete. Não se trata de ser ou não substituível mas sim de existir e de ter o seu domínio.

Concordo. Um bom programador dispensa o goto (e os "extremistas" chegam mesmo a abominá-lo).

Os extremistas estão quase sempre errados.

E corrigindo a tua afirmação: um bom programador utiliza a melhor ferramenta para a tarefa à sua frente, independentemente da fama que esta possa ter junto do resto dos colegas.

As críticas que se fazem actualmente ao goto parecem indicar que isto se usa como se usava há anos e anos atrás: em programas sem estrutura onde de facto se tornava difícil gerir os saltos no código.

Actualmente, todos os goto são locais a um bloco de código e tipicamente saltam meia dúzia de linhas para quebrar a estrutura de forma intuitiva.

Share this post


Link to post
Share on other sites
nunopicado

Mas os comandos break, continue são extremamente úteis.

Sim, sem duvida... Por isso é que, não gostando da ideia geral deste tipo de comandos, acabo por os usar.

O exit é prato do dia: uso bastante no inicio dos procedimentos de controlos visuais (comandos e afins) no delphi, para gerir as condições de execução ou não da função desse botão (ex.: se um botão serve para listar um relatorio, logo no inicio faço o teste se existem dados validos para gerar esse relatorio. Se não houver, exit, logo no inicio do procedimento, evitando passar mais à frente, e evitando ter de desenvolver todo o procedimento dentro de um else qualquer).

O halt já não uso desde que trabalho em delphi, tendo-o substituido pelo application.terminate, mais apropriado para programas em windows.

O break é mais raro usar, mas quando faz falta, lá entra.

Assim, quando tenho várias condições para sair do ciclo e muitas vezes estas são satisfeitas antes do until, esta estrutura facilita: não temos de fazer complicados "cálculos lógicos" para obter, numa só condição, todas as que precisamos, e é um goto que não quebra a estrutura sequencial. :)

Este é o momento de usar o break. Ao usá-lo, o compilador manda a acção para fora do loop onde foi chamado o break, ou seja, faz isso mesmo.

No entanto, acho que nem os programadores avançados precisam de goto porque é sempre substituível.

É esse o meu ponto de vista...

Nos meus tempos de aprendiz de Pascal cedo travei conhecimento com o Goto pois já tinha programado em TI-Basic que, infelizmente, recorre essencialmente ao Goto e Lbl (Label em TI-Basic).

Olha olha, a minha teoria afinal faz algum sentido... :cheesygrin::D:D

Oh Pedro, será que és a excepção que confirma a regra! lolol Espero que sim, queria mesmo ter uma teoria verdadeira sobre isto! hehehehe

Quer-me parecer que quando um professor ensina o goto logo no inicio é mais por "preguiça" de ensinar os restantes ciclos do que propriamente por achar que esse ensinamento faz falta ao aluno nesse determinado momento.

Já agora, Pedro, no teu exemplo do break (que é claro, está correcto), deixa-me só avisar um pormenor aos mais incautos:

Tal como o goto, usar os ciclos while e repeat com condições absolutas (while true do  ou  repeat until false) é perigoso se não se souber com certeza o que se está a fazer, nomeadamente, se não se acertar com a condição que leva à execução do break.

Caso esta condição seja mal programada, e aconteça nunca ser true (no caso do while) ou nunca ser false (no caso do repeat), o programa entra em loop infinito.

Assim, sempre que possível (por vezes não é), deve-se colocar em vez do true ou do false uma condição fail-safe, algo que permita que o ciclo seja concluido caso algo falhe.


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
M6

O goto é uma ferramenta excelente para clarificar código que infelizmente é mal utilizada e tem má fama.

Claro que no exemplo acima n se justificava o seu uso (mas também não é verdade dizer que um repeat é melhor, porque não é), mas a mentalidade de "gotos are evil" tem que acabar. Maus são os programadores que os usam mal :cheesygrin:

Permite-me discordar.

O goto é uma ferramenta excelente para clarificar complicar código.

A razão pela qual tem má fama é precisamente porque é uma porta escancarada ao código esparguete.

Já agora, porque é que um repeat não é melhor do que um goto?


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Share this post


Link to post
Share on other sites
passarito

Como  este tópico surgiu a partir de outro, coloco aqui o que disse acerca deste assunto no outro tópico.

Em anos de programação em Pascal, sempre descobri uma solução melhor que usar o Label-Goto. Acho que às vezes é falta de procurar uma alternativa mais consistente do que a aparente!

Nunopicado:

Parece-me sempre que quem gosta do goto começou a programar em Basic

Deixa-me deitar abaixo a tua teoria mais uma vez. Eu comecei com BASIC, usei os goto's para fazer bolcos de programação especifica, mesmo antes de saber o que eram procedimentos. Quando passei ao PASCAL, achei, e ainda acho, que não têm lógica naquele tipo de programação, aliás bem explicados por ti, Nunopicado e pelo M6.

Nunopicado:

Quer-me parecer que quando um professor ensina o goto logo no inicio é mais por "preguiça" de ensinar os restantes ciclos do que propriamente por achar que esse ensinamento faz falta ao aluno nesse determinado momento.

Eu vou mais longe, quando um professor ensina/usa um goto antes de um primeiro ano de programação é porque é um mau professor, e não percebe que quem está a aprender irá usar o método mais fácil em vez do mais correcto. Eu sei do que estou a falar, pois na faculdade, de 3 professores que apanhei 2 coitadinhos... um, o de prática, ainda teve a humildade de me dizer que do Pascal só sabia o básico e pedia-me ajuda nos casos mais complexos, o da teórica tinha a mania de esperto. O homem não podia comigo, pois pior que um professor que não sabe é alguém que está a ensinar outros e não admite ser corrigido... até ao dia que ele pensava que tinha razão, desafiou-me para verificar no computador o que eu o estava a corrigir... resumindo e concluindo, foi humilhado à frente da turma toda!!! A solução dele não funcionou e a minha resolveu. Na altura 5 anos de programação em Pascal fizeram a diferença!

Quanto ao Exit e ao Halt, admito que apenas usei mas apenas 2 ou 3 vezes!

Share this post


Link to post
Share on other sites
shumy

Nunca encontrei uma situação onde um GOTO fosse uma boa opção (pelo menos em linguagem como o Java). Nem mesmo em situações com encadeamentos de loops complicadas, é sempre substituível por métodos.

Desafio a algum defensor do GOTO que coloque aqui um problema onde a utilização do mesmo seja melhor que outra alternativa.

Vamos ver se aparece algo de interessante  :cheesygrin:


Aqui há coisa de 2 anos fazia umas malhas de croché, depois fartei-me e fui para informática!

Share this post


Link to post
Share on other sites
nunopicado

Nunopicado:Deixa-me deitar abaixo a tua teoria mais uma vez. Eu comecei com BASIC, usei os goto's para fazer bolcos de programação especifica, mesmo antes de saber o que eram procedimentos. Quando passei ao PASCAL, achei, e ainda acho, que não têm lógica naquele tipo de programação, aliás bem explicados por ti, Nunopicado e pelo M6.

Passarito, não sejas assim, deixa-me brilhar!  :cheesygrin::D

Eu não disse que quem começa em basic gosta sempre do goto... Eu disse que quem gosta do goto provavelmente começou em basic! hwehehehe

Mas é só uma teoria, necessita de prova prática!  :)


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
passarito

Eu não disse que não gostava do GoTo. O que eu defendo é que o GoTo no Basic faz todo o sentido é de uma extrema utilidade. Já no Pascal, NÃO! Não faz qualquer sentido!

É tal e qual como eu não vou usar umas calças rotas e umas botas da tropa num baile de gala, assim como não vou de fato e gravata para uma rave!

Cada macaco no seu galho!

You could see but you shouldn't do it! :nono1:

Share this post


Link to post
Share on other sites
nunopicado

heheheh Tou a tentar imaginar as calças rotas num baile de gala...

Wild...


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
pwseo

Pessoas que ainda se preocupam com o código esparguete: isso é inadmissível hoje em dia. Se há sequer a hipótese de se considerar que determinado código pode tornar-se um emaranhado devido ao goto, então a estrutura de base desse código está severamente deficiente desde o início.

Nao tenho culpa que as pessoas associem o goto a saltos gigantes provavelmente entre funções diferentes (algo que nem se faz actualmente, e que era o maior problema antigamente).

M6: o goto serve para clarificar, se for bem usado. Temos pena que no passado tal fosse complicado e que hoje em dia seja tabu falar-se bem dele. Além disso, se as pessoas usam mal o goto, o problema é delas... não é um comando transcendente de utilização difícil.

Quanto ao repeat, há situações em que determinado algoritmo pode ser descrito mais intuitivamente com um goto do que com um repeat. E o goto não é um substituto dos ciclos. É estranha esta ideia de que o goto é usado para substituir coisas que já existem...

passarito, essa comparação das calças não teve nada a ver LOL

shumy, o teu desafio será sempre inconclusivo, uma vez que cada programador verá o código à sua maneira. Os anti-goto serão sempre anti-goto, e os neutros serão sempre neutros (e sim, eu sou neutro, nao sou pró-goto).

Mas fico-me por aqui. Afinal de contas, está tudo a responder como se eu defendesse a utilização constante e nada ponderada do goto, o que não tem nada a ver com o que digo. Além disso, toda a gente dá justificações de há anos atrás, quando não havia estruturação dos programas. É uma discussão injusta.

Share this post


Link to post
Share on other sites
nunopicado

Na boa Pedro, o pessoal só está a dar a sua opinião!

:D Como disseste e bem, cada programador vê e verá sempre o código à sua maneira!

Existem 1001 maneiras de fazer um qualquer programa, e já que se falou em codigo esparguete, junto aqui as 1001 maneiras de fazer bacalhau para complementar...

hmmmm esparguete com bacalhau... Acho que prefiro usar o goto!  :cheesygrin:


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
passarito

Pedro-kun,

Além disso, toda a gente dá justificações de há anos atrás, quando não havia estruturação dos programas. É uma discussão injusta.

HEELLLOOO.... O Pascal é uma linguagem de à anos atrás... Apesar de eu gostar muito de Pascal, até pelas recordações que me trás... mas efectivamente o Pascal é uma linguagem de à anos atrás!

Aliás, eu mesmo refiro que cada linguagem tem o seu método de programação e como disse concordo com o GoTo no Basic não concordo no Pascal, portanto a analogia das calças faz todo o sentido. Podes usar porque existe mas não deves de usar devido à estrutura de programação da linguagem.

Com tanta gente a desaconselhar-te e mostrar-te os contras do GoTo, não é razão para pelo menos desconfiares? Fazes-me lembrar de uma mãe que foi ver o filho à parada, e diz:"O meu filho é um espectáculo, olha que vão todos a marchar fora de tempo, só o meu filho é que leva o passo certo!!!!" ;D

Também já reparei que tens um problemazito com o Repeat. É típico dos iniciantes na programação e de alguns programadores mais velhos substituir o Repeat pelo While por tudo e por nada! Está-me a dar vontade de abrir um tópico sobre esse assunto!

Estou-me a basear no que vi! Shoot me if I'm wrong!!! :knuppel2:

Share this post


Link to post
Share on other sites
pwseo

passarito,

O Pascal é uma linguagem de à anos atrás

E no entanto, consegue ser atormentada por problemas de *outra* linguagem (BASIC), o que não faz sentido porque não consegues cometer erros assim em Pascal. Os malefícios de que falam são coisas que nem sequer são possíveis actualmente (porque a linguagem não permite!), como fazer um goto para uma label dentro de outra função/procedimento, que era o pão nosso de cada dia no BASIC (e a raíz de todos os males).

A questão do repeat é uma influência do C :) Não tenho problema nenhum com ele, apenas não costumo programar em Pascal e por isso penso em termos de outros loops (que são quase a mesma coisa).

Mas que sugerias?

repeat
  // lalala
until False;

Algo assim? o problema aqui não é o repeat vs while mas o algoritmo, que tinha por base um loop infinito para permitir a paragem em condições arbitrárias... Não vale a pena debater-se isso, é uma questão quase estética.

passarito, termino isto repetindo que estou a ser mal interpretado. Para mim usar goto não é um método de programação, mas sim uma mera ferramenta a considerar quando aplicável. E já agora, ainda ninguém apresentou uma razão completamente válida para não se usar goto.

Goto statements are considered bad practice and should be avoided as much as possible. It is always possible to replace a goto statement by a construction that doesn’t need a goto, although this construction may not be as clear as a goto statement.

Tirado daqui (pasmem de felicidade por ser necessário um compiler switch para utilizar gotos :P )

nunopicado, exactamente, é uma opinião :) não estou a impor nada, muito menos a utilização generalizada do goto, como percebeste (fiquei apenas com a impressão de que nem toda a gente percebeu dessa forma).

Share this post


Link to post
Share on other sites
nunopicado

O compiler switch é uma verdadeira aberração.

Sou de opinião que o programador, mal ou bem, deve ter a liberdade total para usar todos os recursos da linguagem ao seu dispor, desde que os queira usar.

Se o deve fazer ou não é tão discutível como o sexo dos anjos, como se vê neste tópico, mas se faz parte da linguagem, deveria estar disponivel sem mais niquices.

Do duo repeat vs while (lá vamos nós noutro off-topic) é mais uma daquelas cenas que só depende do programador, e embora existe uma maneira correcta em teoria, na pratica olhem... cada um sabe de si.

Pessoalmente uso este método para decidir qual usar (regra geral):

- Preciso que o codigo do ciclo execute pelo menos uma vez

REPEAT ... UNTIL

- A primeira execução já depende da condição

WHILE ... DO

Mas isto é relativo...

Há sempre pequenos vícios que os programadores vão adquirindo e muitas vezes damos por nós a inserir um deles, que funciona sem problemas é certo, mas que pela regra de cima talvez ficasse outro. Mas pronto, não há regra sem excepção!


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
apocsantos

    Boa tarde,

    Já no Basic do Spectrum eu evitava usar goto porque depois para re-ler o código um gajo "perdia-se". Na altura preferi usar gosub em vez de goto. Discordo que a ideia do uso do goto tenha alguma coisa a ver com quem já programou BASIC, alias em BASIC quem programava evitava goto, para não ter "código esparguete" como já cá foi dito.

    A história de ir a um baile de gala de botas de tropa... Essa nem comento, pois eu ando maioritariamente de botas de combate!:cheesygrin:

Cordiais cumprimentos,

Apocsantos


"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Share this post


Link to post
Share on other sites
nunopicado

    A história de ir a um baile de gala de botas de tropa... Essa nem comento, pois eu ando maioritariamente de botas de combate!:D

E no entanto, o teu avatar apresenta-se-nos com uma roupinha toda janota...  :cheesygrin:

Tou a ver que a minha teoria cai por terra... :) Estava esperançoso que ainda entrasse para a categotia de verdade absoluta, assim tenho de arranjar outra...

Que vos parece esta: Todas as lagostas vermelhas escolheram essa cor por serem do benfica...

Não é uma ideia vencedora?  :cheesygrin::cheesygrin:

Eu por acaso deixei o uso do goto ainda no tempo em que o único acesso que tinha da aprendizagem era o help do turbo pascal 5.5. Não havia net, nem opiniões influenciadoras, simplesmente não me pareceu boa ideia.


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
thoga31

Estou a adorar este tópico. Muito rico em opiniões. :)

Eu confesso que já utilizei mal o goto porque precisava de um programa a funcionar e os ciclos for estavam a criar erros que não entendia e ainda não conhecia a estrutura de tentativa.

Logo que detectei qual era o erro, reprogramei essas 500 linhas com os devidos ciclos.

Nessa época pareceu-me o mais acertado, claro, era um total novato e ainda habituado ao TI-Basic (que nada tem a ver com BASIC, note-se), mas hoje bato com a cabeça na parede só de pensar que fiz isso, pois eu hoje só utilizo o goto em situações em que é basicamente a única solução e não há comandos que façam o trabalho que ele faz. Felizmente, uma situação destas não me aparece "há canos" :D

Não sabia, por acaso, que o Pascal tinha os comandos break e continue, isto talvez porque trabalhei muito com o Dev-Pascal e ele não reconhece estas palavras. Só há uns 3 meses dei (finalmente :cheesygrin:) o "grande passo" (lol) para o Free Pascal.

Ainda assim, mesmo não conhecendo esses comandos, a solução que criei há meses não foi má, penso. :)

Quanto a ter uma fail-safe no ciclo, eu criei outro método meu. Como nos testes eu não estou preocupado, no momento, com rapidez (ups :shu_01:  eu sei, um mau hábito, mas não sou profissional, e são aplicações feitas por hobbie), eu criei este método de controlo:

ExitLoop := false;
contador := 0;
repeat
      // comandos e tal e coiso e bacalhau com esparguete  xD
      if (contador >= MaxInt) then begin
         writeln('Loop infinito detectado');
         ExitLoop := true;
      end else inc(contador);
until ExitLoop;

Isto em ciclos que eu sei em que não há mais do que MaxInt iterações caso funcione correctamente. :)

Ok, vem aí uma onda de "tens de perder estes hábitos", mas digo desde já: tenho noção deles, e em situações em que não esteja a programar por puro hobbie eu deixo de lado os maus hábitos, com certeza. :D


Knowledge is free!

Share this post


Link to post
Share on other sites
nunopicado

Ok, vem aí uma onda de "tens de perder estes hábitos", mas digo desde já: tenho noção deles, e em situações em que não esteja a programar por puro hobbie eu deixo de lado os maus hábitos, com certeza. :cheesygrin:

hehehe os maus hábitos não são assim tão fáceis de desligar... Imagina que começavas a programar profissionalmente, e de repente te surgia um problema que não conseguias resolver na hora, mas tinhas um dead-line para entregar o projecto....

Sempre queria ver se te mantinhas firme em não cair nos habitos criados! lolol

Mas Thoga, tenho de te dizer uma coisa...

Esse teu método não seria provavelmente o que eu usaria, ou o Passarito, ou o Pedro, etc, etc... Não por estar mal, que não está, simplesmente porque foi algo desenvolvido por ti e só com muita pontaria é que fariamos exactamente igual!

Mas admiro a criatividade! Um principio básico de um bom programador é reconhecer os problemas e procurar soluções para os resolver.

Criatividade e raciocinio logico é portanto essencial!  :D:)

Com tão pouco tempo de programação que tens (penso que me falaste que começaste em 2009 ou estou a fazer confusão?), esse tipo de raciocinio é de louvar!


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.