PDA

View Full Version : [C++] Metodo const e modifiche sull'oggetto di invocazione - Best Practise


oRpo
06-07-2012, 18:49
Salve a tutti.
Un metodo dovrebbe essere dichiarato const se e solo se la sua invocazione non produce side-effects sull'oggetto di invocazione o sulla classe di invocazione.
Supponendo che la classe abbia come campo dato di istanza un puntatore ad una collezione di oggetti (vedi esempio), se dovessi fare un metodo push, questo metodo devo marcarlo come const? A rigor di logica sì. visto che non modificando nessun oggetto di invocazione, provoca comunque side-effect indirettamente.

esempio:

class A
{
vector<int> * punt;
public:
void push(int) const;

...

A(): punt(new vector<int>);
}



Cosa mi consigliate?

Mattia

__ZERO_UNO__
07-07-2012, 16:39
Prendendo come buona la tua definizione di quando una funzione dovrebbe essere const oppure non const, essendo push non referenzialmente trasparente non dovrebbe essere dichiarata const.
Fatti questa domanda: posso sostituire una chiamata alla funzione push con il valore che restituisce senza che nulla cambi nel mio programma?
Se la risposta è sì, allora secondo la tua definizione di quando una funzione dovrebbe essere const ( ma cosa significa side effects sull'oggetto di invocazione? ) oppure no, push deve essere const. Altrimenti non deve esserlo.

Quando si parla di c++, non si dice metodo ma funzione. Una sola volta mi pare di aver visto la parola method nel libro di stroustrup e, se non sbaglio, si riferiva ad una funzione ereditata che fa l'overriding.
Sapessi quante volte sono stato bachettato io perchè usavo la parola metodo. Se parli sui canali irc iniziano a dirti, "che cosa è un metodo in c++?", "Io non so cosa è un metodo, a cosa ti riferisci?".. ahahah
Scusate lo sfogo

[Kendall]
09-07-2012, 22:57
Prendendo come buona la tua definizione di quando una funzione dovrebbe essere const oppure non const, essendo push non referenzialmente trasparente non dovrebbe essere dichiarata const.
Fatti questa domanda: posso sostituire una chiamata alla funzione push con il valore che restituisce senza che nulla cambi nel mio programma?
Se la risposta è sì, allora secondo la tua definizione di quando una funzione dovrebbe essere const ( ma cosa significa side effects sull'oggetto di invocazione? ) oppure no, push deve essere const. Altrimenti non deve esserlo.

Quando si parla di c++, non si dice metodo ma funzione. Una sola volta mi pare di aver visto la parola method nel libro di stroustrup e, se non sbaglio, si riferiva ad una funzione ereditata che fa l'overriding.
Sapessi quante volte sono stato bachettato io perchè usavo la parola metodo. Se parli sui canali irc iniziano a dirti, "che cosa è un metodo in c++?", "Io non so cosa è un metodo, a cosa ti riferisci?".. ahahah
Scusate lo sfogo

Mah, sinceramente non sono d'accordo. Il c++ è legato al termine "funzione" per la sola sua discendenza dal c. Oltre a questo il c++ pur incorporando principi del paradigma OOP non lo abbraccia al 100% e rimane in quella "mezza strada" che lo rende performante/potente e astio allo stesso tempo.
In realtà però in c++ i metodi esistono eccome, per il semplice fatto che un metodo altro non è che un altro modo (più conciso) di definire una "funzione membro".
Tutto il resto lo reputo sinceramente uno sciocco gioco di termini che i puristi del c++ usano. (Così come i puristi degli altri linguaggi se la "tirano" in altri frangenti eh)

tomminno
10-07-2012, 07:51
Il C++ definisce i metodi come "member function", chiamarli solo funzioni è sbagliato. "Metodi" è genericamente il gergo OOP (mutuato da Smalltalk)

__ZERO_UNO__
10-07-2012, 15:29
;37770713']Mah, sinceramente non sono d'accordo. Il c++ è legato al termine "funzione" per la sola sua discendenza dal c. Oltre a questo il c++ pur incorporando principi del paradigma OOP non lo abbraccia al 100% e rimane in quella "mezza strada" che lo rende performante/potente e astio allo stesso tempo.
In realtà però in c++ i metodi esistono eccome, per il semplice fatto che un metodo altro non è che un altro modo (più conciso) di definire una "funzione membro".
Tutto il resto lo reputo sinceramente uno sciocco gioco di termini che i puristi del c++ usano. (Così come i puristi degli altri linguaggi se la "tirano" in altri frangenti eh)

Sono d'accordo con la tua descrizione. Ma non penso che sia solo uno sciocco gioco di termini, perchè se una funzione membro la chiami metodo, come identifichi una funzione globale? Metodo globale?
Penso che per uniformità ed evitare ambiguità sia meglio usare i termini funzione membro e funzione globale quando si parla di c++. Inoltre in tutti i testi che trattano di c++ è usata questa convenzione.

banryu79
10-07-2012, 15:50
Sono d'accordo con la tua descrizione. Ma non penso che sia solo uno sciocco gioco di termini, perchè se una funzione membro la chiami metodo, come identifichi una funzione globale? Metodo globale?

L'osservazione di Kendall mi pare abbastanza pertinente:

In realtà però in c++ i metodi esistono eccome, per il semplice fatto che un metodo altro non è che un altro modo (più conciso) di definire una "funzione membro".

Puoi usare il termine "metodo" come un sinonimo di "funzione membro" senza questo renda neccessario trovare un sinonimo per "funzione globale", o sbaglio?

marco.r
10-07-2012, 22:52
Salve a tutti.
Un metodo dovrebbe essere dichiarato const se e solo se la sua invocazione non produce side-effects sull'oggetto di invocazione o sulla classe di invocazione.
Supponendo che la classe abbia come campo dato di istanza un puntatore ad una collezione di oggetti (vedi esempio), se dovessi fare un metodo push, questo metodo devo marcarlo come const?
A rigor di logica sì. visto che non modificando nessun oggetto di invocazione, provoca comunque side-effect indirettamente.

A rigor di logica no visto che logicamente l'oggetto e' stato modificato.
Il fatto che poi tu riesca a modificare un oggetto puntato (ma non il puntatore stesso) secondo me e' poco rilevante o, se preferisci, un dettaglio implementativo.

marco.r
10-07-2012, 22:59
Quando si parla di c++, non si dice metodo ma funzione.

Si possono usare indifferentemente entrambe le forme, in C++ vogliono dire la medesima cosa.


Una sola volta mi pare di aver visto la parola method nel libro di stroustrup e, se non sbaglio, si riferiva ad una funzione ereditata che fa l'overriding.
Sapessi quante volte sono stato bachettato io perchè usavo la parola metodo. Se parli sui canali irc iniziano a dirti, "che cosa è un metodo in c++?", "Io non so cosa è un metodo, a cosa ti riferisci?".. ahahah
Scusate lo sfogo
La prima che dice Stroustroup quando introduce le funzioni membro, dice che si chiamano 'funzioni membro' o 'metodi'. Ne piu' ne meno.
Quando qualcuno vuol fare il gradasso su irc e ti chiede cos'e' un metodo puoi pure dargli un link rapidshare ad una copia del libro :D.

Al di la' di questo il resto del mondo usa il termine metodo, per cui tanto vale usare un linguaggio comune.

marco.r
10-07-2012, 23:02
Sono d'accordo con la tua descrizione. Ma non penso che sia solo uno sciocco gioco di termini, perchè se una funzione membro la chiami metodo, come identifichi una funzione globale? Metodo globale?

... 'funzione' ? O 'funzione non membro, se occorre evidenziare la differenza.

__ZERO_UNO__
11-07-2012, 10:30
Non pensavo di tirare su una discussione così ampia su una cosa così poco rilevante. Comunque mi rimangio la bacchettata che ho fatto e dico ognuno usi la terminologia che preferisce (ovviamente). Affari suoi.


La prima che dice Stroustroup quando introduce le funzioni membro, dice che si chiamano 'funzioni membro' o 'metodi'. Ne piu' ne meno.

Nella mia edizione (special edition) del libro di Stroustrup non c'è scritto quello, ma testuali parole: "A virtual member function is sometimes called a method" .
Qui mi fermo.
Bye

marco.r
11-07-2012, 13:24
Non pensavo di tirare su una discussione così ampia su una cosa così poco rilevante. Comunque mi rimangio la bacchettata che ho fatto e dico ognuno usi la terminologia che preferisce (ovviamente). Affari suoi.


Nella mia edizione (special edition) del libro di Stroustrup non c'è scritto quello, ma testuali parole: "A virtual member function is sometimes called a method" .
Qui mi fermo.
Bye

doh, guardando il glossario di Stroustrup non posso che darti ragione. La mia copia del libro e' in italiano (peccati di gioventu'), ed evidentemente e' stata tradotta in modo infelice.

banryu79
11-07-2012, 13:33
La mia copia del libro e' in italiano (peccati di gioventu')...
:eek: ... :asd:

WarDuck
12-07-2012, 22:26
Uno che ha fatto un linguaggio così orribile non dovrebbe parlare di cosa è una funzione o un metodo :asd:

Edit: oddio l'ho postato sul serio :D

ingframin
13-07-2012, 07:20
Uno che ha fatto un linguaggio così orribile non dovrebbe parlare di cosa è una funzione o un metodo :asd:

Edit: oddio l'ho postato sul serio :D

Se ti candidi ti voto come presidente del consiglio :D
Per quanto riguarda la sottigliezza metodo/funzione...
"o sono caduto o ho caduto, sempre in terra sono andato" ovverosia l'importante è capirsi.
La parola di Stroutsup non è vangelo e al mio paese "A virtual member function is sometimes called a method" questo significa che una funzione membro virtual si può chiamare anche metodo. In Java sono tutte virtual e quindi sono tutti metodi. In c++ non lo sono, ma comunque a livello di comprensione il discorso fila lo stesso. Per fare i perfettini, abbiamo sprecato tonnellate di byte per scrivere corbellerie che non tolgono né tanto meno aggiungono nulla al post originario.
Per quanto riguarda const...
http://msdn.microsoft.com/en-us/library/6ke686zh(v=vs.80).aspx
Qui c'è una definizione e un esempio che mi pare sufficientemente esplicativo :)
PS
Quanto preferisco il vecchio C, liscio liscio e semplice.