Progettazione di una classe di lista con filtraggio e ordinamento

2

L'app che sto sviluppando deve visualizzare elenchi di elementi. Abbastanza semplice, ma ci sono un certo numero di cose che possono cambiare in base all'input dell'utente:

  • Gli articoli possono essere aggiunti / rimossi dall'elenco.
  • Gli articoli nell'elenco possono essere aggiornati. Più articoli possono essere aggiornati contemporaneamente!
  • I filtri possono essere aggiornati. Più filtri possono essere aggiornati contemporaneamente!
  • L'ordinamento degli articoli può cambiare.

Informazioni potenzialmente pertinenti:

  • È un'app Java multipiattaforma.
  • Una delle piattaforme su cui distribuiamo è MIDP, in modo da limitare le funzioni / librerie / ecc. della lingua che possiamo usare.
  • L'implementazione è attualmente suddivisa in una classe del modello (nel codice comune) e in classi di visualizzazione / controller specifiche del dispositivo.

Ho provato un paio di approcci per progettare un'implementazione di lista adatta, ma entrambi hanno degli svantaggi:

Approccio 1:

Le implementazioni del controller specifico della piattaforma sono responsabili della chiamata di un metodo refresh() ogni volta che succede qualcosa che potrebbe cambiare la lista.

Questo approccio mantiene l'implementazione della classe di lista (modello) abbastanza semplice, ma lascia molta della responsabilità fino alle implementazioni specifiche del controller della piattaforma. Più logica c'è in queste classi, maggiore è la possibilità che gli errori si insinuano. Incoraggia inoltre i controllori a notificare direttamente la visualizzazione degli aggiornamenti, il che sembra un cattivo design.

Approccio 2:

Il modello è interamente responsabile dell'innalzamento di eventi per notificare le visualizzazioni specifiche della piattaforma delle modifiche. Gli elementi dell'elenco, i filtri e gli ordinatori comunicano al modello quando cambiano, quindi avvisano le viste delle modifiche.

Ciò mantiene le classi specifiche della piattaforma molto più semplici e sembra un design più strong (minore accoppiamento tra le classi, ecc.). Tuttavia, l'implementazione della classe list diventa molto più complicata.

Il mio problema principale con questo approccio riguarda una proliferazione di eventi quando più elementi / filtri vengono aggiornati in un'unica operazione.

Le mie domande:

  1. Ci sono altri approcci che potrei / dovrei provare?
  2. Esiste un modo riconosciuto di gestire / evitare l'esplosione di eventi nell'approccio n. 2?
posta vaughandroid 24.01.2013 - 15:48
fonte

2 risposte

0
  1. Poiché gli elenchi sono il modello (e gli elementi sono solo parti di essi), suggerirei il seguente processo:

    • Una volta modificati, gli elementi generano eventi nell'elenco in cui sono posizionati.
    • Una volta modificati (direttamente o tramite una modifica degli elementi), gli elenchi generano eventi nelle viste dipendenti.
    • Elenchi che filtrano e ordinano riguardano solo le viste. Quindi gli ordinatori e i filtri non sono più elementi attivi ma solo elementi passivi manipolati dalle viste.
  2. Non lo so. Il fatto di limitare le attività di filtraggio e ordinamento agli stessi punti di vista ridurrà il numero di eventi inviati. L'unico altro modo che posso immaginare per ridurre il numero di eventi inviati è quello di essere il più specifico possibile in modo che solo i destinatari interessati ricevano un evento. Un'alternativa potrebbe essere quella di raccogliere gli eventi in un "super-evento" ricevuto da "qualcosa" che agisce di conseguenza, ma temo che non sia concettualmente una soluzione migliore.

risposta data 24.01.2013 - 18:27
fonte
0

Dato che continuerai ad aggiungere e rimuovere elementi dall'elenco ti suggerirei di utilizzare una LinkedList in quanto ciò fornisce maggiore efficienza semplicemente rimuovendo il riferimento dall'elemento rimosso al successivo disponibile nell'elenco, impedendo così la necessità di spostarsi tutti gli elementi in avanti. Nel caso del filtro è possibile implementare il modello di progettazione dei criteri. Per prima cosa dichiariamo un'interfaccia con un singolo metodo astratto:

public interface Criteria {
   /**
    * abstract method applyFilter
    * @param object to check for
    * @param users
    * @return filtered list
    */
    List<User>applyFilter(Object object, List<User>users);
}

Quindi creiamo una classe di filtro concreta che implementa questa interfaccia. Ad esempio vogliamo filtrare tutti gli utenti che hanno meno di 25 anni.

public class CriteriaAge implements Criteria {

    @Override
    public List<User> applyFilter(Object object, List<User> users) {
        Integer age = (Integer) object;
        List<User>filterList = new ArrayList<>();
        for(User u : users)
            if(u.getAge() < age)
                filterList.add(u);
        return filterList;
    }
}

Per applicare questo filtro possiamo fare:
// dal controller (contiene l'elenco completo degli utenti dal DB)

Criteria ageCriteria = new CriteriaAge();

// popola la vista con i dati presentati

System.out.println(ageCriteria.applyFilter(25));

// restituisce un elenco di utenti sotto i 25 e stampa questo fuori.

Questo esempio utilizza Pattern-View-Controller e Pattern (Criteria) Design Patterns.

    
risposta data 07.07.2015 - 16:46
fonte

Leggi altre domande sui tag