progettazione di un modello di dominio in grado di gestire un numero elevato di filtri di dati?

2

Attualmente sto lavorando a un progetto in cui sono entrato diversi anni dopo la sua costruzione. Il codice è per lo più procedurale con alcuni oggetti che agiscono più come secchi di funzioni che altro. Voglio iniziare a risolverlo consolidando l'accesso al database e le chiamate API esterne nei modelli di dominio.

Ho un'idea generale, ma non so come gestire le liste dei miei dati quando ho più filtri. Avere metodi chiamati $HelpRequestMapper->getById($id) funziona bene, ma cosa faccio quando l'utente vuole fare più filtri?

Devo avere metodi per ogni caso possibile? Cioè, $HelpRequestMapper->getByCompanyAndUserAssignedToAndQueueAndStatusAndPriorityAndSearchString($company_id, $user_id, $queue_id, $status, $priority, $search_string) Sembra che diventerebbe ingombrante molto velocemente e non sarebbe molto meglio di quello che abbiamo ora.

Devo passare in un array / oggetto e creare una query usando qualcosa come $HelpRequestMapper->getMultiple($array_of_options) che fa qualche query magica che costruisce roba per ottenere i dati che voglio?

Dovrei fare qualcos'altro?

Grazie

    
posta hosef 11.03.2015 - 17:47
fonte

1 risposta

0

Dipende un po 'dall'implementazione del filtro, ma puoi esaminare il pattern Decorator e Modello di strategia e controlla se sono utili.

Potresti risolvere questo problema creando una classe Filter astratta con un metodo filter che prende un elenco di oggetti e restituisce un elenco di oggetti. Ogni tipo di filtro (CompanyFilter, UserAssignedFilter, QueueFilter ...) sarebbe una classe separata che estende il filtro. Quando si crea il filtro si passano i criteri del filtro nel costruttore e l'implementazione del metodo filtro prende gli oggetti passati e restituisce solo quelli corrispondenti al filtro.

Potresti quindi avere una RequestQuery che puoi spingere i filtri su cui recuperare i dati, eseguire i dati attraverso tutti i filtri e restituire il risultato.

Demo veloce in C #

public class MyObject
{
    public string Company { get; set; }
    public string UserAssignedTo { get; set; }
}

public abstract class Filter
{
    public abstract IEnumerable<MyObject> Apply(IList<MyObject> list);
}

public class CompanyFilter : Filter
{
    private string _companyToFilter;

    public CompanyFilter(string companyToFilter)
    { 
        _companyToFilter = companyToFilter;
    }

    public override IEnumerable<MyObject> Apply(IList<MyObject> list)
    {
        return list.Where(x => x.Company == _companyToFilter);
    }
}

public class UserAssignedToFilter: Filter
{
    private string _userToFilter;

    public UserAssignedToFilter(string userToFilter)
    { 
        _userToFilter = userToFilter;
    }

    public override IEnumerable<MyObject> Apply(IList<MyObject> list)
    {
        return list.Where(x => x.UserAssignedTo == _userToFilter);
    }
}

public class RequestQuery
{
    public IEnumerable<MyObject> FindData(IList<Filter> filtersToApply)
    {
        IList<MyObject> data = null; //fetch data somewhere

        foreach(var filter in filtersToApply)
        {
            data = filter.Apply(data);
        }

        return data;
    }
}
    
risposta data 11.03.2015 - 20:32
fonte

Leggi altre domande sui tag