Variabili membro privato: imposta tramite valore di ritorno di un metodo membro privato o modifica all'interno del corpo del metodo

2

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"?

    
posta KjMag 01.09.2017 - 19:30
fonte

1 risposta

2

Preferisco chiamare c = calc_c(a,b); o c = calc_c(this) direttamente dal costruttore. Penso che renderebbe l'idea più chiara:

  • tutti i campi ora sono visibilmente inizializzati all'interno del costruttore
  • calc_c (può essere un metodo statico che) chiaramente non (non può) mutare un A
  • è più chiaro che c non può essere ricalcolato in futuro, utile poiché a e b sono vincolati dal costruttore.
risposta data 01.09.2017 - 19:41
fonte

Leggi altre domande sui tag