Usando il metodo variabile + invocazione o invocazione ripetuta?

2

Ecco due metodi che fanno la stessa cosa. Uno sta ripetendo la chiamata al metodo Print dove l'altro non ha ma ha una variabile aggiuntiva.

class Program
{
    static void Main(string[] args)
    {
        Snippet1(args);
        Snippet2(args);
    }

    private static void Snippet1(string[] args)
    {
        string message;
        if (args.Length == 0)
        {
            message = "No argument";
        }
        else
        {
            message = string.Format("Argument Count = {0}", args.Length);
        }
        Print(message);
    }

    private static void Snippet2(string[] args)
    {
        if (args.Length == 0)
        {
            Print("No argument");
        }
        else
        {
            Print(string.Format("Argument Count = {0}", args.Length));
        }
    }

    private static void Print(string s)
    {
        Console.WriteLine(s);
    }
}

Personalmente non mi piace avere due volte la stessa invocazione e preferisco usare una variabile che faccia l'obiettivo dell'istruzione if per definire il messaggio invece di definire + invocare. Credo anche che sia più chiaro avere un'invocazione unica se è necessario modificarla in seguito.

Qual è la migliore pratica / modello da applicare?

    
posta Patrick Desjardins 16.07.2015 - 22:17
fonte

4 risposte

3

Scelgo chiaramente l'approccio con variabili extra, perché DRY. Il nome varaible trasmette inoltre il significato dell'argomento (ad esempio potrebbe essere warning o log_entry , ecc.)

    
risposta data 16.07.2015 - 22:22
fonte
3

I also believe that it's more clear to have an unique invocation if this one need to be changed later.

Anche l'unicità dell'invocazione può essere soggetta a modifiche.

Forse non vuoi più stampare nulla se non ci sono argomenti e in questo caso non vuoi chiamare Print .

Non penso che ci sia una risposta definitiva alla tua domanda e dipende sempre dal caso d'uso specifico.

    
risposta data 17.07.2015 - 00:33
fonte
3

Domani il tuo capo ti dirà che vuole avere la maggior parte dei messaggi in colore ROSSO e alcuni in BLU con imbottitura extra ... e sei in fase di profonda refactoring con entrambi i tuoi approcci.

La classe del tuo programma è responsabile per il processo decisionale e la stampa allo stesso tempo. In questo modo Principio di singola responsabilità è stato rotto.

Quindi aggiungerei ancora più problemi di separazione:

class Program {
    public static void Main(string[] args) {
        var simplePrinter = new SimplePrinter();
        var errorPrinter = new ErrorPrinter();

        var objectWithError = new MyObject(errorPrinter);
        objectWithError.DoSomething();

        var simpleObject = new MyObject(simplePrinter);
        simpleObject.DoSomething();
    }
}

public interface IConsolePrinter {
    void Print(string s);
}

public class SimplePrinter : IConsolePrinter {
   public void Print(string s) {
       Console.WriteLine(s);
   }
}

public class ErrorPrinter : IConsolePrinter {
   public void Print(string s) {
       Console.WriteLine(String.Format("**** ERROR: {0}", s));
   }
}

public class MyObject {
    private ConsolePrinter _printer;

    public MyObjectThatUsesConsolePrinter(IConsolePrinter printer) {
        _printer = printer;        
    }

    public void DoSomething() {
        _printer.Print("Love OOP! Respect Single Responsibility Principle!");
    }
}
    
risposta data 17.07.2015 - 01:09
fonte
2

Un compilatore competente per la produzione industriale di qualità, con l'ottimizzazione attivata, trasformerà automaticamente Snippet2 in Snippet1. Se il tuo compilatore rientra in quella categoria (e la maggior parte lo fa), non c'è una vera ragione per una preferenza.

Personalmente, essendo uno che crede di essere conciso, l'ho codificato come:

private static void Snippet3(string[] args)
{
    Print((args.Length != 0)?string.Format("Argument Count = {0}",
                                           args.Length)
                            :"No argument");
}

(assumendo che Java consenta l'operatore ternario ...)

    
risposta data 17.07.2015 - 01:11
fonte

Leggi altre domande sui tag