È buona pratica dichiarare una funzione in linea?

7

Sto scrivendo un metodo e, in base a un campo di configurazione, ho bisogno di cambiare da dove ottengo i miei dati. Ciò che questo mi porta a dover scrivere codice che assomiglia a questo:

List<string> result = new List<string>();
if (configField)
{
    result.Add(fieldA);
}
else
{
    result.Add(...BusinessLogic...);
}

Dovrò scrivere che se la dichiarazione molte volte così ovviamente voglio trasformarlo in un metodo, quindi posso solo scrivere result.Add(newMethod(configField, fieldA, dataForBusinessLogicToParse)) . Questo metodo sarebbe inutile a chiunque non scrivesse il metodo specifico che sto scrivendo, quindi ha senso dichiarare questo metodo come metodo private separato o posso semplicemente dichiararlo in linea come delegate come questo:

Func<Enum, int, int> newMethod =
    (configField, fieldA, dataForBusinessLogicToParse) => ...businessLogic...

Sono preoccupato che dichiararlo in linea potrebbe rendere il codice più difficile da capire, ma penso che renda la classe più pulita.

    
posta Mykroft 08.07.2014 - 17:23
fonte

3 risposte

4

Per quanto ne so, dichiarare che un metodo helper come un lambda come questo non viene comunemente fatto in C #, quindi sconsiglio di farlo a meno che tu non abbia una buona ragione.

I buoni motivi includono:

  • Il lambda potrebbe fare qualcosa che un metodo separato non può, come chiudere una variabile locale o usare un tipo anonimo.
  • Gli altri membri del tuo team sono d'accordo con te che questa è una buona pratica.

Detto questo, a partire da C # 7.0, C # supporta le funzioni locali, che sono simili a tali lambda di aiuto, ma generalmente migliori: hanno una sintassi più sintetica e sono più efficienti. Quindi se hai usato una funzione locale per questo scopo, penso che sarebbe perfetto.

    
risposta data 16.07.2014 - 15:26
fonte
6

Se newMethod non modifica mai il suo valore dopo l'inizializzazione (potrebbe essere dichiarato const o readonly , suppongo), dovresti scrivere meglio un metodo privato standard. L'utilizzo di delegati senza una motivazione può rendere il codice confuso (almeno in C #), anche per programmatori esperti. Confronto

 private Action<Enum, int, int> newMethod = (configField, fieldA, dataForBusinessLogicToParse) ...

vs.

 private void NewMethod(Enum  configField, int fieldA, int dataForBusinessLogicToParse)
 {
 }

quest'ultimo è molto più leggibile per me, perché vedo immediatamente quale parametro ha quale tipo, mentre per il primo costrutto devo contare i parametri (specialmente quando il numero di parametri diventa più di 3).

    
risposta data 08.07.2014 - 17:44
fonte
4

Poiché C # 7, supporta le funzioni interne . Questi combinano i vantaggi di localizzazione e chiusura di lambda con la sintassi più bella (per le non-liners) delle funzioni. Hai la possibilità di usarli.

    
risposta data 14.08.2018 - 15:00
fonte

Leggi altre domande sui tag