|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2688
|
[Java] Qualche domandina teorica
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: Codice:
/** 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;
}
........................
........................
........................
Codice:
/** 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;
}
....................
....................
....................
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 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 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: Codice:
int main(){
int a[3] = {1,2,3}
test(a[1], a[2]);
return 0;
}
void test(int x, int y){
x = 0;
y++;
}
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 |
|
|
|
|
|
#2 | ||
|
Senior Member
Iscritto dal: Sep 2005
Città: Torino
Messaggi: 606
|
Quote:
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". Quote:
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.
__________________
"Se proprio dovete piratare un prodotto, preferiamo che sia il nostro piuttosto che quello di qualcun altro." [Jeff Raikes] "Pirating software? Choose Microsoft!" |
||
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Sep 2005
Città: Torino
Messaggi: 606
|
Quote:
__________________
"Se proprio dovete piratare un prodotto, preferiamo che sia il nostro piuttosto che quello di qualcun altro." [Jeff Raikes] "Pirating software? Choose Microsoft!" |
|
|
|
|
|
|
#4 | |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2688
|
Quote:
|
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 4683
|
Quote:
Spero che prima del prossimo anno succeda una rivoluzione e inizieranno a fare tipo... Python all'uni
__________________
Firma eliminata e avatar cambiato. Troppa gente giudica il monaco dall'abito. |
|
|
|
|
|
|
#6 |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2688
|
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...
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 4683
|
Quote:
__________________
Firma eliminata e avatar cambiato. Troppa gente giudica il monaco dall'abito. |
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Sep 2005
Città: Torino
Messaggi: 606
|
Quote:
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: Codice:
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;
}
}
__________________
"Se proprio dovete piratare un prodotto, preferiamo che sia il nostro piuttosto che quello di qualcun altro." [Jeff Raikes] "Pirating software? Choose Microsoft!" |
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
|
Quote:
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?
__________________
-> The Motherfucking Manifesto For Programming, Motherfuckers |
|
|
|
|
|
|
#10 |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2688
|
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. |
|
|
|
|
|
#11 | |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2688
|
Quote:
|
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Per curiosità, qual'è la fonte (libro di testo/dispense)?
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
|
#13 | |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2688
|
Quote:
|
|
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 4683
|
Quote:
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.
__________________
Firma eliminata e avatar cambiato. Troppa gente giudica il monaco dall'abito. |
|
|
|
|
|
|
#15 | |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2688
|
Quote:
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 |
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
|
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.
__________________
-> The Motherfucking Manifesto For Programming, Motherfuckers |
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
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: Quote:
Detto questo sei libero come tutti di intervenire nelle discussioni come meglio credi, però secondo me adesso qui stai postando inutilmente. Pace e ciao.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
|
#18 |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2688
|
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...
|
|
|
|
|
|
#19 | |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2688
|
Quote:
|
|
|
|
|
|
|
#20 | ||||
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 4683
|
Quote:
Quote:
Quote:
Scusate il disagio. Quote:
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.
__________________
Firma eliminata e avatar cambiato. Troppa gente giudica il monaco dall'abito. |
||||
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:41.




















