Un clamoroso SÌ con TDD (e con alcune eccezioni)
Va bene controverso, ma direi che a chiunque risponda "no" a questa domanda manca un concetto fondamentale di TDD.
Per me, la risposta è un sì clamoroso se segui TDD. Se non lo sei, allora no è una risposta plausibile.
Il DDD in TDD
TDD è spesso citato come avere i principali vantaggi.
- Difesa
- Garantire che il codice possa cambiare ma non il suo comportamento .
- Ciò consente l'importantissima pratica del refactoring .
- Ottieni questo TDD o no.
- Design
- Si specifica che cosa dovrebbe fare qualcosa, come dovrebbe comporta prima di implementare esso.
- Questo spesso significa decisioni di implementazione più informate .
- Documentazione
- La suite di test dovrebbe fungere da documentazione delle specifiche (requisiti).
- L'uso di test a tale scopo significa che la documentazione e l'implementazione sono sempre in uno stato coerente: una modifica a una significa una modifica a un'altra. Confrontare con i requisiti di conservazione e progettare su un documento word separato.
Separare la responsabilità dall'attuazione
Come programmatori, è terribilmente allettante pensare agli attributi come a qualcosa di significativo e ai getter e setter come a una sorta di sovraccarico.
Ma gli attributi sono un dettaglio di implementazione, mentre setter e getter sono l'interfaccia contrattuale che fa effettivamente funzionare i programmi.
È molto più importante precisare che un oggetto dovrebbe:
Consenti ai suoi clienti di cambiare il suo stato
e
Consenti ai suoi client di interrogare il suo stato
quindi come viene effettivamente memorizzato questo stato (per il quale un attributo è il modo più comune, ma non l'unico).
Un test come
(The Painter class) should store the provided colour
è importante per la parte relativa alla documentazione di TDD.
Il fatto che l'eventuale implementazione sia banale (attributo) e non porti benefici alla difesa dovrebbe essere ignoto quando si scrive il test.
La mancanza di ingegneria di andata e ritorno ...
Uno dei problemi chiave nel mondo dello sviluppo del sistema è la mancanza di ingegneria di andata e ritorno 1 - il processo di sviluppo di un sistema è frammentato in sottoprocessi sconnessi i cui artefatti (documentazione, codice) sono spesso incoerenti.
1 Brodie, Michael L. "John Mylopoulos: cucire semi di modelli concettuali." Modellazione concettuale: fondamenti e applicazioni. Springer Berlin Heidelberg, 2009. 1-9.
... e come TDD lo risolve
È la parte della documentazione di TDD che garantisce che le specifiche del sistema e il suo codice siano sempre coerenti.
Progettare prima, implementare in seguito
All'interno di TDD scriviamo prima i test di accettazione non riusciti, solo poi scriviamo il codice che li lascia passare.
All'interno del BDD di livello superiore, scriviamo prima gli scenari, quindi li facciamo passare.
Perché dovresti escludere setter e getter?
In teoria, all'interno di TDD è perfettamente possibile per una persona scrivere il test e un'altra per implementare il codice che lo fa passare.
Quindi chiediti:
La persona che scrive i test per una classe deve menzionare getter e setter.
Poiché getter e setter sono un'interfaccia pubblica per una classe, la risposta è ovviamente sì , o non ci sarà modo di impostare o interrogare lo stato di un oggetto.
Ovviamente, se scrivi prima il codice, la risposta potrebbe non essere così chiara.
eccezioni
Esistono alcune ovvie eccezioni a questa regola: funzioni che sono dettagli di implementazione chiari e chiaramente non fanno parte della progettazione del sistema.
Ad esempio, a il metodo locale 'B ()':
function A() {
// B() will be called here
function B() {
...
}
}
O la funzione privata square()
qui:
class Something {
private:
square() {...}
public:
addAndSquare() {...}
substractAndSquare() {...}
}
O qualsiasi altra funzione che non fa parte di public
un'interfaccia che necessita dell'ortografia nella progettazione del componente di sistema.