Passare i parametri nello stesso oggetto delle risposte

1

Ho un numero di operazioni che devono essere eseguite, in serie, sullo stesso set di dati. Mentre le operazioni procedono, le operazioni successive richiedono informazioni dalle operazioni precedenti. Quindi l'oggetto iniziale è passato al primo metodo a palle di neve mentre raccoglie risultati e metadati.

All'inizio stavo passando in giro sia una richiesta che una risposta, ma questo mi ha dipinto in un angolo un paio di volte. Quindi, ora quello che intendo fare è avere un oggetto parametrico che contiene tutti i dati iniziali, ricorda i valori provvisori e fornisce i risultati finali, il tutto all'interno di un singolo oggetto che viene passato a molti metodi void.

Le mie domande: si tratta di uno schema? O è questa brutta forma?

Il mio esempio inventato è qui sotto.

    class Program
    {
        static void Main()
        {
            var MyObj = new RequestResponseInfo();
            MyObj.InitalValue = "fo";
            foobar.DoStuff(MyObj);
            Console.WriteLine(MyObj.FinalAnswer);
            Console.ReadKey();
        }
    }

    public static class foobar
    {
        public static void DoStuff(RequestResponseInfo myObj)
        {
            DoSomething_A(myObj);
            DoSomething_B(myObj);
            myObj.FinalAnswer = myObj.A + myObj.B;
        }

        private static void DoSomething_A(RequestResponseInfo myObj)
        {
            myObj.A =  myObj.InitalValue + "ob";
        }

        private static void DoSomething_B(RequestResponseInfo myObj)
        {
            myObj.B = "ar";
        }
    }

    public class RequestResponseInfo
    {
        public string InitalValue { get; set; }
        public string A { get; set; }
        public string B { get; set; }
        public string FinalAnswer { get; set; }
    }
    
posta user3384842 13.05.2014 - 17:25
fonte

1 risposta

2

Quello che stai mostrando è la programmazione con pesanti effetti collaterali, che ha il rischio di portare a codice non gestibile, perché dipende pesantemente dall'ordine di esecuzione corretto, e le firme dei metodi Do... non forniscono alcuna informazione sul loro input e output. Ecco un design alternativo:

public class MyFooBarClass  
{
    public MyFooBarClass(string initialVal)
    {
          InitalValue=initialVal;
    }
    public readonly string InitalValue;

    public string A { get { return InitalValue + "ob";}}
    public string B { get {return "ar"; }}
    public string FinalAnswer { get{return A+B;} }
}

Ora, l'ordine di esecuzione è sempre corretto, puoi accedere alle proprietà A , B o FinalAnswer in qualsiasi ordine che ti piace, l'oggetto è diventato immutabile, il che lo rende più robusto contro le modifiche o il multithreading . Naturalmente, quando chiamate FinalAnswer più volte, lo stesso calcolo verrà ripetuto di nuovo, quindi se notate una perdita di prestazioni (misurabile!), Potreste dover introdurre tecniche di memoizzazione (ma eviterei qualsiasi ottimizzazione prematura se non è un vero motivo per questo).

Un'altra alternativa di design, se hai davvero bisogno di separare l'oggetto risultato dalla classe di calcolo:

 public static class foobar
 {
    public static Result DoStuff(string initialVal)
    {
        string a = DoSomething_A(initialVal);
        string b = DoSomething_B();
        string finalAnswer = A + B;
        return new Result(initialVal,a,b,finalAnswer);
    }

    private static string DoSomething_A(string initialVal)
    {
        return initialVal + "ob";
    }

    private static string DoSomething_B()
    {
        return "ar";
    }
 }

   public class Result
   {
       public Result(string initalValue, string a, string b, string finalAnswer)
       {
           InitalValue=initalValue;
           A=a;
           B=b;
           FinalAnswer=finalAnswer;
       }
       public readonly string InitalValue;
       public readonly string A;
       public readonly string B;
       public readonly string FinalAnswer;
   }

Questo rende il flusso di dati molto più espressivo, ora si vede immediatamente ciò che ciascuno dei metodi Do usa come input, cosa restituisce come output e l'oggetto risultato è ancora immutabile.

    
risposta data 13.05.2014 - 18:30
fonte

Leggi altre domande sui tag