metodi di chiamata se la chiamata precedente ha successo [duplicato]

1

Il mio programma c # Devo eseguire 5 passaggi (attività) in sequenza. fondamentalmente questi cinque dovrebbero essere eseguiti uno dopo l'altro, solo il compito precedente eseguito è successo. Attualmente l'ho fatto nel modo seguente. Ma questo non è uno stile di codice molto buono da seguire.

var isSuccess=false;
isSuccess=a.method1();

if(isSuccess)
    isSuccess=a.method2();

if(isSuccess)
    isSuccess=a.method3();

if(isSuccess)
    isSuccess=a.method4();

if(isSuccess)
    isSuccess=a.method5();

Come posso riflettere questo codice. Qual è il modo migliore che posso seguire?

    
posta New Developer 08.06.2014 - 14:50
fonte

3 risposte

4

C # /. NET condizioni di processo da sinistra a destra e si fermerebbero al primo falso se fossero "ANDed" insieme, ad es.

bool success = A() && B() && C();

dovrebbe fermarsi a B () se restituisce false. Quindi il seguente codice emetterà solo "In A" e "In B", ma non "In C", perché non appena B () restituisce false, si ferma.

using System;

public class App
{
  public static void Main()
  {
    bool success = A() && B() && C();
  }

  static bool A()
  {
    Console.WriteLine("In A");
    return true;
  }

  static bool B()
  {
    Console.WriteLine("In B");
    return false;
  }

  static bool C()
  {
    Console.WriteLine("In C");
    return true;
  }
}

Output:

In A
In B
    
risposta data 08.06.2014 - 22:46
fonte
2

In realtà lo lascerei stare così com'è, poiché in questo modo è facilmente leggibile e comprensibile da chiunque. Ma se usi lo stesso modello in molti posti e tutti i metodi hanno la stessa firma ecco un'idea (eccessivamente ingegnerizzata e probabilmente distorta):

public class SequentialExecutor
{
    private Func<bool>[] functions;

    public SequentialExecutor(params Func<bool>[] functions)
    {
        this.functions = functions;
    }

    public bool Execute()
    {
        foreach (var func in functions)
        {
            bool isSuccess = func();
            if (!isSuccess)
            {
                return false;
            }
        }

        return true;
    }
}

Puoi usarlo in questo modo:

var executor = new SequentialExecutor(a.method1, a.method2, a.method3, a.method1, a.method4);
bool isSuccess = executor.Execute();

P.S. NON TESTATO

    
risposta data 08.06.2014 - 20:32
fonte
2

Questo è il tipo di situazione in cui lanciare un'eccezione in caso di errore può essere più ordinata. Se questa è la tua API, puoi fare:

try {
    a.method1();
    a.method2();
    a.method3();
    a.method4();
    a.method5();
} catch (UnsatisifedException e) {
    // Some sort of recovery logic here...
}
    
risposta data 08.06.2014 - 21:22
fonte

Leggi altre domande sui tag