Método como conceito engloba as notações da função e do procedimento .
Em vários dos meus cursos de programação na Universidade, meus professores sempre me disseram o seguinte:
A function and a procedure are basically the same thing: the only difference is that a function returns a value, and the procedure doesn't.
Isso significa que isso:
function sum($a, $b) {
return $a + $b;
}
... é uma função e isso:
function sum($a, $b) {
echo $a + $b;
}
... é um procedimento .
Na mesma linha de pensamento, vi que um método é o equivalente a uma função no mundo da OOP.
Isso significa que isso:
class Example {
function sum($a, $b) {
return $a + $b;
}
}
É um método - mas como você chama isso?
class Example {
function sum($a, $b) {
echo $a + $b;
}
}
Qual é o nome equivalente ou como você chama um método que não retorna nada ?
Método como conceito engloba as notações da função e do procedimento .
A programação imperativa distingue os blocos de retorno de valor dos blocos de execução de código através de nomes: função e procedimento. OOP não; como Jesse explicou, ambos são chamados de métodos. Este é um dos maiores problemas na transição entre linguagens de programação (e, de fato, naturais): eles não apenas usam termos diferentes para as mesmas coisas, eles nem sequer concordam sobre quais coisas contam como "o mesmo". "e quais não são .
Um dos Princípios de Projeto Orientados a Objetos estabelecido por Bertrand Meyer em seu livro Construção de Software Orientado a Objetos é o Princípio de Segregação de Comando / Consulta . Nele, ele sugere que todo método deveria ser uma Query , que ele define ser um método puro, referencialmente transparente, que retorna (uma função de) algum estado interno e não tem efeitos colaterais, ou um Comando que altera algum estado interno ou realiza um efeito colateral, e que tem somente efeitos colaterais e não retorna um valor.
Então, seguindo essa terminologia, você poderia chamá-los de Métodos de consulta e Métodos de comando .
Outra possibilidade que eu encontrei é chamá-los de Métodos Funcionais ou Métodos Processuais .
Métodos Puros e Métodos Impure também são usados às vezes.
Observe que, como @Loki Astari apontou em seu comentário sobre sua pergunta, não existe um nome universalmente aceito para uma sub-rotina que tenha ambos os efeitos colaterais e retorne um valor. Algumas pessoas chamam isso de procedimento, alguns chamam de função impura, C, JavaScript e Python apenas chamam de função. O mesmo se aplica aos métodos também.
Essa distinção entre funções e procedimentos pode ser rastreada até Pascal e talvez ainda mais. Eu especularia que essa é uma tentativa de acomodar separação de comandos e consultas no design da linguagem, onde os comandos seriam executados por procedimentos e consultas são realizadas por funções.
Acredito que a palavra função foi escolhida aqui para enfatizar o fato de que uma consulta deveria, na verdade, ser uma função no significado matemático do termo, ou seja, repetindo a mesma chamada repetidamente o mesmo resultado. uma qualidade frequentemente denominada como transparência referencial . Isso não se aplica às sub-rotinas em geral e Pascal não vinculou essa qualidade ao conceito de uma função, random
sendo a prova canônica disso.
No que diz respeito a se uma sub-rotina retorna um valor ou não, não há muita diferença entre uma sub-rotina, que retorna um valor diretamente, ou uma que toma uma variável por referência e armazena seu resultado nessa variável.
Em algumas linguagens, especialmente as dinâmicas, até mesmo as sub-rotinas que não retornam explicitamente um valor, o fazem implicitamente. Por exemplo, "procedimentos" JavaScript retornam undefined
nesses casos.
Existem várias maneiras de definir procedimentos e funções. Para mim, a definição sensata é que as funções são procedimentos referencialmente transparentes. Tais funções são freqüentemente chamadas de funções puras . Isso pode ser usado em um contexto OOP. Você também pode falar de comandos e consultas, ou de mutadores e acessadores. Mas, novamente, uma ideia central da OOP não é fazer suposições sobre o que está acontecendo no proprietário do método. Então, no nível de abstração que "OOP é realmente sobre" a distinção não existe. Existem apenas métodos.
Uma função é uma coleção de instruções de computação. Então é um procedimento. Em algumas linguagens retentivas muito anal, no entanto, uma função retorna um valor e um procedimento não. Em tais linguagens, procedimentos são geralmente usados para seus efeitos colaterais (como I / O), enquanto funções são usadas para cálculos e tendem a evitar efeitos colaterais. (Esse é o uso que eu costumo favorecer. Sim, eu sou aquele retentivo anal.)
A maioria das linguagens não é um retentivo anal, e como resultado as pessoas usarão os termos "função" e "procedimento" de forma intercambiável, preferindo um ao outro com base em seus antecedentes. (Modula- * programadores tenderão a usar "procedure" enquanto C / C ++ / Java / qualquer um tenderá a usar "function", por exemplo.)Um método é apenas um jargão para uma função (ou procedimento) vinculada a uma classe. De fato, nem todas as linguagens OOP usam o termo "método". Em uma implementação típica (mas não universal!), Os métodos têm um primeiro parâmetro implícito (chamado coisas como esta ou self ou similar) para acessar a classe que o contém. Isto não é, como eu disse, universal. Algumas linguagens fazem com que o primeiro parâmetro seja explícito (e, portanto, permite que seja nomeado qualquer coisa que você queira), enquanto que em outros ainda não há nenhum parâmetro mágico em primeiro lugar.
class MyClass
{
int memberVariable;
void setMemberVariableProcedure(int v)
{
memberVariable = v;
}
int getMemberVariableFunction()
{
return memberVariable;
}
};
void plainOldProcedure(int stuff)
{
cout << stuff;
}
int plainOldFunction(int stuff)
{
return 2 * stuff;
}
Neste código, getMemberVariableProcedure
e getMemberVariableFunction
são os dois métodos.