Qual é o nome equivalente de “procedure” em OOP?

4

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 ?

    
por AeroCross 10.09.2012 / 05:23
fonte

5 respostas

22
O

Método como conceito engloba as notações da função e do procedimento .

    
por 10.09.2012 / 05:27
fonte
7

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 .

    
por 10.09.2012 / 08:34
fonte
4

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.

    
por 10.09.2012 / 10:42
fonte
2

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.

    
por 10.09.2012 / 12:32
fonte
0

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.

    
por 10.09.2012 / 11:56
fonte