Metodi di overloading con comportamenti diversi - Stile

0

Ho una domanda di stile su overloading di metodi / costruttori. Ho un costruttore che fa qualcosa di molto semplice, e quindi chiama un metodo con alcuni effetti collaterali. A volte però non voglio gli effetti collaterali, quindi ho creato un costruttore sovraccarico separato. Ho mostrato due versioni qui. La versione 1 è semplice: se passo qualsiasi bool poi TrickyFunction non verrà chiamato. Ma forse è confuso, perché il valore di no_tricks non influenza il comportamento (solo che no_tricks esiste). La versione 2 in realtà elabora no_tricks e prende la decisione di eseguire TrickyFunction in base a ciò.

Quale versione o altra versione è più stilisticamente "corretta?"

public foo MyFunction(string a)
{
    variable = a
    TrickyFunction(a)
}

#Version 1
public foo MyFunction(string a, bool no_tricks)
{
    variable = a
}

#Version 2
public foo MyFunction(string a, bool no_tricks)
{
    variable = a
    if (notricks == true)
    {
        TrickyFunction(a)
    }
}
    
posta ckb 24.01.2014 - 23:43
fonte

3 risposte

3

La versione n. 2 è preferibile a FAR , sebbene il design generale sia spesso considerato un odore di codice.

Nota che i dialetti C # più recenti consentono parametri opzionali, quindi puoi combinare la base e il sovraccarico.

class foo {
  public foo(string a, bool no_tricks = false) {
    variable = a;
    if(no_tricks == false) {
      TrickyFunction(a);
    }
  }
}

(E, naturalmente, si noti che passare un valore falso per sovrascrivere il default è un po 'controintuitivo di per sé, specialmente quando il valore logico non corrisponde al nome della variabile, come nel testo.)

    
risposta data 25.01.2014 - 00:07
fonte
0

Versione 2, kinda.

Avrei solo un costruttore, ma il secondo parametro doExtraWork è facoltativo e il valore predefinito è true. Questo segue le linee guida generali che il booleano true dovrebbe rappresentare il fare le cose piuttosto che non fare le cose. E questo approccio semplificherebbe il tuo codice. Se i parametri opzionali sono proibiti nella tua base di codice, allora fai in modo che il "piccolo" costruttore chiami l'altro.

Anche se cercherò di rimuovere elementi ingannevoli dal costruttore qualsiasi - basta quanto basta per inizializzare i tuoi invarianti.

    
risposta data 25.01.2014 - 00:07
fonte
0

Sebbene C # non permetta a un tipo di avere più costruttori tranne che dando loro tutte le diverse firme, i tipi possono avere un numero qualsiasi di metodi di fabbrica. La mia inclinazione sarebbe quella di avere un costruttore protetto con un parametro "noTricks", ma i consumatori della classe usano i metodi factory per costruire istanze. I metodi ingannevoli e non complessi possono quindi avere nomi diversi per chiarire il loro comportamento.

    
risposta data 26.08.2014 - 23:10
fonte

Leggi altre domande sui tag