Ho letto molti materiali riguardo al preferire i valori di ritorno da una funzione come questa:
some_class func();
per ottenere l'output passando per riferimento in questo modo:
void func(some_class& input);
Ho trovato poche informazioni riguardo se la regola simile si applica ai metodi dei membri privati della classe. Supponiamo che io sono una classe A
con i membri a
, b
e c
, dove le variabili a
e b
sono impostati tramite il costruttore, e c
si basa calcolata sulla a
e% codice%. Si può progettare una classe del genere nei seguenti modi:
class A
{
A(const Class1& x, const Class2& y) : a(x), b(y) { outer_funct() };
private:
// option 1: calculate a in some outer function like this: c = calc_c();
// a and b values are only read within the method's body:
Class3 calc_c() const;
// option 2: calculate a inside calc_c();
// a and b values are only read within the method's body:
void calc_c();
void outer_funct()
{
// option 1:
c = calc_c();
// option 2:
calc_c();
}
Class1 a;
Class2 b;
Class3 c;
};
In realtà b
sarebbe un oggetto, il cui valore dipende da più di dieci variabili membro - ecco perché non considero avere una funzione di supporto indipendente che prende le variabili necessarie per calcolare c
di const di riferimento.
Sto valutando i pro e i contro di entrambi gli approcci.
Ciò che mi parla dell'opzione 1 è che mostra il mio intento, ovvero che chiamare c
dovrebbe comportare la modifica di una sola variabile e il qualificatore const previene gli effetti collaterali. D'altra parte, scrivere il metodo in questo modo può far pensare a qualcuno che possa essere usato per impostare anche altre variabili membro di calc_c()
, mentre dovrebbe essere usato solo per impostare Class3
- Ho dei dubbi sul fatto di fare affidamento sui commenti le funzioni sono una buona soluzione per impedirlo.
L'opzione 2 a sua volta sembra allettante perché non induce in errore il lettore nel modo descritto sopra. D'altra parte, non vi è alcun suggerimento sintattico riguardo a quali variabili dovrebbero o non dovrebbero essere modificate all'interno di questa funzione, quindi potrebbe essere più difficile mantenere invarianti di classe e rintracciare i bug.
Mi piacerebbe sapere se ci sono altre considerazioni che parlano di una delle opzioni che non riesco a vedere. È una questione di gusti, alla fine, o c'è qualcosa di più che favorirebbe una delle opzioni come "migliore"?