Método vs Função vs Procedimento

107

Pergunta simples, mas muitas vezes ouço esses três termos definidos com tanta ferocidade, mas que me são conhecidos por significar coisas diferentes ao longo dos anos.

Quais são as definições "corretas" de "Procedimentos", "Métodos", "Função", "Sub-rotinas", etc?

Django Reinhardt
fonte
4
você abrir mão "de rotina"
Mefisto
1
@teresko: Eu acho que "sub-rotina" é mais comum.
Mk12 07/07

Respostas:

108

Eu vou com uma resposta diferente aqui: praticamente falando, não há realmente nenhuma diferença , com a pequena exceção de que "método" geralmente se refere a uma sub-rotina associada a um objeto nas linguagens OO.

Os termos "procedimento, função, sub-rotina, subprograma e método" realmente significam a mesma coisa: um subprograma que pode ser chamado dentro de um programa maior. Mas é difícil chegar a uma definição que capture todos os usos variantes desses termos, porque eles não são usados ​​consistentemente em linguagens ou paradigmas de programação.

Você pode dizer que uma função retorna um valor. Bem, a seguinte função C não retorna um valor:

void f() { return; }

... mas duvido que você encontre alguém que chame isso de procedimento.

Certamente, em Pascal, os procedimentos não retornam valores e as funções retornam valores, mas isso é apenas um reflexo de como Pascal foi projetado. No Fortran, uma função retorna um valor e uma sub-rotina retorna vários valores. No entanto, nada disso realmente nos permite chegar a uma definição "universal" para esses termos.

De fato, o termo "programação procedural" refere-se a toda uma classe de linguagens, incluindo C, Fortran e Pascal, apenas uma das quais realmente usa o termo "procedimento" para significar alguma coisa.

Portanto, nada disso é realmente consistente. A única exceção é provavelmente "método", que parece ser usado quase inteiramente com linguagens OO, referindo-se a uma função associada a um objeto. Embora isso nem sempre seja consistente. C ++, por exemplo, geralmente usa o termo "função membro" em vez de método (mesmo que o termo "método" tenha entrado no vernáculo do C ++ entre os programadores.)

O ponto é que nada disso é realmente consistente. Simplesmente reflete a terminologia empregada por qualquer idioma em voga na época.

Charles Salvia
fonte
Foi exatamente isso que pensei que fosse a resposta. (Eu deveria ter adicionado "sub-rotina" como outra variante em retrospectiva.) Posso perguntar: Por que você não encontrou alguém que chama essa função C de "Procedimento"? Porque é tecnicamente incorreto ou porque o termo "procedimento" está atualmente fora de moda?
Django Reinhardt
7
Os programadores de C usam o termo "função" simplesmente porque os projetistas de C usaram esse termo.
Charles Salvia
15
Não vamos jogar o bebê fora com a água do banho. Só porque a terminologia não é usada com total consistência, não significa que os diferentes termos não tenham significados diferentes. As definições de @ Bruce e @ Frank são amplamente reconhecidas, não idiossincráticas. O fato de os significados não serem universais é importante, mas não justifica o salto para "praticamente falando, não há realmente nenhuma diferença". (@Django)
LarsH 23/11
9
Tipo de dual para C ++, que chama métodos "funções-membro", Java e C # chama funções "métodos estáticos".
Jörg W Mittag
2
A resposta de Bruce é definitivamente a que você deve procurar se for iniciante na programação. Suas definições serão absolutamente corretas, 99% das vezes. Mas eu estava procurando mais uma resposta técnica / teórica. Às vezes, os programadores mais novos conhecem apenas seu próprio domínio e insistem que é tudo o que existe. Na realidade, existem programadores trabalhando hoje que ainda usam linguagens antigas e que não estão "errados" por usar definições diferentes. Isso era o que eu estava mais interessado.
Django Reinhardt
67

Uma função retorna um valor, mas um procedimento não.

Um método é semelhante a uma função, mas é interno a parte de uma classe. O termo método é usado quase exclusivamente em programação orientada a objetos.

Bruce Alderman
fonte
8
Não é exatamente interno. Um método é qualquer função ou procedimento que faz parte de uma classe.
Scott Whitlock
8
Portanto, um "Procedimento armazenado" no SQL não retorna nenhum valor? Que tal um "Procedimento" em algo como Pascal? Suas definições são baseadas nas tendências atuais ou devem ser consideradas definições universais? Obrigado!
Django Reinhardt
3
@ Django: No Pascal, um procedimento não pode ter um valor de retorno, e uma função deve ter um valor de retorno. Em alguns outros idiomas, a terminologia pode ser usada mais livremente.
Bruce Alderman
1
FWIW, FORTRAN tinha sub-rotinas e funções desde os primeiros dias, a diferença é que uma sub-rotina não retornava um valor. Não me lembro do ALGOL, do qual Pascal é descendente.
precisa
2
@ 3p1c_d3m0n Certamente é verdade que functioncumpre ambas as funções em JS, mas todas as funções JS retornam. Quando uma declaração de retorno não tem valor, o valor é implicitamente undefined. Quando uma declaração de retorno está ausente, o intérprete adiciona uma declaração de retorno implícita. Esotérico, talvez, mas é consistente com a definição dada aqui. É por isso que var x = function() {}();é legal em JS; se não fosse por retornos implícitos, isso precisaria ser um erro, como seria em Pascal.
Ponto-
52

Uma função é algo que recebe várias entradas e retorna um ou mais valores. Se os valores retornados forem inteiramente determinados pelas entradas e a função não tiver efeitos colaterais (registro, talvez, ou causar alterações de estado fora de si), será chamada de função pura.

Um procedimento é uma função que não retorna um valor. Em particular, isso significa que um procedimento só pode causar efeitos colaterais. (Isso pode incluir a alteração de um parâmetro de entrada!)

Um método é uma função que fecha sobre um conjunto de variáveis, ou seja, um fechamento . Leva zero ou mais parâmetros de entrada, tem acesso a esse conjunto de variáveis ​​e retorna zero ou mais valores. Nas linguagens OO, esses métodos são anexados a objetos ou classes.

Na maioria das linguagens OO convencionais, essas variáveis ​​fechadas são chamadas de campos membros, ou variáveis ​​de instância, de um objeto. Um método pode ser uma função pura, uma função impura ou um procedimento.

A última definição leva à correspondência object = struct + closures .

Frank Shearar
fonte
5
Portanto, um objeto é uma coleção de variáveis ​​e uma coleção de fechamentos sobre essas variáveis ​​comuns. Basicamente, linguagens orientadas a objetos sempre tiveram fechamentos e ninguém sabia? Vista interessante! +1
Giorgio
1
Eu não acredito que a maioria dos métodos feche sobre nada. foo.doSomething()não é sem parâmetros. Ele tem um parâmetro (o objeto foo) fornecido com um pouco de açúcar sintático. Um fechamento seria capaz de referenciar seu objeto sem a necessidade de um parâmetro. Isso não quer dizer que os métodos não podem ser encerramentos, apenas a maioria não, e que ser OO não é suficiente para que um idioma suporte encerramentos.
precisa saber é o seguinte
3
foo.doSomething()fecha sobre a foovariável Qualquer declaração em doSomethingpode acessar fooatravés thisou self, dependendo do seu idioma. Esta é a própria definição de "fechar mais". As classes fecham-se sobre suas variáveis-membro; portanto (ignorando "o que é OO"), o OO é suficiente. Isto é bastante conhecido na literatura ...
Frank Shearar
1
ER não. Vê aquele pouco foo.na frente foo.doSomething()? É você passando doSomething()um parâmetro. Só porque não está entre parênteses, não significa que não seja um parâmetro. O método thisou selfdentro dele é simplesmente açúcar sintático para referenciar esse parâmetro.
8bittree
1
@FrankShearar, eu diria que existem apenas duas distinções razoavelmente claras na computação - dados e instruções. Até isso sai da janela no caso (incomum) de código auto-modificável. Em OO, o que geralmente é chamado de "método" (ou "função-membro") não precisa ser um método ou função por sua definição - todas essas palavras em uso geral são efetivamente sinônimos com um significado geral e intercambiável. A "função impura", cuja existência você alude, é simplesmente outro sinônimo (e também o mais longínquo e jargão) do mesmo conceito geral de "instruções".
Steve
14

Bruce tem uma boa resposta . Eu acrescentaria semanticamente:

  • Um procedimento deve "fazer algo" aos argumentos ou causar algum outro efeito colateral (por exemplo printf)
  • Uma função deve (a) responder a uma pergunta sobre os argumentos ou (b) calcular um novo valor com base nos argumentos
  • Um método de função deve responder a uma pergunta sobre o estado do objeto
  • Um método de procedimento deve alterar o estado do objeto
Scott Whitlock
fonte
Ótima resposta! Apenas uma pequena adição: A procedure should "do something" to the arguments- ou causar algum outro efeito colateral (por exemplo printf).
Allon Guralnek
1
@Allon Observe que printfretorna um valor - o número de caracteres impressos -, de modo que é tecnicamente uma função.
precisa
@ Sjoerd Não concordo que printfseja um valor. Ele teve um efeito colateral específico fora do seu escopo de chamada: I / O para qualquer que seja a saída padrão. Mesmo que Scott não tenha explicitado essa distinção, as funções de programação funcional não devem ter efeitos colaterais e devem poder responder a perguntas como se você tivesse os dados reais que ele retorna.
Alan
4

boas respostas detalhadas acima; a história curta é que todos eles terão sabores de sub-rotinas; o significado de cada termo varia de acordo com o contexto da linguagem de programação

em geral, as funções retornam um valor, mas não precisam

métodos são termos genéricos de POO atualmente

no SQL, os procedimentos armazenados têm saídas, mas geralmente retornam apenas um código de erro, enquanto as funções definidas pelo usuário devem retornar um valor (que pode ser um conjunto de resultados)

novamente, a diferença precisa entre esses termos depende de com quem você está falando!

Steven A. Lowe
fonte
2

80% da proficiência está diretamente relacionada à familiaridade com a nomenclatura,

95% da produtividade é a capacidade de identificar o que é útil no momento, apesar dos termos usados ​​para descrevê-lo

Eu prefiro chamá-los de todos os métodos em c #, exceto quando eu usei o MSSQL que fizemos no sproc, mas é claro que agora usamos o Postgres e eles são chamados de funções.

MvcCmsJon
fonte
13
83,5% de todas as estatísticas são compostas no local ;-P
Django Reinhardt
1
Eu tenho que admitir, fico nervoso quando ouço alguém usar o termo "método" ao trabalhar em um idioma não OO. Parece estar fortemente correlacionado com a execução em código não-idiomático.
Racheet 17/01/14
Eu uso 'Method' quando me refiro ao código C, porque muitos programadores de OO com os quais eu lido têm um colapso mental ao ouvir os termos procedimento ou função. Por diversão, se eu realmente quiser mexer com eles, posso trocar os termos aleatoriamente. A sua não é bom, tipo de como convidar um poltergeist em você casa ... :)
mattnz