Penso che la parte peggiore dell'interfaccia sia il fatto che esiste un accoppiamento temporale.
Ci si aspetta che i client dell'interfaccia chiamino i metodi nell'ordine corretto, e questo ordine non è applicato dal sistema dei tipi, quindi può essere dedotto solo da prove ed errori o dalla conoscenza del dominio preesistente.
Il mio pensiero iniziale è di mantenere un'interfaccia separata e pulita per la connessione che può essere utilizzata per inviare materiale:
public interface IConnection // don't pay too close attention to the name, there are better
{
void Send(char c);
char Recieve();
}
Voglio che il codice client che usa la connessione semplicemente faccia cose del tipo:
using (var connection = probablyAnInjectedFactory.Dial(someNumber))
{
// do stuff with the connection
}
Stuff come le connessioni di apertura e chiusura in realtà dovrebbero essere incapsulate nel tipo di implementazione che penso. Una connessione potrebbe essere aperta nel costruttore (tramite alcune dipendenze iniettate) o da una fabbrica. Chiudere la connessione è bello da catturare nel pattern IDisposable
(penso che si chiami AutoCloseable
o qualcosa del genere in Java?)
Ovviamente è necessario apportare alcune modifiche a seconda del progetto e dei requisiti. Forse le istanze di connessione devono essere riutilizzabili o raggruppate, ecc. Il punto principale che sto cercando di trasmettere è: Se stai lavorando in una lingua tipizzata staticamente, USERLA. Rendetelo LETTERALMENTE IMPOSSIBILE per compilare codice con bug (sì, so che è impossibile, intendo come obiettivo asintotico). Fai il modo giusto per usare i tuoi tipi l'UNICO modo per usarli.
Alla fine, ciò consente di risparmiare ore infinite per gli sviluppatori che non hanno più bisogno di cercare nella documentazione scarsa o deprecata per capire in quale ordine magico chiamare i metodi. In questo caso, penso che sia una cosa molto più preziosa della rigida definizione di SRP di Uncle Bob.