Domanda intervista - Aggiunta di un metodo all'interfaccia che è stato implementato da migliaia di classi [chiuso]

3

C'è uno scenario in cui ho un'interfaccia X, che è stata implementata con le mie migliaia di classi. Ora voglio aggiungere un nuovo metodo in quell'interfaccia X. Quindi, come apportare le modifiche in modo minimale per risolvere il problema dei metodi sovrascritti in tutte le mie classi.

Non aggiungere metodi predefiniti di Java 8 nelle risposte.

    
posta Atul 07.03.2015 - 14:41
fonte

5 risposte

11

La prima cosa che proverei in questa situazione è di evitare un cambio di interfaccia. È possibile aggiungere un'interfaccia estesa, derivata da quella originale, con il nuovo metodo aggiunto e creare il codice che usa quell'interfaccia in combinazione con il nuovo metodo che si aspetta di ottenere un oggetto di tipo "ExtendedInterface" .

Se ciò non è possibile, ad esempio perché il codice in gioco è al di fuori del proprio controllo, è possibile aggiungere una classe astratta con un'implementazione predefinita per il nuovo metodo nella gerarchia di ereditarietà tra l'interfaccia e tutte le derivazioni. Anche per migliaia di classi, i cambiamenti necessari nella base di codice possono probabilmente essere fatti in poche ore con qualche ricerca / sostituzione globale, o creando un piccolo script o un programma di supporto, con un basso rischio di rompere qualcosa.

Quale di questi approcci è migliore dipende da quale parte del codice base è effettivamente permesso di cambiare, e che cosa significa in realtà "modo minimale".

    
risposta data 07.03.2015 - 15:59
fonte
2

Il commento è corretto, se hai veramente migliaia di classi e nessuna classe base comune, questo è un odore di codice che dovrebbe essere risolto per primo. Classi che condividono un'interfaccia comune ma nessun codice dovrebbe essere raro.

Altrimenti, usa uno strumento. Ad esempio, il resharper per C # ti darà la possibilità di implementare effettivamente quel metodo in tutte le classi che implementano l'interfaccia. Ovviamente è solo una parte del lavoro da fare, ma almeno lo è ancora. Per letteralmente migliaia di classi, immagino che scrivere il tuo strumento sarebbe ancora più veloce di farlo manualmente.

    
risposta data 07.03.2015 - 15:11
fonte
1

Questa è una pratica che ho visto nel settore.

  • Creano una nuova interfaccia con un numero aggiunto, ad esempio Interface2 e fanno in modo che contengano metodi nell'interfaccia precedente.
  • Rendi obsoleta la vecchia interfaccia
  • In caso di una revisione completa, molto probabilmente verrà aggiunto un nuovo pacchetto (si pensi alla revisione quando Java JDK introduce il nuovo meccanismo per file e IO in nio). Questo è il momento di rimuovere il numero dall'interfaccia, con una nuova interfaccia in un pacchetto diverso

Questo approccio consente nuovi metodi nell'interfaccia, è possibile avere una soluzione molto flessibile per vari modi di implementare la nuova interfaccia.

  • Non infrange gli utenti esistenti.
  • Fornisce un periodo di buffer quando le modifiche possono consolidarsi e / o essere sperimentate prima che la vecchia interfaccia venga effettivamente rimossa dopo essere stata deprecata.
risposta data 07.03.2015 - 16:42
fonte
1

Ci sono diversi aspetti da considerare, prima di decidere come modificare il codice.

Considerare il caso in cui terze parti hanno scritto codice che utilizza o implementa questa interfaccia. Ciò aumenterebbe significativamente la complessità della gestione delle modifiche al codice richieste, nonché l'aggiunta di un elemento politico al processo, creando lavoro (e costi) per altre società.

Poiché questa interfaccia è già stata implementata in molte classi è un strong indicatore contro le modifiche all'interfaccia corrente. È necessario prendere in considerazione le conseguenze su tutte le implementazioni di questo nuovo metodo di interfaccia.

Il fatto che tutte queste implementazioni siano state completate senza aver bisogno di questo nuovo metodo è un flag di avviso che forse questo non è veramente fondamentale per questo scopo dell'interfaccia e che dovrebbe essere implementato come una nuova interfaccia separata sulla base del fatto che questo è un uso separato (ma correlato) dell'oggetto e richiede la sua interfaccia.

Detto questo, supponendo che controlliamo tutto il codice che utilizza questa interfaccia, implementerei il nuovo metodo in tutte le classi implementando esplicitamente il nuovo metodo.

per es.

public class MyObject : ITheInterface
{
    public void ITheInterface.NewMethod(int age)
    {
        throw new NotImplemented("NewMethod needs to be implemented on MyObject");
    }
}

Implementando il metodo in modo esplicito come questo, il codice chiama solo la nuova implementazione quando utilizza un riferimento digitato come ITheInterface per l'oggetto.

    
risposta data 07.03.2015 - 18:13
fonte
0

Il minore di due mali, se non ti è permesso di ridefinire le classi di implementazione, è di non aggiungere il metodo all'interfaccia. Non esiste una situazione ragionevole in cui si dovrebbe rompere la compatibilità con l'interfaccia esistente. Il nuovo metodo appartiene a una nuova interfaccia e qualsiasi classe che deve utilizzarlo dovrà implementare la nuova interfaccia. Le probabilità sono, non tutte le 1.000 classi che implementano l'interfaccia esistente avranno bisogno del nuovo metodo, e se le imponi a te finiranno con tonnellate di implementazioni vuote, che sarà una perdita di tempo e spazio sullo schermo per chiunque sia coinvolto nel mantenimento del codice.

Indipendentemente dalla risposta che si finisce per dare a questa domanda, vorrei seriamente mettere in dubbio se si vuole lavorare per questa azienda. Se questa è una preoccupazione comune per loro, allora chiaramente non sanno cosa stanno facendo. Se in realtà non hanno questi tipi di problemi, allora stanno sprecando il tuo tempo con una domanda di intervista inutile. Nulla di buono può venire da questo.

    
risposta data 08.03.2015 - 00:40
fonte

Leggi altre domande sui tag