Per codice specializzato, utilizzare interfacce e tipi personalizzati o generici disponibili?

2

Userò Java come esempio, ma la domanda mi viene in mente con qualsiasi lingua / framework / stack / pattern / ...
Per esempio in Python, dovrei semplicemente usare un dict () o dovrei sottoclassi per rendere chiare le mie intenzioni? o è la violazione del principio di tipizzazione delle anatre di pitone? o ...

Immagina un semplice Echo Server in esecuzione sulla porta X. Il Server è composto da:

  • Server accetta i client e li consegna ai gestori client.
  • ClientHandler , che gestisce i client connessi (doh!)

Il server principale ha un elenco di gestori client registrati e passa la richiesta ricevuta ai gestori client in questo elenco, in modo che possano gestirli o ignorarli (non un buon progetto ma è semplice). Ora potremmo avere un ClientHandler che riecheggia il testo ricevuto in maiuscolo, uno che riecheggia solo la metà di esso, uno che ...
Ora considera queste due versioni:

interface GenericServer {
    void start();
    void stop();
    // ... other server related stuff, such as set backlog.

    void registerHandler(java.util.Observer o); 
}

Sembra che mi dattilografi, ma in Java! Va bene passare in qualsiasi oggetto di tipo java.util.Observer come gestore. Per quanto riguarda GenericServer , dovrebbe essere in grado di osservare.
Potremmo anche fare:

interface SpecializedServer {
    // Marker interface to make everything more clear.
    interface ClientHandler extends java.util.Observer { }

    void start();
    void stop();
    // ... other server related stuff, such as set backlog.

    void registerHandler(ClientHandler ch); 
}

Ora usa un'interfaccia Marker per dire Attenzione! L'osservatore passato DEVE essere un ClientHandler! deve conoscere i clienti .

Ma l'uso eccessivo dell'interfaccia marcatore potrebbe anche essere un segno di cattiva progettazione. Quale versione di questi due server è il modo giusto per farlo? qual è la cosa giusta da fare?

    
posta hkoosha 03.04.2015 - 19:25
fonte

1 risposta

3

Non estenderei java.util.Observer con un'altra interfaccia a meno che tu non stia aggiungendo effettivamente nuove definizioni di membri.

A mio parere, avvolgere semplicemente un'interfaccia in un'altra per cambiare il suo nome non è una giustificazione sufficiente. I tuoi colleghi programmatori crederanno che ClientHandler definisca membri aggiuntivi, quando invece non lo fa. E lo scopo di java.util.Observer è presumibilmente già ben compreso.

    
risposta data 03.04.2015 - 19:37
fonte

Leggi altre domande sui tag