De um modo geral, todos ouvimos sobre as funções ou procedimentos nas linguagens de programação. No entanto, acabei de descobrir que uso esses termos quase de forma intercambiável (o que provavelmente está muito errado).
Então, minha pergunta é:
Qual é a diferença em termos de funcionalidade, finalidade e uso?
Um exemplo seria apreciado.
(define (sqrt x) (newtons-method (lambda (y) (- (square y) x)) 1.0))
.Respostas:
Uma função retorna um valor e um procedimento apenas executa comandos.
A função nome vem da matemática. É usado para calcular um valor com base na entrada.
Um procedimento é um conjunto de comandos que podem ser executados em ordem.
Na maioria das linguagens de programação, até as funções podem ter um conjunto de comandos. Portanto, a diferença está apenas no retorno de uma parte do valor.
Mas se você gosta de manter uma função limpa (basta olhar para as linguagens funcionais), é necessário garantir que uma função não tenha efeito colateral.
fonte
Isso depende do contexto.
Nas linguagens do tipo Pascal, funções e procedimentos são entidades distintas, diferindo se retornam ou não um valor. Eles se comportam de maneira diferente. a sintaxe da linguagem (por exemplo: procedure chama instruções de formulário; você não pode usar uma chamada de procedimento dentro de uma expressão vs. chamadas de função não formam instruções, você deve usá-las em outras instruções). Portanto, os programadores criados em Pascal diferenciam esses.
Nas línguas do tipo C e em muitas outras línguas contemporâneas, essa distinção se foi; em idiomas estaticamente tipados, procedimentos são apenas funções com um tipo de retorno engraçado. Provavelmente é por isso que eles são usados de forma intercambiável.
Nas linguagens funcionais, normalmente não existe um procedimento - tudo é uma função.
fonte
Exemplo em C:
Embora você deva observar que o padrão C não fala sobre procedimentos, apenas funciona.
fonte
void function
. Kernighan & Ritchie Ch 1.7: "Em C, uma função é equivalente a uma sub-rotina ou função em Fortran, ou a um procedimento ou função em Pascal." Em outras palavras ... esta resposta está errada.Em geral, um procedimento é uma sequência de instruções.
Uma função pode ser a mesma, mas geralmente retorna um resultado.
fonte
Existe um termo sub - rotina ou subprograma que significa um pedaço de código parametrizado que pode ser chamado de diferentes lugares.
Funções e procedimentos são implementações dessas. Normalmente, as funções retornam valores e os procedimentos não retornam nada.
fonte
Diferenças básicas
Diferenças avançadas
No SQL:
SELECT
, bem como DML (INSERT
,UPDATE
,DELETE
) declarações na mesma, enquanto que a função só permiteSELECT
declaração nele.SELECT
instrução, enquanto que Funções podem ser incorporadas em umaSELECT
instrução.WHERE
(ou aHAVING
ou aSELECT
), enquanto as funções podem.JOIN
bloco com outras tabelas.JOIN
blocos e outras operações de conjunto de linhas.fonte
Mais estritamente, uma função f obedece à propriedade que f (x) = f (y) se x = y, ou seja, calcula o mesmo resultado cada vez que é chamada com o mesmo argumento (e, portanto, não altera o estado do sistema.)
Portanto, rand () ou print ("Hello") etc. não são funções, mas procedimentos. Embora o sqrt (2.0) deva ser uma função: não há efeito observável ou mudança de estado, independentemente da frequência com que alguém o chame e ele retorne sempre 1,41 e alguns.
fonte
Se formos independentes da linguagem aqui, o procedimento geralmente especifica uma série de atos necessários para alcançar de maneira confiável e idempotente determinado resultado. Ou seja, um procedimento é basicamente um algoritmo.
Funções, por outro lado, é um pedaço de código um tanto independente em um programa maior. Em outras palavras, função é a implementação de um procedimento.
fonte
Essa é uma pergunta antiga bem conhecida, mas eu gostaria de compartilhar mais algumas idéias sobre pesquisa e design de linguagem de programação moderna.
Resposta básica
Tradicionalmente (no sentido de programação estruturada ) e informalmente, um procedimento é uma construção estrutural reutilizável para "entrada" e para fazer algo programável. Quando algo é necessário para ser feito dentro de um procedimento, você pode fornecer argumentos (reais) para o procedimento em uma chamada de procedimento codificada no código-fonte (geralmente em um tipo de expressão) e as ações codificadas no corpo dos procedimentos (fornecido na definição do procedimento) será executado com a substituição dos argumentos nos parâmetros (formais) usados no corpo.
Uma função é mais do que um procedimento porque os valores de retorno também podem ser especificados como "saída" no corpo. As chamadas de função são mais ou menos iguais às chamadas de procedimento, exceto que você também pode usar o resultado da chamada de função sintaticamente (geralmente como uma subexpressão de alguma outra expressão).
Tradicionalmente, chamadas de procedimento (em vez de chamadas de função) são usadas para indicar que nenhuma saída deve estar interessada e deve haver efeitos colaterais para evitar que a chamada não seja operacional, enfatizando o paradigma de programação imperativa . Muitas linguagens de programação tradicionais como o Pascal fornecem "procedimentos" e "funções" para distinguir essa diferença intencional de estilos.
(Para ficar claro, a "entrada" e a "saída" mencionadas acima são noções simplificadas baseadas nas propriedades sintáticas das funções. Muitos idiomas também suportam a passagem de argumentos para parâmetros por referência / compartilhamento, para permitir que os usuários transportem informações codificadas nos argumentos durante as chamadas. Esse parâmetro pode até ser chamado apenas de "parâmetro de entrada / saída". Esse recurso baseia-se na natureza dos objetos transmitidos nas chamadas, ortogonais às propriedades do recurso do procedimento / função.)
No entanto, se o resultado de uma chamada de função não for necessário, ele pode ser apenas (pelo menos logicamente) ignorado, e as definições de função / chamadas de função devem ser consistentes com as definições de procedimento / chamadas de procedimento dessa maneira. Linguagens do tipo ALGOL, como C, C ++ e Java, todas fornecem o recurso de "função" dessa maneira: codificando o tipo de resultado
void
como um caso especial de funções parecidas com procedimentos tradicionais, não há necessidade de fornecer o recurso de "procedimentos "separadamente. Isso evita inchaço no design da linguagem.Como o SICP é mencionado, também é importante notar que, na linguagem do esquema especificada por R n RS , um procedimento pode ou não precisar retornar o resultado da computação. Esta é a união da "função" tradicional (retornando o resultado) e do "procedimento" (retornando nada), essencialmente igual ao conceito de "função" de muitas linguagens semelhantes ao ALGOL (e compartilhando ainda mais garantias, como avaliações aplicativas do operandos antes da chamada). No entanto, diferenças à moda antiga ainda ocorrem mesmo em documentos normativos como o SRFI-96 .
Não sei muito sobre as razões exatas por trás da divergência, mas, como experimentei, parece que os designers de linguagem ficarão mais felizes sem as incertezas da especificação atualmente. Ou seja, "procedimento" como um recurso independente é desnecessário. Técnicas como o
void
tipo já são suficientes para marcar o uso em que os efeitos colaterais devem ser enfatizados. Isso também é mais natural para os usuários que têm experiências em idiomas do tipo C, populares por mais de algumas décadas. Além disso, evita o constrangimento em casos como R n RS, onde "procedimentos" são realmente "funções" no sentido mais amplo.Em teoria, uma função pode ser especificada com um tipo de unidade especificado como o tipo do resultado da chamada de função para indicar que o resultado é especial. Isso distingue os procedimentos tradicionais (onde o resultado de uma chamada é desinteressado) dos outros. Existem diferentes estilos no design de um idioma:
#inert
) também funciona.void
tipo em idiomas semelhantes ao ALGOL é exatamente um exemplo dessa técnica. O ISO C11_Noreturn
é semelhante, mas mais sutil, nesse tipo.Leitura adicional
Como o conceito tradicional derivado da matemática, há toneladas de magia negra que a maioria das pessoas não se importa em conhecer. A rigor, você provavelmente não esclarecerá tudo isso de acordo com seus livros de matemática. Os livros de CS também podem não fornecer muita ajuda.
No que diz respeito às linguagens de programação, existem várias advertências:
{{{}}, {}}
...) além de alguns contextos limitados .fonte
Na maioria dos contextos: uma função retorna um valor, enquanto um procedimento não. Ambos são pedaços de código agrupados para fazer a mesma coisa.
No contexto de programação funcional (onde todas as funções retornam valores), uma função é um objeto abstrato:
Aqui, f é a mesma função que g, mas é um procedimento diferente.
fonte
Procedimento interno, podemos usar instruções DML (Insert / Update / Delete), mas a função Inside não pode usar instruções DML.
O procedimento pode ter ambos os parâmetros de entrada \ saída, mas a função pode ter apenas um parâmetro de entrada.
Podemos usar o bloco Try-Catch no procedimento armazenado, mas na função Não podemos usar o bloco Try-Catch.
Não podemos usar o procedimento armazenado na instrução Select, mas na função podemos usar na instrução Select.
O procedimento armazenado pode retornar valores 0 ou n (máximo 1024), mas a função pode retornar apenas 1 valor obrigatório.
O procedimento armazenado não pode ser chamado de Function, mas podemos chamar a função de Stored Procedure.
Podemos usar a transação no Procedimento Armazenado, mas na função Não podemos usar a transação.
Não podemos usar o Procedimento Armazenado na instrução Sql em nenhum lugar da seção Onde / Ter / selecionar, mas podemos usar a função.
Não podemos ingressar no Stored Procedure, mas podemos ingressar na função.
para mais informações ... clique aqui ... http://dotnet-developers-cafe.blogspot.in/2013/08/difference-between-stored-procedure-and.html
fonte
Uma função retorna um valor e um procedimento apenas executa comandos.
A função nome vem da matemática. É usado para calcular um valor com base na entrada.
Um procedimento é um conjunto de comandos que podem ser executados em ordem.
Na maioria das linguagens de programação, até as funções podem ter um conjunto de comandos. Portanto, a diferença está apenas no retorno de uma parte do valor.
Mas se você gosta de manter uma função limpa (basta olhar para as linguagens funcionais), é necessário garantir que uma função não tenha efeito colateral.
fonte
A função pode ser usada em uma instrução sql, enquanto o procedimento não pode ser usado em uma instrução sql.
Instruções Insert, Update e Create não podem ser incluídas na função, mas um procedimento pode ter essas instruções.
O procedimento suporta transações, mas as funções não suportam transações.
A função deve retornar um e apenas um valor (outro pode ser retornado pela variável OUT), mas o procedimento retorna tantos conjuntos de dados e valores de retorno.
Os planos de execução de funções e procedimentos são armazenados em cache, portanto, o desempenho é o mesmo nos dois casos.
fonte
Eu me oponho a algo que continuo vendo repetidamente na maioria dessas respostas, que o que torna uma função uma função é que ela retorna um valor.
Uma função não é apenas um método antigo que retorna um valor. Não é assim: para que um método seja uma função real, ele deve retornar o mesmo valor sempre com uma entrada específica. Um exemplo de método que não é uma função é o
random
método na maioria dos idiomas, porque, embora retorne um valor, o valor nem sempre é o mesmo.Uma função, portanto, é mais semelhante a um mapa (por exemplo, onde
x -> x'
uma função unidimensional). Essa é uma distinção muito importante entre métodos e funções regulares porque, quando se lida com funções reais, o momento e a ordem em que são avaliadas nunca devem importar onde, pois nem sempre é o caso das não funções.Aqui está outro exemplo de método que não é uma função, mas que ainda assim retornará um valor.
Objeto ainda mais a noção de que os procedimentos não retornam valores. Um procedimento é apenas uma maneira específica de falar sobre uma função ou método. Portanto, se o método subjacente que seu procedimento define ou implementa retorna um valor, adivinhe o que esse procedimento retorna. Tomemos, por exemplo, o seguinte trecho do SICP :
Você já ouviu falar de procedimentos recursivos ultimamente? Eles estão falando sobre uma função recursiva (uma função real) e está retornando um valor e estão usando a palavra "procedure". Então qual é a diferença então?
Bem, outra maneira de pensar em uma função (além do significado mencionado acima) é como uma representação abstrata de um ideal como o numeral 1. Um procedimento é a implementação real dessa coisa. Eu pessoalmente acho que eles são intercambiáveis.
(Observe que, se você ler esse capítulo no link que forneço, poderá achar que um conceito mais difícil de entender não é a diferença entre uma função e um procedimento, mas um processo e um procedimento. Você sabia que um procedimento recursivo pode ter um processo interativo?)
Um análogo para procedimentos são receitas. Por exemplo; suponha que você tenha uma máquina chamada
make-pies
esta máquina consome ingredientes(fruit, milk, flower, eggs, sugar, heat)
e esta máquina retorne apie
.Uma representação desta máquina pode parecer
Claro que essa não é a única maneira de fazer uma torta.
Nesse caso, podemos ver que:
Essa analogia é boa, mas é quebrada quando você leva em consideração que, ao lidar com um programa de computador, tudo é uma abstração. Portanto, diferentemente do caso de uma receita para uma máquina, estamos comparando duas coisas que são abstrações; duas coisas que podem muito bem ser a mesma coisa. E eu sustento que eles são (para todos os efeitos) a mesma coisa.
fonte
No contexto do db : Stored procedure é o plano de execução pré - compilado , onde as funções não são.
fonte
Em termos de С # / Java, função é o bloco de código, que retorna um valor específico, mas procedure é o bloco de código que retorna nulo (nada). Em C # / Java, as funções e os procedimentos mais frequentemente chamam apenas métodos .
fonte
Procedimentos: 1. Procedimentos são as coleções de instruções que definem cálculos parametrizados. 2. Os procedimentos não podem retornar valores.
3. Os procedimentos não podem ser chamados a partir da função.
Funções 1. As funções se assemelham estruturalmente a procedimentos, mas são semanticamente modeladas em funções matemáticas. 2. Pode retornar valores 3. A função pode ser chamada de procedimentos.
fonte
Procedimentos e funções são sub-rotinas, a única diferença entre eles é que um procedimento retorna vários valores (ou pelo menos pode fazer), enquanto uma função pode retornar apenas um valor (é por isso que a notação de função é usada em matemática, pois geralmente apenas um valor é encontrado em um determinado momento), embora algumas linguagens de programação não sigam essas regras, essas são suas verdadeiras definições
fonte
return
nada. Você está falando sobre efeitos colaterais, que são possíveis com os dois (se permitido pelo idioma).