PDA

View Full Version : [Java] Qualche domandina teorica


D4rkAng3l
26-01-2009, 19:21
L'esame di linguaggi di programmazione si avvicina sempre di più (manca una settimana circa)...vi posto quà 2 domande trovate su un vecchio compito...mi dite se vanno bene o se ho sbagliato qualcosa o sono stato incompleto?

1) Che cos'è un effetto collaterale? Descrivere le modalità di occorrenza degli effetti collaterali in Java presentando esempi e mostrare cosa avviene all'interno della memoria

Si dice che un metodo causa un effetto collaterale quando esso modifica una variabile locale o globale al di fuori del proprio scope (cioè se per qualche motivo il metodo riesce a modificare una variabile fuori dal suo campo di visibilità).

In Java si può verificarsi un effetto collaterale SOLO se il parametro di un metodo è un oggetto modificabile.

Un effetto collaterale non è per forza una situazione di errore o un problema, se gestito correttamente a volte può essere l'unica soluzione per risolvere particolari tipi di situazioni come ad esempio la creazione di una lista concatenata di interi in Java che può essere implementata mediante due classi, una classe NodoInt che rappresenta i singoli nodi della lista ed un'altra classe ListaDiInteri che rappresenta la lista in questione con una cosa del tipo:


/** Classe che rappresenta e gestisce singoli nodi di una lista concatenata; Gli oggetti sono MUTABILI */

public class NodoInt{
private int valore; // Valore di tipo intero contenuto nel nodo (è il campo informazione del nodo)
private NodoInt successivo; // Contiene il riferimento ad un oggetto di tipo NodoInt che contiene l'elemento successivo

/** COSTRUTTORE :crea un nodo il cui valore è quello del parametro e che non è concatenato ad alcun altro nodo */

public NodoInt(int n){
valore = n; // Nel campo valore del nuovo nodo creato viene messo il valore del parametro
successivo = null; // Nel campo successivo viene messo il valore null: il nuovo nodo non punta a niente
}

/** Accede in lettura al valore del nodo oggetto ricevente */

public int getValore(){
return valore; // Ritorna il valore contenuto nel nodo oggetto ricevente
}

/** Accede in lettura al riferimento al nodo che segue il nodo oggetto ricevente. *NB: Espone l'oggetto ricevente a
possibili effetti collaterali */

public NodoInt getSuccessivo(){
return successivo;
}

/** Configura l'oggetto ricevente in modo tale da avere il parametro come successore. *NB: Modifica l'oggetto ricevente */

public void setSuccessivo(NodoInt altro){
this.successivo = altro;
}
........................
........................
........................


e


/** Classe che rappresenta e gestisce una lista concatenata di nodi che contengono valori interi; Gli oggetti sono MUTABILI */

public class ListaDiInteri{

private NodoInt N; // Primo nodo della lista

/** COSTRUTTORE: Crea un nuovo oggetto ListaDiInteri che inizialmente è una lista vuota*/

public ListaDiInteri(){
N = null; // Il primo nodo è inizialmente un elemento nullo
}

/** Se il nodo parametro non ha successori lo aggiunge in testa alla lista alla lista, altrimenti crea un nodo il cui
valore coincide con quello del parametro e lo aggiunge in testa alla lista. *NB: Modifica l'oggetto ricevente */

public void aggiungiInTesta(NodoInt altro){
NodoInt T = new NodoInt(altro.getValore()); // Costruisce un nuovo nodo T avente il valore di altro
T.setSuccessivo(N); // Il nodo T è diventatola la nuova testa della lista e punta alla vecchia testa
N = T;
}

/** Crea un nodo il cui valore coincide con il parametro di tipo intero e lo aggiunge in testa alla lista.
*NB: Modifica l'oggetto ricevente */

public void aggiungiInTesta(int n){
NodoInt T = new NodoInt(n);
T.setSuccessivo(N);
N = T;
}
....................
....................
....................


Appare chiaro che gli oggetti NodoInt sono oggetti modificabili in quanto il metodo setSuccessivo() modifica il campo successivo dell'oggetto ricevente per aggiungere un nodo alla lista sfruttando appunto un effetto collaterale.

Magari qualcuno mi fà un'esempio di un effetto collaterale (anche pericoloso) più spicciolo...se mi fà questa domanda all'esame vorrei evitare di impelagarmi a parlare di liste concatenate sul compito :eek:

2) Descrivere le due tecniche per VALORE, per RIFERIMENTO e per VALORE-RISULTATO dei parametri attuali ai parametri formali. Mostrare anche mediante esempi in cosa differiscono

Questo può essere fatto non per forza in Java...io mi troverei meglio a parlare in simil-C per spiegare cosa sono :D

Quando invoco una routine posso passare i parametri in vari modi.
Quando viene invocata una routine con passaggio dei parametri per valori significa che il valore dei parametri attuali viene copiato nei parametri formali sui quali la routine andrà ad operare ed i parametri attuali non saranno in alcun modo modificati dalla computazione della routine.

Esempio passaggio per valore:


int main(){
int a[3] = {1,2,3}
test(a[1], a[2]);
return 0;
}

void test(int x, int y){
x = 0;
y++;
}


In questo caso vengono passati alla routine due parametri formali x ed y contenenti dellecopie dei valori in a[1] ed a[2] (2 e 3). La routine poi rende x pari a 0 ed incremente y di 1, quindi y diventa 4. I valori contenenti nei parametri attuali della routine invocante non vengono modificati. Quando la routine test() termina la propria esecuzione i valori di x ed y sono deallocati.

Se invece il linguaggio usasse il passaggio dei parametri PER RIFERIMENTO sarebbero stati passati gli indirizzi dei parametri attuali che sarebbero stati modificati (è un effetto collaterale?)
*NB: In C non esiste il passaggio per riferimento in quanto è pervisto dal linguaggio solo il passaggio per valore, tuttavia può essere solo simulato il passaggio di riferimento passando i puntatori dei parametri attuali

Se un linguaggio invece implementa il passagio dei parametri per VALORE-RISULTATO succede che:
i parametri attuali sono copiati ne parametri formali per VALORE.
La routine viene eseguita ed alla fine della routine i parametri formali vengono ricopiati nei parametri attuali.

Quindi facendo riferimento all'esempio precedente:

La routine riceve una copia dei valori a[1] ed a[2] dentro x ed y

--> x = 2 ed y=3

Poi viene eseguita la routine: x=0 ed y=4

Ed infine questi valori vengono ricopiati nei parametri attuali (quindi la semantica è diversa: in entrata il passaggio dei dati alla routine è per valore, in uscita è per riferimento) e l'array iniziale è diventato: [1,0,4]

Su quest'ultima cosa non ne sono sicurissimo però...

Grazie
Andrea

Oceans11
26-01-2009, 21:42
1) Che cos'è un effetto collaterale? Descrivere le modalità di occorrenza degli effetti collaterali in Java presentando esempi e mostrare cosa avviene all'interno della memoria

Si dice che un metodo causa un effetto collaterale quando esso modifica una variabile locale o globale al di fuori del proprio scope (cioè se per qualche motivo il metodo riesce a modificare una variabile fuori dal suo campo di visibilità).

In Java si può verificarsi un effetto collaterale SOLO se il parametro di un metodo è un oggetto modificabile.


Esistono 2 tipi di metodi:
1) senza side-effect o funzionale che dovrebbe ad esempio modificare una sola variabile per poi restituirla.
2) con side-effect, nel qual caso il tipo di valore restituito dal metodo dovrebbe essere void.

La definizione precisa è:
"Un metodo effettua side-effect quando modifica lo stato dell'oggetto di invocazione".


Magari qualcuno mi fà un'esempio di un effetto collaterale (anche pericoloso) più spicciolo...se mi fà questa domanda all'esame vorrei evitare di impelagarmi a parlare di liste concatenate sul compito :eek:

Sempre IMHO, si effettua side-effect in tutti i metodi setters, che infatti servono a modificare lo stato dell'oggetto di invocazione.

Un esempio di metodi che non fanno side effect sono tutti quelli che riguardano la classe String. Infatti gli oggetti String sono immutabili ed ogni metodo restituisce una nuova istanza della classe, lasciando immutata quella di invocazione.

Ti devo far notare anche che si può implementare una lista concatenata anche in modo funzionale, infatti è sufficiente riscrivere i metodi di inserimento, eliminazione e modifica, in modo tale da restituire una nuova lista concatenata, senza modificare quella vecchia. Ovvio che così un eventuale aggiungiInTesta non sarebbe più void ma bensì ListaDiInteri.

Oceans11
26-01-2009, 21:47
2) Descrivere le due tecniche per VALORE, per RIFERIMENTO e per VALORE-RISULTATO dei parametri attuali ai parametri formali. Mostrare anche mediante esempi in cosa differiscono


Dunque, sul passaggio per Valore non ci sono dubbi, su quello per riferimento sono d'accordo con te e, se vogliamo, possiamo dire che in Java c'è una analogia con il side effect, ma credo sia azzardato dire che sono la stessa cosa. Per il terzo non ti so proprio aiutare.

D4rkAng3l
26-01-2009, 22:56
Esistono 2 tipi di metodi:
1) senza side-effect o funzionale che dovrebbe ad esempio modificare una sola variabile per poi restituirla.
2) con side-effect, nel qual caso il tipo di valore restituito dal metodo dovrebbe essere void.

La definizione precisa è:
"Un metodo effettua side-effect quando modifica lo stato dell'oggetto di invocazione".



Sempre IMHO, si effettua side-effect in tutti i metodi setters, che infatti servono a modificare lo stato dell'oggetto di invocazione.

Un esempio di metodi che non fanno side effect sono tutti quelli che riguardano la classe String. Infatti gli oggetti String sono immutabili ed ogni metodo restituisce una nuova istanza della classe, lasciando immutata quella di invocazione.

Ti devo far notare anche che si può implementare una lista concatenata anche in modo funzionale, infatti è sufficiente riscrivere i metodi di inserimento, eliminazione e modifica, in modo tale da restituire una nuova lista concatenata, senza modificare quella vecchia. Ovvio che così un eventuale aggiungiInTesta non sarebbe più void ma bensì ListaDiInteri.

mmm è un corso base di linguaggi di programmazione...e non ci ha fatto la distinzione tra con side effects e senza...così come non sò cosa siano i metodi settors perchè non li abbiamo trattati...forse al prossimo semestre

~FullSyst3m~
26-01-2009, 23:22
mmm è un corso base di linguaggi di programmazione...e non ci ha fatto la distinzione tra con side effects e senza...così come non sò cosa siano i metodi settors perchè non li abbiamo trattati...forse al prossimo semestre

Menomale che è base :asd:
Spero che prima del prossimo anno succeda una rivoluzione e inizieranno a fare tipo... Python all'uni :D

D4rkAng3l
27-01-2009, 00:04
Menomale che è base :asd:
Spero che prima del prossimo anno succeda una rivoluzione e inizieranno a fare tipo... Python all'uni :D

beh è un corso base di Linguaggi di programmazione...è un esame del secondo anno...al primo anno si fanno 2 esami di C...al secondo se ne fanno 2 di programmazione orientata agli oggetti (Linguiaggi di programmazione e metodologie di programazzione)....il primo dei due parte dai linguaggi assemblativi per arrivare al paradigma orientato agli oggetti e Java...è un bell'esamone però tocca farle ste cose...

~FullSyst3m~
27-01-2009, 00:12
beh è un corso base di Linguaggi di programmazione...è un esame del secondo anno...al primo anno si fanno 2 esami di C...al secondo se ne fanno 2 di programmazione orientata agli oggetti (Linguiaggi di programmazione e metodologie di programazzione)....il primo dei due parte dai linguaggi assemblativi per arrivare al paradigma orientato agli oggetti e Java...è un bell'esamone però tocca farle ste cose...

Spero che cambi qualcosa prima del prossimo anno.

Oceans11
27-01-2009, 07:00
mmm è un corso base di linguaggi di programmazione...e non ci ha fatto la distinzione tra con side effects e senza...così come non sò cosa siano i metodi settors perchè non li abbiamo trattati...forse al prossimo semestre

Beh dal momento che ti definiscono i metodi che provocano side effect, tutti gli altri li puoi chiamare funzionali :) .
I metodi "modificatori" (setters) forse non li hai mai sentiti chiamare in questo modo, ma di sicuro li conosci! Faccio un esempio così capirai al volo:


public class Persona {
private String nome;

public Persona() {
nome = "";
}

// questo è un metodo getter (da get) o accessore
public String getNome() {
return nome;
}

// questo è un metodo setter (da set) o modificatore
public void setNome(String aNome) {
nome = aNome;
}
}

shinya
27-01-2009, 08:34
2) Descrivere le due tecniche per VALORE, per RIFERIMENTO e per VALORE-RISULTATO dei parametri attuali ai parametri formali. Mostrare anche mediante esempi in cosa differiscono


Io non credo di aver capito bene cosa volessi dire in tutta quella filippica, comunque, tanto per fugare i dubbi.
In Java il passaggio dei parametri "per riferimento" in senso stretto NON esiste. I tipi primitivi sono passati per valore, e per gli oggetti viene passato il valore del riferimento. La differenza è fondamentale, e molti libri spiegano questa cosa in maniera totalmente errata.

"Valore-risultato" invece non l'ho mai sentito nominare... che significa? Il corrispettivo inglese sarebbe?

D4rkAng3l
27-01-2009, 09:25
Spero che cambi qualcosa prima del prossimo anno.

Cioè? ti devi iscrivere all'uni il prossimo anno? quale uni? che corso?
Guarda che l'uni non è una passeggiata...se rietieni queste cose troppo complicate semplicemente non iscrivertici...se cambiassero rotta su un corsi duretti ma ben fatti come questo si perderebbe molto in fatto di quanto serve l'università....ma che discorsi sono....l'univeraità che si adatta a quanto vuoi studiare te? doh mai sentita sta roba...sei te che ti adatti nello studio e nel lavoro...se non ti adatti puoi fare sempre altro...

Ma poi non lo capisco il tuo ragionamento...che vuol dire: "spero che cambi entro l'anno prossimo": tocca vedere che università, in che città, che corso di laurea....doh stai certo che però anche se magari andrai ad un'altra uni che non è TorVergata magari non avrai un linguaggi di programmazione tosto ma avrai qualche altro esame difficile...che discorsi sono doh.

D4rkAng3l
27-01-2009, 09:26
Io non credo di aver capito bene cosa volessi dire in tutta quella filippica, comunque, tanto per fugare i dubbi.
In Java il passaggio dei parametri "per riferimento" in senso stretto NON esiste. I tipi primitivi sono passati per valore, e per gli oggetti viene passato il valore del riferimento. La differenza è fondamentale, e molti libri spiegano questa cosa in maniera totalmente errata.

"Valore-risultato" invece non l'ho mai sentito nominare... che significa? Il corrispettivo inglese sarebbe?

Avevo espressamente detto che nella seconda domanda non parlavo di Java ma di linguaggi di programmazione in senso generale...facendo gli esempi in C

banryu79
27-01-2009, 09:34
Avevo espressamente detto che nella seconda domanda non parlavo di Java ma di linguaggi di programmazione in senso generale...facendo gli esempi in C
Guarda, quoto shinya, neanche io ho mai sentito parlare di "Valore-risultato"...
Per curiosità, qual'è la fonte (libro di testo/dispense)?

D4rkAng3l
27-01-2009, 09:43
Guarda, quoto shinya, neanche io ho mai sentito parlare di "Valore-risultato"...
Per curiosità, qual'è la fonte (libro di testo/dispense)?

La mia proff...ora vedo se trovo qualcosa anche sul Ghezzi Jazayeri (Programming Language Concepts) che è fonte d'immensa saggezza (ma è inglese) :D

~FullSyst3m~
27-01-2009, 11:16
Cioè? ti devi iscrivere all'uni il prossimo anno? quale uni? che corso?
Guarda che l'uni non è una passeggiata...se rietieni queste cose troppo complicate semplicemente non iscrivertici...se cambiassero rotta su un corsi duretti ma ben fatti come questo si perderebbe molto in fatto di quanto serve l'università....ma che discorsi sono....l'univeraità che si adatta a quanto vuoi studiare te? doh mai sentita sta roba...sei te che ti adatti nello studio e nel lavoro...se non ti adatti puoi fare sempre altro...

Ma poi non lo capisco il tuo ragionamento...che vuol dire: "spero che cambi entro l'anno prossimo": tocca vedere che università, in che città, che corso di laurea....doh stai certo che però anche se magari andrai ad un'altra uni che non è TorVergata magari non avrai un linguaggi di programmazione tosto ma avrai qualche altro esame difficile...che discorsi sono doh.

Guarda non mi metto nemmeno a discutere per un semplice motivo, che se avessi pensato un secondo prima di sparare avresti visto:

1) Scherzavo.
2) Non conoscere Java al momento non credo proprio che significa che devo lasciare perdere l'uni.

Detto questo la prossima volta ragiona prima di sparare.

D4rkAng3l
27-01-2009, 11:23
Guarda non mi metto nemmeno a discutere per un semplice motivo, che se avessi pensato un secondo prima di sparare avresti visto:

1) Scherzavo.
2) Non conoscere Java al momento non credo proprio che significa che devo lasciare perdere l'uni.

Detto questo la prossima volta ragiona prima di sparare.

mmm ti ho mandato anche una mail privata visto che ci eravamo sentiti tempo fà perchè volevi avere dei chiarimenti...
Non ti ho mai detto di lasciare perdere l'uni...ti volevo solo dire che non trattare argomenti come questi sarebbe a dir poco grave in un corso di laurea in Informatica (ma credo anche ing inf...) e che se vuoi iscriverti ad una facoltà di questo genere sono cose che ti toccheranno sicuramente come toccano tutti noi poveri nerd :-P

shinya
27-01-2009, 11:30
Guarda che l'uni non è una passeggiata...se rietieni queste cose troppo complicate semplicemente non iscrivertici...se cambiassero rotta su un corsi duretti ma ben fatti come questo si perderebbe molto in fatto di quanto serve l'università.

Io non vorrei distruggere tutte le tue fantasie, ma... queste domande non mi sembrano proprio venire da un corso che definirei "duretto". Voglio dire... questo è l'ABC.

banryu79
27-01-2009, 11:34
Scusa FullSyst3m se te lo faccio notare, ma tu sei intervenuto due volte in questo thread quotando pezzi di post D4arkAng3l solo per rispondere con una frase "simpatica" che comunque non aveva nulla a che fare col topic in questione.

Non è un dramma per carità, ma se poi l'utente a sua volta ti risponde, in maniera tra l'altro non offensiva, anche se può aver mal interpretato il senso del tuo intervento (ed è facile mal interpretare post dello stesso tipo di quelli che hai fatto qui) non mi sembra il caso di rispondergli con frasi come questa (rasenta il flame, secondo me) senza essere stati provocati:

Detto questo la prossima volta ragiona prima di sparare.


Con tutto il rispetto io ho l'impressione che la "sparata" l'hai fatta tu.
Detto questo sei libero come tutti di intervenire nelle discussioni come meglio credi, però secondo me adesso qui stai postando inutilmente.

Pace e ciao.

D4rkAng3l
27-01-2009, 11:54
Io non vorrei distruggere tutte le tue fantasie, ma... queste domande non mi sembrano proprio venire da un corso che definirei "duretto". Voglio dire... questo è l'ABC.

ma infatti l'ho definito un corso base di linguaggi di programmazione...duretto perchè la proff è pignola e perchè queste domande sono relative solo ad una parte del corso che comprende al suo interno: linguaggi assembaltive stack based, linguaggi ad alto livello,linguaggi object oriented, gestione dell'heap (far vedere cosa succede nello stack e nello heap quando viene eseguita una o più classi), java, ereditarietà, polimorfismo, etcetc...ed è per quello che dicevo che non trattare argomenti di quel tipo è grave perchè se no uno impara a scriver programmini banali senza sapere quello che fà...e non si va lontano...

D4rkAng3l
27-01-2009, 11:58
Scusa FullSyst3m se te lo faccio notare, ma tu sei intervenuto due volte in questo thread quotando pezzi di post D4arkAng3l solo per rispondere con una frase "simpatica" che comunque non aveva nulla a che fare col topic in questione.

Non è un dramma per carità, ma se poi l'utente a sua volta ti risponde, in maniera tra l'altro non offensiva, anche se può aver mal interpretato il senso del tuo intervento (ed è facile mal interpretare post dello stesso tipo di quelli che hai fatto qui) non mi sembra il caso di rispondergli con frasi come questa (rasenta il flame, secondo me) senza essere stati provocati:


Con tutto il rispetto io ho l'impressione che la "sparata" l'hai fatta tu.
Detto questo sei libero come tutti di intervenire nelle discussioni come meglio credi, però secondo me adesso qui stai postando inutilmente.

Pace e ciao.

Anche perchè non trattare quegli argomenti ed auspicarsi una rivoluzione interna all'uni...beh quella si che è una sparata...significherebbe annullare quanto c'è di buono nell'università (senza quegli argomenti non si va da nessuna parte)....poi se scherzava ok...ma mica ho la palla di cristallo che posso prevedere se uno scherza o no (anche perchè ha ribadito 2 volte il concetto che non voleva fare quelle cose...) :eek:

~FullSyst3m~
27-01-2009, 12:11
mmm ti ho mandato anche una mail privata visto che ci eravamo sentiti tempo fà perchè volevi avere dei chiarimenti...
Non ti ho mai detto di lasciare perdere l'uni...ti volevo solo dire che non trattare argomenti come questi sarebbe a dir poco grave in un corso di laurea in Informatica (ma credo anche ing inf...) e che se vuoi iscriverti ad una facoltà di questo genere sono cose che ti toccheranno sicuramente come toccano tutti noi poveri nerd :-P

Ma questo lo so, io avevo messo pure la faccina, ma sentendomi dire: "allora se pensi ste cose non ti iscrivere", "l'uni dovrebbe cambiare per far fare le cose che ti piacciono" ecc dimmi tu come l'avresti interpretata.

Scusa FullSyst3m se te lo faccio notare, ma tu sei intervenuto due volte in questo thread quotando pezzi di post D4arkAng3l solo per rispondere con una frase "simpatica" che comunque non aveva nulla a che fare col topic in questione.

Non è un dramma per carità, ma se poi l'utente a sua volta ti risponde, in maniera tra l'altro non offensiva, anche se può aver mal interpretato il senso del tuo intervento (ed è facile mal interpretare post dello stesso tipo di quelli che hai fatto qui) non mi sembra il caso di rispondergli con frasi come questa (rasenta il flame, secondo me) senza essere stati provocati:

Non credo di essere l'unico nel forum a fare qualche battuta anche se non aiuta l'utente, in ogni discussione ci sono, e nemmeno io ho risposto in maniera offensiva, ma come ho detto sopra le mie parole si possono fraintendere, ma anche le sue.

Detto questo sei libero come tutti di intervenire nelle discussioni come meglio credi, però secondo me adesso qui stai postando inutilmente.

Non mi piace essere di intralcio, quindi non posto più.
Scusate il disagio.

Anche perchè non trattare quegli argomenti ed auspicarsi una rivoluzione interna all'uni

Ripeto, era una battuta. Le faccine servono pure a farlo capire.
Ma comunque mi serve come lezione, la prossima volta sto attento cosi evito di causare discussioni, per le quali non vedo motivo comunque.

Buona continuazione.

D4rkAng3l
27-01-2009, 14:59
:eek:

astorcas
27-01-2009, 15:23
Rispondo solo a ciò a cui gli altri non ti hanno risposto:

chiamata per valore risultato (call by value-result)

In pratica funziona così, il parametro in questione viene copiato in una variabile locale della funzione, la quale subisce le eventuali modifiche e (il parametro rimane intatto quindi), al termine di questa funzione, viene copiato sul parametro il valore che la variabile locale ha assunto.

Oddio non potevo spiegarlo peggio.....