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?