L'uso eccessivo dei delegati è una cosa negativa?

1

Buongiorno.

Mi è stato detto che una buona pratica per i metodi di scrittura è di rendere il metodo solo responsabile di fare una cosa. Per me aveva senso ora che lo guardavo indietro a posteriori. Ci sono un paio di motivi per cui mi piace codificare in questo modo - per me sono:

  1. Il codice è gestibile
  2. Il codice è più leggibile
  3. Una migliore comprensione di ciò che il metodo fa è mantenuto

Ma ecco che arriva il problema che mi riguarda. A volte l'esecuzione di un'attività richiede più di 1 azione da eseguire. Un sacco di codice degli sviluppatori che guardo ogni giorno fa da 7 a 8 cose per metodo, dove potrebbe essere stato suddiviso e assegnato a un delegato per eseguire i metodi in sequenza.

Lavorando su progetti enormi, quali saranno le implicazioni dell'uso di molti delegati per eseguire i metodi in sequenza? Dovrei preoccuparmi di usare molti delegati nel mio codice?

Esempio -

private delegate void Factory();
    Factory factory = null;
    protected void Page_Load(object sender, EventArgs e)
    {
        try
        {
            factory += SetCatalogClientProxy;
            factory += SetHelper;
            factory += GetAccessToken;
            //factory += GetCatalog;
            factory += GetToken;
            factory.Invoke();
        }
        catch (Exception ex)
        {
            AddToResult(ex.Message + NEWLINE + ex.StackTrace.Replace(" at ", " at " + NEWLINE).Replace(" in ", " in " + NEWLINE));
        }
    }

    #region Test Process Methods

    private void SetCatalogClientProxy()
    {
        catalog = new JAM.CatalogClientProxy();
        AddToResult("CatalogClientProxy Successfully initialized");
    }

    private void SetHelper()
    {
        helper = new JAM.HelperClass();
        AddToResult("HelperClass Successfully Intialized");
    }

    private void GetAccessToken()
    {
        accessToken = JAM.CatalogClientProxy._accessToken;
        if (string.IsNullOrEmpty(accessToken))
        {
            catalog.GetACSClaim();
            accessToken = JAM.CatalogClientProxy._accessToken;
        }
        AddToResult("Accesstoken Retrieved." + NEWLINE + accessToken);
    }

    private void GetCatalog()
    {
        catalog.CallCatalogService("fullcatalog", utcTime, country, "2", false);
        AddToResult(helper.Catalog(baseUrl, utcTime, page, country, accessToken));
    }

    private void GetToken()
    {
        var Fulfillment = new JAM.FulfillmentServiceProxy(Guid.NewGuid().ToString());
        ClassImport.FulfillmentInfo result = Fulfillment.GetToken("ABC-11111", "123456", "ZA", "123456", "123456", JAM.CatalogClientProxy._accessToken);

        if (result != null)
        {
            var output = "Products" + NEWLINE;
            foreach (var p in result.Products)
            {
                output += "    " + p.ProductName + "<br/>";
                foreach (var l in p.Links)
                {
                    output += "        " + l.Uri + "<br/>";
                }
            }
            AddToResult(output);
        }
        else
        {
            AddToResult("No products Found");
        }
    }
    #endregion

    #region Logging To Page

    private void AddToResult(string text)
    {
        result.InnerHtml += String.Concat("<strong>[", DateTime.Now.ToString(), "]</strong> ", text, NEWLINE);
    }

    #endregion

Questo è da una delle mie pagine di test. C'è solo 1 delegato qui, ma su altri progetti su cui lavoro a volte ho 5 o 6 delegati impostati in modo simile per eseguire i metodi in sequenza, dove cerco di mantenere i metodi a 1 azione ciascuno.

    
posta Eon 16.07.2014 - 15:07
fonte

1 risposta

8

I have been told that a good practice for writing methods is to make the method only responsible for doing one thing.

Il problema comune che le persone hanno con questo è che lo prendono troppo alla lettera. Se una funzione può sempre e solo fare una cosa, come fai mai più di una cosa?

Se la tua "cosa sola" richiede 5 passaggi, allora crea una singola funzione che faccia questi 5 passi e solo quei 5 passaggi. A turno, ognuno di questi passaggi dovrebbe essere una funzione che esegue quel passaggio e solo quel passaggio (che a sua volta può essere 3 passaggi più piccoli).

Una singola responsabilità richiede necessariamente più responsabilità minori, altrimenti non scriverei un metodo ... dovresti semplicemente usare la responsabilità più piccola direttamente.

Working on huge projects, what will the implications be of using a lot of delegates to run methods sequentially?

  • I delegati tendono ad essere un contratto più debole rispetto ad altre associazioni. Dal momento che può fare qualsiasi cosa finché incontra la firma del delegato, il tuo codice può diventare molto fragile e difficile da ragionare.
  • Direi che ... metà degli sviluppatori C # o così non sanno nemmeno che i delegati sono multicast.
  • Il comportamento di gestione delle eccezioni nei delegati multicast non sarà quello che vuoi sempre.
  • L'ottimizzatore (e JITer) può fare molto, molto meno con i delegati rispetto a una funzione reale. L'impatto varierà a seconda del compilatore e del runtime di destinazione. Misura per essere sicuro.
risposta data 16.07.2014 - 16:18
fonte

Leggi altre domande sui tag