Qual è l'implementazione della funzione C più testabile? [chiuso]

-2

Scrivo codice in C. Ho cercato di scrivere un codice più testabile, ma sono un po ' confuso nel decidere tra la scrittura di funzioni pure che sono veramente buone per i test ma richiedono funzioni più piccole e pregiudicano la leggibilità secondo me e le funzioni di scrittura che modifica alcuni stati interni.

Ad esempio (tutte le variabili di stato sono dichiarate statiche e quindi sono "private" al mio modulo):

Quale di questi è più testabile secondo la tua opinione:

int outer_API_bar()
{
   // Modify internal state
   internal_foo()
}

int internal_foo()
{
  // Do stuff

  if (internal_state_variable)
  {
     // Do some more stuff
     internal_state_variable = false;
  }
}

o

int outer_API_bar()
{
   // Modify internal state

   internal_foo(internal_state_variable)

   // This could be another function if repeated many
   // times in the module
   if (internal_state_variable)
   {
      internal_state_variable = false;
   }
}

int internal_foo(bool arg)
{
  // Do stuff

  if (arg)
  {
     // Do some more stuff
  }
}

Anche se la seconda implementazione è più testabile a internal_foo in quanto non ha effetti collaterali ma rende la barra più brutta e richiede funzioni più piccole che rendono difficile per il lettore persino seguire piccoli frammenti poiché deve spostare costantemente l'attenzione su diverse funzioni.

Quale pensi sia meglio? Confronta questo con la scrittura del codice OOPS, le funzioni private per la maggior parte del tempo usano lo stato interno e non sono pure. Il test viene eseguito impostando lo stato interno su un'istanza dell'oggetto fittizio e testando la funzione privata. Mi viene un po 'confuso se utilizzare o se passare in stato interno a funzioni private per motivi di "testabilità"

    
posta user110036 24.07.2014 - 08:25
fonte

1 risposta

1

Il secondo è migliore, ma

int internal_foo(bool *arg); // modifies argument

lo mantiene testabile mentre corregge il tuo piccolo compromesso di funzioni e

bool internal_foo(bool arg); // returns new value

è ancora meglio se non usi il valore di ritorno esistente.

Si noti che in generale però, avere molte piccole funzioni non è necessariamente un problema. Se rende il tuo codice meno leggibile, potresti semplicemente dare loro nomi migliori e / o rielaborare la tua logica.

La soluzione migliore e più generale sarebbe rimuovere completamente i globals e far sì che il chiamante passi un contesto API opaco nella funzione esterna. Questo potrebbe essere eccessivo nel tuo caso però, non posso dire dal codice mostrato.

    
risposta data 24.07.2014 - 15:15
fonte

Leggi altre domande sui tag