Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Micilini Roll

Chamar funções nao seria um goTo mascarado?

Recommended Posts

Olá pessoa vamos supor que temos 2 funções no php:

 

Function funcao_01(){

//Esta funcao começa na linha 22 e termina na linha 123

}

Function funcao_02(){

//Esta funcao começa na linha 124 e termina na linha 205

}

Vamos supor que na funcao_01 mas especificamente na linha 32 eu chame um comando que chame a funcao 02, isso não seria a mesma coisa que um goTo so que mascarado? porque na verdade quando isso ocorre nos estamos pulando o restante da funcao_01 e jogando a execução do código para as linhas 124 não??

Compartilhar este post


Link para o post
Compartilhar em outros sites

Goto me lembra quando comecei a programar, aquelas linhas de comando em .bat. kkkkkkk'

 

Até onde li sobre o goto no php, não se deve usar, ele serve como ultima saída. Nunca testei usar o goto em uma função para outra. Parece ser meio estranho, sei lá...

Compartilhar este post


Link para o post
Compartilhar em outros sites

A questão ruim no caso é acoplamento entre as funções. Para serem reutilizadas elas deverão sempre ser disponibilizadas juntas como pacote pois se faltar uma a outra não vai funcionar. Isso fica critico se essas funções tem conhecimentos específicos do sistema, como dados de conexão bd, então elas se tornam praticamente inúteis no reuso em outro sistema.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não.

 

A discussão sobre goto começou há 46 anos, quando o Dijkstra publicou um dos artigos mais relevantes e populares da computação até os dias atuais, chamado Go To Statement Considered Harmful.

 

Para começarmos com funções, lembremos que o conceito de uma função é um tanto quanto diferente do modo em que as usamos em linguagens imperativas. Uma função, no conceito puro, poderia ser representada pela seguinte imagem:

191px-Function_machine2.svg.png

Apesar de não parecer tão claro à primeira vista, a imagem simplesmente define o conceito de que uma função recebe valor(es) e retorna um valor, sempre de forma transparentemente referencial, ou seja, mesmo input => mesmo output.

 

O que exclui esse conceito puro da maioria das linguagens é que nós precisamos, de algum modo, manipularmos coisas impuras (que não são transparentemente referenciais), como I/O, tempo e dados randômicos. Sem elas, programação seria apenas algo matemático, sem uso prático como temos hoje.

 

Quando funções usam outras funções impuras, elas se tornam impuras pelo fato de perderem a transparência referencial. Outro ponto é que com isso fica justificada a existência de funções que não têm valor de retorno (void para os íntimos) e funções que não recebem parâmetros.

 

Como exemplo, veja essa função abaixo:

<?php

function doImpureStuff() {
  echo 'I\'m impure!';
}

doImpureStuff();

Ela não retorna nada, nem recebe nada, apenas imprime algo na tela, realizando um side-effect a cada chamada. Agora veja essa outra função:

<?php

function makeStringHappy($string) {
  return $string . ':)';
}

$happyString = makeStringHappy('Heeey'); // 'Heeey :)'

Esta recebe uma string e retorna uma string, retornando o mesmo valor para o mesmo input. Isso seria uma representação prática da imagem do início do post.

 

Agora falando de gotos, eles são simplesmente uma chamada para um label, sem input, sem valor de retorno e sem escopo. É puramente uma forma de reutilização em programação procedural. Os mais próximos a ele seriam break e continue, mas não uma função. O ponto de uma função não é executar um comportamento, mas sim trocar mensagens (input => output).

 

PS: Não faço ideia de como referential transparency seria traduzido para português, logo fiz a tradução ao pé da letra, usando transparência referencial.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ah agora estou começando a entender, a principio + 1 pra voce :)

 

Eu li e entendi algumas coisas, mas vamos lá pelo que eu to entendendo o gotos nada mais é do que um comando que diz ao compilador para executar funcao de uma determinada linha e continuar por esta linha ignorando as outras

 

Seguinte voce me disse que quando nos chamamos uma funcao ele deve retornar alguma coisa, no caso observe o exemplo que fiz via javascript (fiz em js pois é a mesma coisa e é mais pratico de entender e simples de fazer):

 

console.log('olá eu sou a primeira linha de código depois das tags <script>');

chamaFuncao();

console.log('olá eu sou o comando que fica entre a chamada da funcao e a funcao verdadeira');

function chamaFuncao(){

console.log('olá estou dentro de uma funcao');
}

 

Para a minha surpresa (mas eu ja esperava que isso aconteceria), o console log me mostrou a primeira mensagem, logo em seguida ele ignorou a outra mensagem e mostrou a mensagem que estava dentro da funcao e para finalizar ele mostra o segundo console log, ou seja, pelo que eu entendi:

 

1- ele mostra uma mensagem na tela

2- quando nos chamamos uma funcao, automaticamente o código entra em um estado de stand by e procura uma linha de comando parecida com esta:

 

 

function chamaFuncao(){}

 

3- quando ele acha este tipo de linha o compilador passa a rodar desta linha em diante ate fechar as chaves da 'function', depois que encontra a ultima linha de código ele retorna para a linha que que chamamos a funcao, e em seguida começa executando as linhas abaixo, no caso mostrando aquela mensagem.

 

 

Entao o que eu pude entender, é que , parece uma espécie de gotos personalizado, a não ser que coces estão me dizendo que:

 

1- quando a funcao é chamada, ele procura a linha e puxa esta funcao para a linha atual, exemplo: vamos supor que a funcao se encontra na linha 112, ja o metodo que chama esta funcao se encontra na linha 10, então ele deve puxar esta linha pra linha 10, não se se voces estão entendendo mas é complicado de explicar.... mas mesmo assim o compilador precisa ir a esta linha....

 

 

Entao eu acho que gotos e funções apesar de nomes diferentes e ate características diferentes, são tudo farinha do mesmo saco, ou seja ambos dizem ao compilador para executar tal comando que se encontra em uma determinada linha, ignorando as outras, correto? errado?

 

(Lmebre-se que agora nos não estamos mais diferenciando comandos e sim tentar explicar a essência de cada um deles)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso pq essas linguagens rodam de forma sincrona, ou seja, parseiam e executam na ordem em que vc declarar no código.

 

Não tem nada a ver com goTo, e nem com as más práticas daquilo.

 

Pois não "pulamos" para linhas, mas sim seguimos o fluxo declarado. O compilador procura as instruções e as executas, elas estando em outras linhas ou em outros arquivos, mas ele não "se importa" com nada disso, ele apenas executa em ordem, na ordem em que vc declarar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu esperava que funcionasse assim tb, então voltando ao exemplo do js que eu dei acima.

 

1- Primeiro o compilador executa todas as funções de uma vez só linha por linha, mas nessa parte nada é retornado ou mostrado ao usuário correto?

 

2-em seguida ele entende o que foi digitado pelo desenvolvedor e mapeia, ou seja, ele realoca cada coisa em seu lugar, vamos aos exemplos:

 

 

  • Mostre uma mensagem na tela, chame uma funcao, mostre outra mensagem, abra esta funcao, mostre a mensagem

 

No sentido mais pratico acredito que ele arruma este código pra ficar +/- assim:

 

  • mostre uma mensagem na tela, mostre a 3 mensagem na tela, mostre a segunda mensagem na tela

 

No exemplo acima nao coloquei funções , pois neste nível de codigo acredito eu ,que funções não servem mais pra nada e tudo fica na forma mais básica possível (Assembly, binário). funções são comandos existentes dentro de uma linguagem de programação na qual ajuda o desenvolvedor a visualizar o código da melhor forma, quando o código é compilado ele volta para assembly e para o assembly funções não são nada menos que 'coisas inuteis' que 'arrumam' e ajuda os desenvolvedores a programar de uma forma mais basica ... certo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu li e entendi algumas coisas, mas vamos lá pelo que eu to entendendo o gotos nada mais é do que um comando que diz ao compilador para executar funcao de uma determinada linha e continuar por esta linha ignorando as outras

 

Pensando em Assembly, uma chamada de goto é uma chamada para jmp, que "pula" para algum lugar, enquanto uma chamada de função é uma chamada para call, que apesar de incluir uma chamada para jmp, não é exatamente igual.

 

Quando você chama uma função, os parâmetros são armazenados na pilha de execução, há um alocamento de memória para o valor de retorno, a função é chamada da maneira que falamos acima, os argumentos são lidos e o código executado, o valor de retorno é inserido e a stack acaba, desalocando a memória criada especificamente para a execução da funcão.

 

Isso muda de acordo com linguagem, plataforma, etc. e é bem básico o que exemplifiquei, especialistas em baixo nível do fórum poderiam dar uma ajuda. Um pouco mais de detalhes pode ser encontrado aqui.

 

Uma forma mais leve e fácil de aprender é através de CIL, um "Assembly++" da Microsoft que o .NET e o Mono usam. A Wikipedia tem uma página bem detalhada sobre CIL.

 

 

Seguinte voce me disse que quando nos chamamos uma funcao ele deve retornar alguma coisa, no caso observe o exemplo que fiz via javascript (fiz em js pois é a mesma coisa e é mais pratico de entender e simples de fazer):

console.log('olá eu sou a primeira linha de código depois das tags <script>');

chamaFuncao();

console.log('olá eu sou o comando que fica entre a chamada da funcao e a funcao verdadeira');

function chamaFuncao(){

console.log('olá estou dentro de uma funcao');
}

 

Você está falando de funções impuras. Funções vêm de programação funcional, que é um paradigma que trata side-effects como valores e não como comportamentos, logo linguagens que são puramente funcionais são denominadas assim porque não realizam side-effects diretamente. Linguagens imperativas como PHP, Java, C, etc., em contrapartida, fazem isso.

 

Compare:

void main() {
  print("Hello world");
}

Com este mesmo código expresso em FP:

RealWorld main(RealWorld realWorld) {
  return new RealWorld(realWorld + new Print("Hello world"));
}

Aqui todos os side-effects (o "mundo real") são valores e não comportamentos. O compilador/interpretador seria quem leria o valor e aí sim faria o "serviço sujo".

 

Entao eu acho que gotos e funções apesar de nomes diferentes e ate características diferentes, são tudo farinha do mesmo saco, ou seja ambos dizem ao compilador para executar tal comando que se encontra em uma determinada linha, ignorando as outras, correto? errado?

 

(Lmebre-se que agora nos não estamos mais diferenciando comandos e sim tentar explicar a essência de cada um deles)

 

Seguindo a última linha do que você disse, está errado sim. Observe a seguinte função:

int inc(int n) {
  return n + 1;
}

five = inc(5);

Internamente seria o mesmo de:

inc:
  returnValue = param1 + 1;

int returnValue;
int param1 = 5;
goto inc;
unset param1;
int six = returnValue;
unset returnValue;

Uma chamada de função usaria um goto em baixo nível, mas não é a mesma coisa porque uma função tem escopo, input e output. Um goto pode fazer qualquer coisa, ele é apenas um procedimento normal.

 

Isso:

foo:
  print("Called!");

goto foo;
goto foo;

É um atalho para:

print("Called!");
print("Called!");

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.