Nell'appendice A a The Art of Unit Testing , Roy Osherove, parlando dei modi per scrivere codice testabile dall'inizio, dice
An abstract class shouldn't call concrete classes, and concerete classes shouldn't call concrete classes either, unless they're data objects (objects holding data, with no behavior). (259)
La prima metà della frase è semplicemente D ependency Inversion di SOLID. La seconda metà sembra piuttosto estrema per me. Ciò significa che ogni volta che scriverò una classe che non è una semplice struttura dati, che è la maggior parte delle classi, dovrei prima scrivere un'interfaccia o una classe astratta, giusto? Vale veramente la pena andare così lontano nel definire le classi astratte come interfacce? Qualcuno può spiegare perché in modo più dettagliato, o rifiutarlo nonostante i suoi vantaggi per la testabilità?