Ho fornito solo codice semplificato in quanto è più una domanda di disegno astratto.
Quindi ho molti, molti oggetti di eventi business / dominio nidificati, ad es.
public class Event
{
//bunch of properties and standard accessors
}
public class ExplosionEvent extends Event
{
//properties and standard accessors
}
E molti altri di questi a diversi livelli. Se ho bisogno di informazioni su un dato oggetto scelto, lo mostro in HTML così
private String generateHTML(Event event)
{
StringBuilder sb = new StringBuilder();
sb.append("<HTML><table>");//simplified
sb.append("<TH>Time</TH>");
sb.append("<TD>" + event.getEventTime() + "</TD>");
if (event instanceof ExplosionEvent)
{
//append HTML and ExplosionEvent specific data
}
// ...many, many more calls like the one above
sb.append("</table></HTML>");
}
Dato che ho molti tipi di eventi, questo significa un sacco di tag di tabella HTML duplicati e usi di instanceof
così generateHTML
è lungo centinaia di righe, ovviamente diviso in metodi, ma ancora, è un sacco di codice che rende questo difficile da capire, navigare e quindi mantenere.
Questo è brutto e ho bisogno di un design migliore per questo. Ho avuto l'idea di creare un metodo su Event
che è sovrascrivibile da tutti i metodi secondari
//Using LinkedHashMap to preserve order as Properties wont do that
public LinkedHashMap<String, String> getAttributes()
{
LinkedHashMap<String, String> list = new LinkedHashMap<String, String>();
list.put("Time", eventTime);
}
le sottoclassi sovrascrivono questo, chiamano i loro genitori e aggiungono la data specifica ad esse nella lista, il che significa che indipendentemente dal numero di classi Event
, il metodo esistente generateHTML
(esterno a Event
oggetti) quindi è sufficiente un piccolo ciclo
private String generateHTML(Event event)
{
StringBuilder sb = new StringBuilder();
b.append("<HTML><table>");
for (Entry<String,String> entry : event.getAttributes().entrySet())
{
sb.append("<TH>" + entry.getKey() + "</TH>");
sb.append("<TD>" + entry.getValue() + "</TD>");
}
sb.append("</table></HTML>");
}
Questo sta mettendo troppa logica negli oggetti business / domain?
C'è un modo migliore ?