[Java] Differenze tra funzioni e procedure

Discussione in 'Java' iniziata da coppetta, 18 Maggio 2007.

  1. coppetta

    coppetta Nuovo Utente

    Registrato:
    18 Maggio 2007
    Messaggi:
    1
    Mi Piace Ricevuti:
    1
    Punteggio:
    0
    Salve a tutti. Volevo chiedere quali sono secondo voi le principali differenze tra funzioni e procedure nel linguaggi C C++ e Java. Grazie
     
    A ottofonsuppost piace questo elemento.
  2. hellslord

    hellslord Utente Attivo

    Registrato:
    28 Novembre 2006
    Messaggi:
    99
    Mi Piace Ricevuti:
    3
    Punteggio:
    0
    Occupazione:
    Tecnico informatico / Studente 3° anno informatica
    Località:
    Venezia
    Home Page:
    Innanzitutto ciao! :)

    Allora... Partiamo col dire che sia le funzioni sia le procedure fanno parte dei cosìdetti "sottoprogrammi"... La differenza sostanziale che distingue le une dalle altre (ed è anche la differenza più visibile e tangibile) è che le funzioni restituiscono "qualcosa", le procedure no...

    Faccio un esempio in C
    Codice:
    int foo() {
      return 0;
    }
    
    Questa è evidentemente una funzione, in quanto nella sua firma è presente l'indicazione del tipo restituito. In fase di compilazione se mancasse il "return 0;" ci verrebbe restituito un errore. Tra l'altro le funzioni sono "tipizzate", nel senso che non possono restituire qualunque cosa: Devono OBBLIGATORIAMENTE restituire qualcosa che sia del tipo indicato nella firma, o completamente compatibile (i.e. char e int).

    Se io invece scrivo:
    Codice:
    void foo2()
    {
      printf("foo2");
    }
    
    Ho palesemente scritto una procedura... La parola chiave "void" che precede il nome del sottoprogramma nella sua firma sta ad indicare che quel sottoprogramma non restituirà nulla (nel nostro caso si produrrebbe solo la scritta "foo2" nello standard output). Anche nelle procedure è possibile usare "return" ma solo per ritornare il controllo al chiamante (di fatto se inserisco qualcosa dopo il return in una procedura ottengo un errore in compilazione).

    C'è anche un aspetto importante e più sottile: Le funzioni, dato che restituiscono qualcosa, possono essere valutate... Sotto questo profilo possono essere viste come vere e proprie espressioni o parte di esse. Possono infatti stare a destra di un operatore di assegnamento, possono stare a destra o a sinistra di un operatore binario e così via (ovviamente le tipizzazioni devono essere corrette).
    Le procedure invece non possono assolutamente essere viste come espressioni, in quanto non restituendo nulla non possono essere valutate... Le procedure sono più dei "comandi", e come tali vengono eseguiti senza produrre risultati restituiti.

    Tra C, C++ e Java non ci sono grandi differenze... Il discorso che ho fatto prima è validissimo per tutti e tre i linguaggi... Le differenze casomai si riscontrano parlando di oggetti. In effetti C++ e Java sono due linguaggi OOP... Normalmente in questi linguaggi si fa riferimento indistintamente a funzioni e procedure parlando di "metodi". Talvolta si tende a differenziare funzioni e procedure cambiandogli il nome... Le funzioni diventano "metodi osservatori dello stato" e le procedure "metodi modificatori dello stato". Questo perchè tutto è orientato agli oggetti... Se ci pensi (per me è scontato che tu conosca gli oggetti, se non è così quello che segue ti sarà un po' oscuro), le funzioni, restituendo un valore, sono adatte ad essere lo strumento sonda dello stato in cui un oggetto si trova (osservano dunque lo stato): una funzione è ottima se il chiamante vuole sapere in che stato si trova un oggetto (di fatto cosa vale una sua variabile di istanza, o combinazioni di variabili di istanza). Le procedure invece sono molto più adatte per comandare un oggetto, e quindi modificarne lo stato interno (modificando le sue variabili d'istanza).
    Nella programmazione orientata agli oggetti è importantissimo, infine, non confondere metodi costruttori con le procedure... Entrambi non restituiscono nulla, MA i primi sono metodi che inizializzano lo stato di un oggetto, e non restituiscono NEMMENO void, le seconde invece restituiscono void e sono di solito i modificatori dello stato.

    Mi scuso se ho scritto così tanto, ma spero di esserti stato d'aiuto... Se ci sono problemi fai un fischio :)
     
    A ottofonsuppost piace questo elemento.
  3. ottofonsuppost

    ottofonsuppost Utente Attivo

    Registrato:
    10 Maggio 2016
    Messaggi:
    170
    Mi Piace Ricevuti:
    13
    Punteggio:
    18
    L'ottimo commento precedente ha mancato di sottolineare che, tra le differenze tra JAVA ed il linguaggio C++, vi è che in JAVA per protezione dei programmi, il passaggio dei parametri avviene solo per VALORE e mai per riferimento. Infatti il linguaggio C ha una "bestia" capace di far impazzire un programma; ed è proprio il passaggio di un riferimento, di un puntatore di memoria che può facilmente determinare il CRASH di sistema, per memoria esaurita, o per sovrascrittura di parti della memoria, cancellazione, e per, gran finale, la mancata liberazione della memoria precedentemente utilizzata. La matematica dei puntatori è il grave difetto del linguaggio C, che rende vantaggioso l'uso del linguaggio JAVA. Anche se la programmazione ad oggetti sta spopolando, nei linguaggi a basso livello, quelli che dialogano direttamente con il processore e quelli che costruiscono il SISTEMA OPERATIVO, non si può fare a meno della PROGRAMMAZIONE PROCEDURALE che usavamo in passato.
     
Sto caricando...

Condividi questa Pagina