Qual è la differenza tra una funzione e un metodo?

5

Ho sentito che i metodi sono più orientati agli oggetti rispetto alle funzioni. Mi chiedevo se qualcuno potesse mostrarmi un esempio di una funzione e un metodo e spiegare le differenze tra metodi e funzioni?

Ho preso 3 quarti di programmazione Java e le funzioni non sono mai state menzionate, voglio sapere le differenze, i punti di forza e di debolezza.

    
posta Andrew 26.12.2013 - 06:43
fonte

4 risposte

27

Parlando rigorosamente, procedure è una subroutine che viene eseguita esclusivamente per i suoi effetti collaterali (come la stampa di qualcosa sullo schermo) e non restituisce alcun valore. Una function è una subroutine che restituisce sempre lo stesso valore dato gli stessi input e non ha effetti collaterali. Un method è una procedura o funzione associata a una classe o ad un oggetto.

La parte confusa è quando le persone usano questi termini, non si riferiscono sempre alle definizioni pure. Per motivi di praticità e coerenza, i linguaggi di programmazione non sempre fanno una distinzione tra funzioni, procedure e metodi. Hanno uno o due modi per dichiarare una subroutine e se è tecnicamente una funzione, una procedura o un metodo dipende da come lo sta usando il programmatore.

In Java, ad esempio, viene creato un procedure avendo un tipo di ritorno void su un metodo. Un function è un metodo con un tipo di ritorno e senza effetti collaterali, come:

int add(int x, int y) {
    return x + y;
}

Le persone la cui unica esperienza di programmazione è in un linguaggio come Java spesso non si rendono nemmeno conto che c'è una differenza, perché in Java di solito non ha importanza in senso pratico. In un contesto java-only, i programmatori fanno spesso riferimento a qualsiasi subroutine come function , anche da coloro che conoscono la differenza, e per lo più non vengono corretti se non dal molto pedante.

Confrontalo con un linguaggio di programmazione funzionale in cui la differenza tra una procedura e una funzione è critica e imposta dal compilatore. In quel contesto, sarai messo alla berlina per usare un termine quando intendi l'altro.

La programmazione funzionale ha molti sostenitori che ne apprezzeranno i vantaggi. Cerca solo "vantaggi della programmazione funzionale". In poche parole, le funzioni pure sono facili da comporre, eseguire pigramente o fuori uso e parallelizzare.

Lo svantaggio è che molti programmi del mondo reale riguardano in gran parte lo stato, e la maggior parte dei programmatori trova più semplice ragionare sullo stato in modo imperativo.

    
risposta data 26.12.2013 - 17:19
fonte
3

Non ci sono funzioni di per sé in Java. Tutto quello che hai sono i metodi. Per imitare le funzioni, Java generalmente utilizza metodi statici (come in java.lang.Math ).

Esistono numerosi linguaggi orientati agli oggetti che forniscono funzioni indipendenti, tra cui Python, Ruby, JavaScript, C ++, Object Pascal e anche (yuck) PHP. C'è una buona ragione dietro a questo.

Un metodo è fondamentalmente una funzione con un parametro aggiuntivo (invisibile in Java). Si fa riferimento ad esso come this . Quella cosa this ti consente di accedere all'oggetto il cui metodo viene chiamato, così puoi pensare che l'intero oggetto sia sempre un parametro implicito per un metodo, in aggiunta ai parametri che normalmente definisci.

Un metodo ha senso se fa uso del suo oggetto: chiama altri metodi e / o accede ai membri dei dati. Ad esempio, un elenco può avere un metodo getLength() che sa come calcolare la lunghezza dell'elenco, ad es. esaminando ciascun membro. Ovviamente utilizza l'oggetto implicito this , ovvero l'elenco. Questo è il motivo per cui non ha bisogno di parametri espliciti.

Altrimenti, una funzione è sufficiente. Ad esempio, per calcolare un coseno di un angolo hai solo bisogno dell'angolo e nessun altro stato, quindi cos(float angle) potrebbe essere una funzione, e dipende solo dal parametro angle esplicito.

Un'altra cosa importante è il metodo che sovrascrive . (Per il mio ming, questa è una pratica discutibile, ma Java lo usa molto ampiamente.) Dichiari una certa classe (chiamala Z ) una sottoclasse di un'altra classe (chiamala A ) e modifica l'implementazione di alcuni dei suoi metodi (supponiamo di eseguire il metodo overrode foo() ).

La sottoclasse funziona come la classe base (si dice che fornisca la stessa interfaccia ) ma lo fa con diversi mezzi. In base al principio di sostituzione di Liskov , puoi dichiarare una variabile di tipo A , assegnargli un'istanza di tipo Z e invoca il metodo foo() ; ciò che verrà invocato è l'implementazione di Z di foo() , non A 's. Cioè, il metodo da chiamare verrà cercato in fase di runtime, in base al tipo effettivo dell'oggetto. Questo è noto come "metodo di invio dinamico" o "metodi virtuali".

Il metodo che sovrascrive fornisce automaticamente non è facile da emulare direttamente con le funzioni. (Con le funzioni, le cose simili vengono solitamente eseguite con "callback" o "funzioni di ordine superiore").

In alcune lingue, come Java e C #, puoi definire "metodi statici" che non ricevono un parametro this . Funzionano esattamente come funzioni "standalone" e usano la classe come spazio dei nomi. Talvolta il namespace può avere senso quando viene usato un metodo statico di una classe per cercare o creare nuove istanze di quella classe.

Spero che ora abbia un quadro migliore.

    
risposta data 26.12.2013 - 08:54
fonte
0

Non ci sono vere differenze tra i metodi, le funzioni e le procedure, sono tutti la stessa bestia: una subroutine, una sezione di un programma, spesso chiamata a fare un compito specifico.

Un metodo è solo una funzione con un altro nome.

Anche java ha funzioni: in "a + b" l'operatore "+" è una funzione. Anche se ha un altro nome.

Immagina di creare una nuova lingua: JavaBlub, che è una copia letterale di Java tranne una cosa: non ha metodi, ha blubzorz. E blubzorz in JavaBlub fa la stessa cosa dei metodi in Java.

Mi prenderesti sul serio quando metterò una faccia seria e dirò: JavaBlub è diverso da Java perché non usa metodi?

    
risposta data 29.04.2016 - 10:49
fonte
0

Secondo me in Java non ci sono functions . Tutto quello che abbiamo sono:

  1. Metodi dell'oggetto
  2. Metodi di classe (quelli statici)

Le funzioni, come funzioni standalone , non esistono in Java.

Vorrei sostenere la mia risposta breve e categorica, citando la pagina Web ufficiale di Java

Software objects are conceptually similar to real-world objects: they too consist of state and related behavior. An object stores its state in fields (variables in some programming languages) and exposes its behavior through methods (functions in some programming languages). Methods operate on an object's internal state and serve as the primary mechanism for object-to-object communication. Hiding internal state and requiring all interaction to be performed through an object's methods is known as data encapsulation — a fundamental principle of object-oriented programming.

Ecco il link (Nel caso in cui qualcuno voglia iniziare con concetti Java prima di iniziare con il linguaggio puro)

Tutorial Java - Che cos'è un oggetto?

Suppongo che chiamiamo spesso funzioni per metodi indistintamente. Nel mio caso è questione di eredità. Le mie prime lingue erano C e Visual Basic. Devo progettare un algoritmo con diagrammi di flusso dove processi (al diagramma) sono stati spesso chiamati (dal mio insegnante) funzioni o procedure . Quindi mi trovo (abbastanza spesso) a lavoro, dicendo funzione invece di metodi .

Quando stavo iniziando con Java (10 anni fa), il mio insegnante ha provato a taggare metodi in 2 gruppi:

Processori . Quei metodi che provocano una modifica agli argomenti ricevuti o all'attributo dell'oggetto (cambiamento di stato). Indica se restituisce valori ( void ). O generare un nuovo valore nel sistema. Se è persistente o meno.

I consulenti sono quelli che non causano modifiche all'oggetto (attributi) o alla classe (attributi statici)

In quel momento ho trovato questa catalogazione davvero utile nella fase di progettazione. Nel complesso perché questi termini mi erano familiari perché C e V.B.

Alcuni anni dopo, e dopo così tante cattive pratiche e innumerevoli righe di "codice hilarius", non oserei proporre tale etichettatura.

In pratica, finiamo per mescolare entrambi i concetti in metodi che fanno entrambe le cose. Ma questa è una questione di best practice (o cattiva, dipende dalle tue linee morte). Incoraggio sempre i miei colleghi a essere coerenti con la funzionalità del loro codice e il modo in cui definiscono i metodi e i loro nomi.

Questo è il mio modesto contributo alla domanda: -)

Spero ti sarà d'aiuto.

    
risposta data 28.04.2016 - 18:20
fonte

Leggi altre domande sui tag