Qual è il nome equivalente di "procedura" in OOP?

4

In molti dei miei corsi di programmazione nell'università, i miei insegnanti mi hanno sempre detto quanto segue:

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.

Questo significa che:

function sum($a, $b) {
    return $a + $b;
}

... è una funzione e questo:

function sum($a, $b) {
    echo $a + $b;
}

... è una procedura .

Nello stesso modo di pensare, ho visto che un metodo è l'equivalente di una funzione nel mondo OOP.

Questo significa che:

class Example {
    function sum($a, $b) {
        return $a + $b;
    }
}

È un metodo , ma come si chiama?

class Example {
    function sum($a, $b) {
        echo $a + $b;
    }
}

Qual è il nome equivalente, o come si chiama un metodo che non restituisce nulla ?

    
posta AeroCross 10.09.2012 - 05:23
fonte

5 risposte

22

Il metodo come concetto comprende sia la funzione che la procedura notazioni.

    
risposta data 10.09.2012 - 05:27
fonte
7

La programmazione imperativa distingue i blocchi che restituiscono valore da blocchi che eseguono solo codice tramite nomi: funzione e procedura. OOP no; come ha spiegato Jesse, entrambi sono chiamati metodi. Questo è uno dei maggiori problemi nello spostamento tra linguaggi di programmazione (e, di fatto, naturali): non solo usano termini diversi per le stesse cose, non sono neanche d'accordo su quali cose contino come "lo stesso "e quali non .

    
risposta data 10.09.2012 - 08:34
fonte
4

Uno dei Principi di progettazione orientati agli oggetti enunciati da Bertrand Meyer nel suo libro Object-Oriented Software Construction è il Comando / Query Segregation Principle . In esso suggerisce che ogni metodo dovrebbe essere una Query , che definisce come un metodo puro, referenzialmente trasparente che restituisce (una funzione di) uno stato interno e non ha effetti collaterali, o un Comando che altera alcuni stati interni o esegue un effetto collaterale e che ha solo effetti collaterali e non restituisce un valore.

Quindi, seguendo questa terminologia, potresti chiamarli Metodi di query e Metodi di comando .

Un'altra possibilità che ho incontrato è chiamarli Metodi funzionali o Metodi procedurali .

Pure Metri e Metodi impuri sono talvolta usati anche.

Da notare che @Loki Astari ha sottolineato nel suo commento sulla tua domanda che non esiste un nome universalmente accettato per una subroutine che ha entrambi gli effetti collaterali e restituisce un valore. Alcuni la chiamano una procedura, alcuni la chiamano una funzione impura, C, JavaScript e Python la chiamano semplicemente una funzione. Lo stesso vale anche per i metodi.

    
risposta data 10.09.2012 - 10:42
fonte
2

Questa distinzione tra funzioni e procedure può essere fatta risalire a Pascal e forse anche oltre. Vorrei ipotizzare che questo è un tentativo di accogliere separazione tra comando e query nella progettazione del linguaggio, dove i comandi dovrebbero essere portati fuori dalle procedure e le query vengono eseguite dalle funzioni.
Credo che la parola funzione sia stata scelta qui per sottolineare il fatto, che una query dovrebbe effettivamente essere una funzione nel significato matematico del termine, cioè ripetere la stessa chiamata ancora e ancora dovrebbe produrre lo stesso risultato - una qualità spesso definita come trasparenza referenziale . Questo non si applica alle subroutine in generale e Pascal non ha effettivamente legato questa qualità al concetto di una funzione, random è la prova canonica di ciò.

Per quanto riguarda il fatto che una subroutine ritorni o meno un valore, non c'è molta differenza tra una subroutine, che restituisce un valore direttamente, o uno che prende una variabile per riferimento e memorizza il suo risultato in quella variabile. In alcune lingue, in particolare quelle dinamiche, anche le subroutine che non restituiscono esplicitamente un valore, lo fanno in modo implicito. Ad esempio, "procedure" JavaScript restituiscono undefined in questi casi.

Ci sono molti modi per definire procedure e funzioni. Per me, la definizione ragionevole è che le funzioni sono procedure referenzialmente trasparenti. Tali funzioni sono spesso chiamate pure funzioni . Questo può essere usato in un contesto OOP. Puoi anche parlare di comandi e query, o di mutatori e accessori. Ma poi di nuovo, un'idea centrale di OOP non è quella di fare supposizioni su ciò che sta accadendo all'interno del proprietario del metodo. Quindi, a livello di astrazione che "OOP è in realtà", la distinzione non esiste. Ci sono solo metodi.

    
risposta data 10.09.2012 - 12:32
fonte
0

Una funzione è una raccolta di istruzioni informatiche. Quindi è una procedura. In alcuni linguaggi ritentivi molto anali, tuttavia, una funzione restituisce un valore e una procedura no. In tali linguaggi le procedure sono generalmente utilizzate per i loro effetti collaterali (come I / O) mentre le funzioni sono utilizzate per i calcoli e tendono ad evitare effetti collaterali. (Questo è l'uso che tendo a favorire, sì, io sono quel ritentivo anale.)

La maggior parte delle lingue non è quella ritenzione anale, tuttavia, e di conseguenza le persone useranno i termini "funzione" e "procedura" in modo intercambiabile, preferendo l'una all'altra in base al loro background. (Modula- * i programmatori tenderanno ad usare la "procedura" mentre C / C ++ / Java / qualunque cosa tenderà ad usare "funzione", per esempio.)

Un metodo è solo un gergo per una funzione (o una procedura) associata a una classe. In effetti, non tutte le lingue OOP usano il termine "metodo". In un'implementazione tipica (ma non universale!), I metodi hanno un primo parametro implicito (chiamato cose come questo o self o simili) per accedere alla classe contenente. Questo non è, come ho detto, universale. Alcuni linguaggi rendono esplicito quel primo parametro (e quindi consentono di essere nominati come desideri) mentre in altri ancora non esiste affatto un primo parametro magico.

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;
}

In questo codice getMemberVariableProcedure e getMemberVariableFunction sono entrambi metodi.

    
risposta data 10.09.2012 - 11:56
fonte

Leggi altre domande sui tag