Modelli per evitare il blocco dell'interruttore lungo nell'interfaccia utente?

6

A volte hai molte entità che hanno parti comuni, ma dovrebbero anche essere indirizzate in modo univoco nell'interfaccia utente. Ad esempio, in un CMS, hai molti tipi di contenuti (come notizie, immagini, articoli, pagine, ecc.) Che hanno in comune titolo, URL, impostazioni SEO, ecc. Ma che hanno anche campi specifici. Ad esempio, l'immagine ha un campo percorso, mentre le notizie non hanno questo.

Ora, quando vuoi lavorare con questi articoli per pagina, incontri blocchi lunghi switch e if . Ad esempio:

switch(currentLoadedContentType)
{
   case ContentType.Gallery:
       // Show gallery specific fields;
       break;
   case ContentType.News:
       // Show news specific fields;
       break;
   case ContentType.Artiel:
       // Show artiels specific fields;
       break;
   case ContentType.Page:
       // Show pages specific fields;
       break;
}

Man mano che aumenti il numero di tipi di contenuti, questi elenchi diventano sempre più lunghi. Quali modelli sono disponibili per ridurre la lunghezza o eliminare questo interruttore lungo, ma allo stesso tempo non comportano la ripetizione. (Sono un grande fan di DRY).

    
posta Saeed Neamati 04.08.2011 - 10:17
fonte

2 risposte

11

Dovresti utilizzare un modello di strategia per gestire i diversi tipi di contenuti. È possibile inserire le strategie in una tabella di ricerca e quindi recuperarle in base alle esigenze. La tabella di ricerca potrebbe essere alimentata da un file di configurazione, se necessario.

public void RegisterContentHandlingStrategies()
{
    strategies.put(ContentType.Gallery, new GalleryContentHandler());
    strategies.put(ContentType.News, new NewsContentHandler());
}

public void HandleContent(Content content)
{
    ContentHandler handler = strategies.Get(content.Type);
    handler.handleContent(content);
}
    
risposta data 04.08.2011 - 10:34
fonte
1

Suppongo che tu mostri i campi in modo generico (ad esempio un propertygrid).

In tal caso, è possibile rendere gli oggetti del modello noti sui propri dati "pubblici". Ad esempio, la classe base del modello ha un metodo user_customizable_properties , e nella vista, invece dell'istruzione switch, potresti fare qualcosa di simile

for field in currentLoadedContentType.user_customizable_properties():
    show_field(field)

I framework come ruby / rails o django forniscono in questo modo la loro interfaccia scaffolding / admin (anche se usano un po 'più di riflessione del mio esempio)

    
risposta data 12.09.2011 - 16:07
fonte

Leggi altre domande sui tag