Creazione di un'interfaccia nella libreria standard di una lingua?

2

Nel processo di apprendimento dello sviluppo basato sui test, sono stato introdotto all'input delle dipendenze e all'uso delle interfacce e ho iniziato a utilizzare questi concetti nel mio codice PHP per renderlo più testabile.

Ci sono state volte in cui ho avuto bisogno di testare il codice che stava facendo cose come chiamare la funzione PHP time() . Per rendere prevedibili questi test, mi è sembrato logico creare un'interfaccia per le funzioni PHP standard che utilizzo in modo da poterli prendere in giro nei miei test.

Questo buon software è progettato? Quali sono i pro e i contro di fare questo? Mi sono trovato a lamentarmi di quanto velocemente la mia interfaccia PHP possa infilare le sue dita in tutto ciò che faccio. C'è un modo migliore per rendere più testabile il codice che si basa sullo stato di accesso a PHP e funziona?

    
posta Nathan Arthur 11.06.2014 - 19:01
fonte

2 risposte

5

Devi sottrarre le chiamate a time() come dovresti estrapolare le chiamate a rand() e il suo elenco. La ragione per farlo è che funzioni come quella sono forme di stato globale non deterministico. Lo stato globale non deterministico rende i test molto più difficili perché non è possibile isolare i test e testare tutte le condizioni contemporaneamente. Immagina se dovessi aspettare fino a dopo mezzogiorno per vedere se il mio codice dicesse "Buonasera" invece di "Buongiorno" o "Buonasera"!

Se vedi che la tua interfaccia sta iniziando a permeare la tua applicazione, questa potrebbe non essere una brutta cosa. Se mai, ti sta dicendo quanto stai usando queste funzioni integrate. Puoi dipendere da te per mantenere il tuo codice e le tue interfacce all'interno della tua base di codice, quindi non dovresti avere tutte le preoccupazioni su un'interfaccia in movimento che causa un intervento chirurgico con fucile a pompa. Estrarre via time() dovrebbe essere un'interfaccia abbastanza stabile e probabilmente non dovrebbe vedere alcuna modifica per la maggior parte.

L'alternativa a un'interfaccia è semplicemente iniettare il risultato di una chiamata su time() piuttosto che chiamarlo nel metodo. Quindi scrivi getGreeting(time()); invece di scrivere getGreeting($timeUtil); (che nel metodo fa $time = $timeUtil->getTime() ). Questo aderisce più strettamente alla Legge di Demetra poiché non stai raggiungendo una cosa attraverso un'altra, ma significa anche che il tempo che vuoi deve essere il momento in cui viene invocato il metodo.

Un'alternativa alternativa è quella di passare a un riferimento di funzione piuttosto che generare un'interfaccia separata. In PHP, puoi fare qualcosa di simile:

function getTime($timeFunc) {
    return call_user_func($timeFunc);
}

echo getTime('time')."\n"; # Call the built-in time function
echo getTime(function() { # Call a custom function
    return 1;
})."\n";

Questo ha un sovraccarico minore dell'interfaccia in piena regola pur consentendo alla funzione di essere chiamata pigramente e consentendo l'iniezione di dipendenza.

    
risposta data 11.06.2014 - 20:21
fonte
2

Puoi

  • crea interfacce con i metodi dello stato del sistema come la data o il contenuto della sessione / cookie come suggerito o,
  • inserisci queste informazioni nel metodo di business come parametri aggiuntivi.

Esempio:

  • il modulo di fatturazione può ottenere la data della fattura stessa tramite un'interfaccia o
  • il chiamante del modulo di fatturazione può fornire la data della fattura.

Preferisco il secondo metodo, anche se questo significa che ogni volta che il modulo necessita di più informazioni sullo stato, è necessario modificare la firma del metodo. Dall'altra parte, nel test è molto più semplice fornire parametri che a simulare i metodi.

I've found myself groaning at how quickly my PHP interface can stick its fingers into everything I do.

Se il tuo modulo ha bisogno di troppi parametri o troppe interfacce, questo potrebbe essere un indicatore del fatto che il tuo modulo sta facendo troppo e viola "separazioni di dubbi".

    
risposta data 11.06.2014 - 19:37
fonte

Leggi altre domande sui tag