Ho scritto un pezzo di codice al mio lavoro qualche tempo fa. Mentre scrivevo il codice, scrivevo poche interfacce che mi permettevano di aggiungere più flessibilità e in quel momento stavo anche cercando di capire il concetto di OOP più in profondità. Quindi nell'interfaccia che ho scritto ho una firma del metodo simile a questa:
void Add(ImyBase objToAdd)
E quindi ho poche classi che implementano questa interfaccia. Ma quello che mi infastidisce è che mi trovo a fare questo genere di cose abbastanza spesso in questo metodo Add
public void Add(ImyBase objToAdd)
{
if(!(objToAdd is ImyBaseDeviation))
throw new ArgumentException("blablabla");
//do stuff
}
All'epoca era un odore per me, ma non mi ero preoccupato di questo semplicemente perché sono solista su questo progetto e questo pezzo di codice è usato solo all'interno della mia compagnia e ci sono solo 2 ragazzi IT ( io + qualcun altro) e questo non è vicino a cambiare. Comunque recentemente sono tornato su quel pezzo di codice e dalla mia precedente lettura (in realtà più di questo, ma questo è abbastanza simile) ora mi sembra davvero male e sto cercando di capire il modo migliore per migliorare questo pezzo di codice.
Non mi piace il codice così com'è ora perché l'interfaccia consente più che il tipo concreto generalmente consente così sostanzialmente che l'implementazione del concret non rispetti il contratto dato dall'interfaccia.
I tough of a few solutions
Per prima cosa elimina semplicemente il metodo Add
dall'interfaccia, poiché comunque chiamare Add
ha un'alta probabilità di generare un'eccezione. Quindi per chiamare Add
hai comunque bisogno del tipo concret. Quindi qui l'oggetto avrebbe ancora un metodo Add
ma con il tipo accettato come parametro.
In secondo luogo aggiungi un metodo che assomiglierebbe a qualcosa di simile nell'interfaccia
bool IsValidToAdd(ImyBase objToTest)
Ma questo non mi soddisfa.
Quindi sto cercando consigli da persone più avanzate come te per aiutarmi a capire quale sarebbe il modo migliore per implementarlo, in modo che rimanga il più pulito possibile.
Scusa se non sono un anglofono nativo, quindi se la mia domanda necessita di editing o correzione della grammatica, per favore procedi. Grazie