Design Pattern for Filtering [closed]

0

Ho un requisito in cui viene visualizzato un elenco di oggetti come Elenco.

Ora ho i criteri dei filtri che devo applicare per filtrare gli oggetti nell'elenco.

Attualmente sto pensando di usare la catena di responsabilità.

Quindi i miei criteri potrebbero essere dire, Nomi nella lista nera, nomi nella whitelist ecc. Quindi se un oggetto contiene un nome che è nella lista nera, devo rimuoverlo dall'elenco finale.

Si prega di suggerire quale modello è adatto a questo problema.

    
posta behinddwalls 10.04.2015 - 17:10
fonte

1 risposta

0

In questa fase dello sviluppo che descrivi, non consiglierei di cercare un determinato modello e di implementarlo. Proprio come primo passo, raccogli ciò che sai:

  • Devi filtrare
  • conosci determinati criteri
  • Hai un oggetto list di tipo List
  • Ti piacerebbe avere (presumo) un nuovo listFiltered dello stesso tipo List .

Ora dipende dalle librerie e dalla lingua con cui lavori. Si potrebbe pensare ad un metodo di libreria finito che prende un list di tipo List e applica una funzione di filtro definita dall'utente per restituire una copia filtrata. O forse è disponibile un tipo speciale di iteratore (o cursore) che accetta un argomento di filtro, itera e restituisce solo gli elementi appropriati saltando quelli non adatti.

Quindi il mio secondo passo che consiglio è di cercare se qualcuno ha risolto lo stesso problema, usando una funzione di libreria o forse ha notato uno snippet. Inoltre, potrebbe essere che hai risolto un problema simile in precedenza. Potrebbe essere utile adottare ciò che hai scritto in precedenza.

Se non trovi nulla di simile, la mia raccomandazione come terzo passo sarebbe quella di implementare direttamente ciò di cui hai bisogno. Potrebbe assomigliare a questo (tutto il codice è pseudocodice):

class MyTools {
    ...
    List filterList(list, filterCriteria) ... 
    ...
}

o

class ListHelper {
    ...
    List filter(list, filterCriteria) ...
    ...
}

Alcuni progetti di base di discussione per la funzione filtro (pseudocodice):

List filter(list, criteria) {

    List result = new List();
    foreach (item in list) {
       if (this.criteriaMatches(item, criteria)) {
          result.add(item);
       }
    }

    return result;
 }

Disegnando in questo modo, imparerai che hai bisogno di un metodo "criteriaMatches ()" e ti renderai conto che dovresti pensare a referenziamento o clonazione, e possibilmente clonazione profonda o superficiale, e come testare l'intero gruppo e se qualche codice dovrebbe essere sincronizzato, ecc. Queste sono le domande rilevanti ora.

Secondo la mia esperienza, non è possibile risparmiare tempo "predicendo" il modello giusto, perché la realtà e anche lo sviluppo del codice è troppo caotico. È meglio essere preparati ad adeguare e ridefinire costantemente la struttura del codice in modo ordinato e attento.

Quindi, in seguito potrebbe essere necessario migrare il codice scritto oggi in una Classe Strumenti finale. O potrebbe essere che lo abbandonerai e scriverai un iteratore speciale, perché il tuo team trarrebbe beneficio da ciò. Solo la prospettiva più ampia renderà chiaro quale schema è davvero utile, forse deciso dal tuo team.

Infine, la "catena di responsabilità" come hai detto, è un modello in quanto una lista di oggetti recitazione può essere migliorata aggiungendo nuovi oggetti. Un argomento di lavoro viene inserito nell'elenco e l'oggetto adatto nell'elenco deciderà: "Questo oggetto è una mia responsabilità, lavorerò a questo oggetto". Potresti provare a pensare in dieci angoli per vedere una catena simile in un semplice filtro. Ma questo produrrà più lavoro più tardi rispetto all'implementazione diretta della soluzione. Per l'attività descritta, è un sovraccarico.

    
risposta data 11.04.2015 - 13:08
fonte

Leggi altre domande sui tag