Stavo rifacendo una domanda per rispettare i principi SOLIDI. Quando stavo applicando la segregazione dell'interfaccia ho trovato il seguente caso:
interface A
{
void methodA();
void methodA2();
}
interface B
{
void methodB();
void methodB2();
}
interface C : A, B
{
void methodC();
}
interface D
{
void methodD();
void methodD2();
void methodD3();
//Same signature and semantics as in interface C
void methodC();
}
Poiché methodC è lo stesso nell'interfaccia C e D ma l'interfaccia D non ha bisogno dei metodi di A e B, ho estratto methodC in un'altra interfaccia, quindi il design sarebbe.
interface A
{
void methodA();
void methodA2();
}
interface B
{
void methodB();
void methodB2();
}
interface C : A, B, E
{
}
interface D : E
{
void methodD();
void methodD2();
void methodD3();
}
interface E
{
void methodC();
}
Ora ho e interfaccia solo con metodi ereditati e nessun metodo a sé stante. Ciò significa che non devo refactoring i client che dipendono dall'interfaccia C per segregarlo.
Questo è un buon progetto considerando l'interfaccia refactored C non dichiara i propri metodi ma funge solo da contenitore di ereditarietà? Devo invece ridefinire i client che dipendono dall'interfaccia C e aggiungere dipendenze dirette all'interfaccia A, B ed E? In pratica questo non ha molto impatto sul codice in quanto esiste un solo client, ma è concettualmente valido?
Inoltre, questa sarebbe una buona scelta progettuale per evitare di avere troppe dipendenze dirette (parametri del costruttore se si utilizza l'iniezione delle dipendenze del costruttore, ad esempio) che sono semanticamente correlate?