A volte, "programmare sulle interfacce" introduce possibili (ed evitabili) eccezioni di runtime?

5

Ti preghiamo di considerare com.google.common.collect.ImmutableMap

Programmando sulla sua interfaccia, Mappa , crea un bug che potrebbe esplodere nel runtime in quanto tale:

Map<String, Integer> myMap = ImmutableMap.copyOf(justSomeMap);
myMap.put(key, val); // bang. runtime error.

In questo caso, l'idea di "programma sull'interfaccia e non preoccuparti della classe di implementazione" introduce un possibile bug di runtime.

L'autore del metodo factory ImmutableMap lo ha riconosciuto e ha reso il tipo restituito una classe, non un'interfaccia. I metodi che mutano Mappa sono stati deprecati in ImmutableMap consentendo così al compilatore di emettere avvisi.

  • Tutto ciò che ho detto sopra è corretto?

Successivamente, una nuova interfaccia ImmutableMapInterface potrebbe essere stata facilmente creata per la classe ImmutableMap . ImmutableMapInterface sarebbe esattamente Mappa ma solo senza i metodi che consentirebbero a ImmutableMap di mutare. Ci sono ImmutableMapInterface , puoi continuare a programmare sulle interfacce.

Quindi, perché non c'è ImmutableMapInterface ? Ho intenzione di indovinare la ragione è solo convenienza. Sono d'accordo. Creare un'interfaccia per ogni singola classe suona un po 'troppo estrema. giusto?

    
posta red shoe 24.03.2015 - 03:09
fonte

1 risposta

7

Java lo fa in alcune occasioni ed è un abominio per l'uomo.

Questo genere di cose è una violazione da manuale del principio di sostituzione di Liskov, che porta al tipo di bug che descrivi. Il codice ben scritto non lo fa.

Hai ragione che creare un'interfaccia per ogni singola classe è assurdo. Hai bisogno di usare un po 'di pragmatismo nel decidere su cosa fare un'interfaccia e cosa no. L'altra cosa da ricordare è che il consiglio esisteva già nei giorni C, C ++. "Programma su un'interfaccia" non significa letterale interface in Java o C #. Funziona altrettanto bene con web apis o protocolli Internet ... Qui un'interfaccia è un comportamento garantito / esposto, non l'implementazione sottostante.

    
risposta data 24.03.2015 - 03:37
fonte

Leggi altre domande sui tag