método vs função vs procedimento

95

Pergunta simples, mas muitas vezes ouço esses três termos definidos com tanta ferocidade, mas que soubemos que significam coisas diferentes ao longo dos anos.

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

    
por Django Reinhardt 23.11.2010 / 18:33
fonte

6 respostas

94

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

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

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 possa chamar isso de procedimento.

Claro, em Pascal, os procedimentos não retornam valores e funções retornam valores, mas isso é apenas um reflexo de como o Pascal foi projetado. Em 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, sendo que apenas uma delas realmente usa o termo "procedimento" para significar qualquer 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 que está associada a um objeto. Embora nem sempre isso seja consistente. C ++, por exemplo, geralmente usa o termo "função de membro" em vez de método (embora o termo "método" tenha penetrado no vernáculo de C ++ entre programadores).

O ponto é que nada disso é realmente consistente. Simplesmente reflete a terminologia empregada por quaisquer idiomas que estejam em voga na época.

    
por 23.11.2010 / 20:37
fonte
61

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

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

    
por 23.11.2010 / 18:41
fonte
48

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 nenhum efeito colateral (registrando, talvez, ou causando mudanças de estado fora dela), então é 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 mutação de um parâmetro de entrada!)

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

Na maioria dos idiomas OO principais, essas variáveis fechadas são chamadas de campos de 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 .

    
por 23.11.2010 / 18:59
fonte
14

Bruce tem uma boa resposta . Eu adicionaria semanticamente:

  • Um procedimento deve "fazer alguma coisa" 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) computar 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
por 23.11.2010 / 18:51
fonte
4

boas respostas detalhadas acima; o conto é que eles são todos 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

os métodos são termos OOP genéricos no momento

no SQL, os procedimentos armazenados têm saídas, mas normalmente 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!

    
por 24.11.2010 / 18:23
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ê-la

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

    
por 04.01.2013 / 23:39
fonte