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?
programming-practices
coding-standards
terminology
Django Reinhardt
fonte
fonte
Respostas:
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:
... 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.
fonte
Uma função retorna um valor, mas um procedimento não.
Um método é semelhante a uma função, mas é
interno aparte de uma classe. O termo método é usado quase exclusivamente em programação orientada a objetos.fonte
function
cumpre 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 é implicitamenteundefined
. 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 quevar x = function() {}();
é legal em JS; se não fosse por retornos implícitos, isso precisaria ser um erro, como seria em Pascal.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 .
fonte
foo.doSomething()
não é sem parâmetros. Ele tem um parâmetro (o objetofoo
) 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.foo.doSomething()
fecha sobre afoo
variável Qualquer declaração emdoSomething
pode acessarfoo
atravésthis
ouself
, 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 ...foo.
na frentefoo.doSomething()
? É você passandodoSomething()
um parâmetro. Só porque não está entre parênteses, não significa que não seja um parâmetro. O métodothis
ouself
dentro dele é simplesmente açúcar sintático para referenciar esse parâmetro.Bruce tem uma boa resposta . Eu acrescentaria semanticamente:
printf
)fonte
A procedure should "do something" to the arguments
- ou causar algum outro efeito colateral (por exemploprintf
).printf
retorna um valor - o número de caracteres impressos -, de modo que é tecnicamente uma função.printf
seja 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.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!
fonte
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.
fonte