Violazione dell'interfaccia Principio di segregazione?

2

Al momento ho un'interfaccia chiamata InternalEntityIdTransformer , che ha un metodo getInternalId , che dato un ID esterno restituisce quello interno corrispondente.

Ora sto lavorando su funzionalità che dovranno fare la trasformazione opposta e passare dall'ID interno all'ID esterno. Sta aggiungendo un metodo getExternalId a questo InternalEntityIdTransformer una brutta violazione del ISP ? (Tutti i posti che attualmente utilizzano questa interfaccia necessitano solo del getInternalId e non si preoccuperanno del getExternalId in nessun punto.)

E se lo è, allora è particolarmente dannoso? Dovrei avere piuttosto due interfacce dedicate qui?

Il linguaggio utilizzato è Java, PHP o C #.

    
posta Jeroen De Dauw 22.05.2013 - 18:00
fonte

2 risposte

4

L'ISP dice fondamentalmente che non è bello richiedere a una classe di implementare cose non correlate e / o fare in modo che un client richieda cose non correlate. I metodi in un'interfaccia sono correlati - un client potrebbe aver bisogno di tutti loro per completare un compito ragionevole.

Penso che getInternalID e getExternalID appartengano a interfacce separate, poiché i client che desiderano uno di questi non hanno bisogno dell'altro, secondo le tue parole.

La classe che implementa attualmente InternalEntityIdTransformer potrebbe implementare felicemente un'interfaccia in più, ad esempio ExternalEntityIdTransformer , se la condivisione dei dettagli di implementazione ti consente di risparmiare un po 'di lavoro. Se in un dato momento avresti bisogno di dividere le implementazioni (ad esempio esterno a interno è banale, ma il contrario richiede un sollevamento pesante), sarà indolore, come dovrebbe essere.

    
risposta data 22.05.2013 - 18:41
fonte
5

L'ISP è un principio interessante perché i benefici (o piuttosto i costi di ignorarlo) sono generalmente piccoli, ma anche il costo di implementazione è ridotto.

Il tipo di problema che potrebbe verificarsi è se, ad un certo punto, vuoi più strategie per ottenere un'interfaccia interna, ma solo una per ottenere un'interfaccia esterna (o viceversa).

E penserai subito "no, non succederà", ma ti avverto che l'ho fatto esattamente di recente e mi sono fatto morso.

Ho ricevuto due dati da un servizio web e ho pensato "bene se cambiano il servizio, dovrò cambiare entrambi i client." Quindi perché preoccuparsi? Un ovvio truismo, potresti immaginare.

E poi mi hanno dato un file CSV per metà dei dati, che era più veloce e conteneva più dati. Volevo, per un certo periodo, poter passare da uno all'altro, mentre ci assicuravamo che il file CSV rispondesse a tutti i nostri bisogni. Ma volevo ancora ottenere l'altra metà dei dati dallo stesso posto.

Quindi, ora voglio davvero suddividerlo in tre classi, ma farlo era un problema perché avevo solo un'interfaccia. La soluzione è abbastanza semplice, ma mi ha causato dolore nei miei test unitari.

Ho desiderato di aver seguito l'ISP in quel caso, anche se il costo era abbastanza basso, e mi sono preso a calci perché dovevi chiedere ... perché non l'ho fatto? C'è zero costi per avere due interfacce per una classe di servizio per due diverse classi client.

    
risposta data 22.05.2013 - 18:44
fonte

Leggi altre domande sui tag