Voglio presentare un elenco di prodotti all'utente. Questo elenco è impaginato e può essere ordinato dall'utente per ID prodotto o nome prodotto in ordine crescente o decrescente.
Sto utilizzando un'impostazione MVC, in cui desidero interrogare il database nel modello.
Come scrivere funzioni che interrogano il database? Posso pensare a diverse opzioni che hanno tutti i loro svantaggi:
-
Avere una funzione per ogni possibile combinazione di colonne di ordinamento e direzioni di ordinamento, ciascuna con una query diversa all'interno:
func GetProductsOrderByIdAsc() []*Product { … } func GetProductsOrderByIdDesc() []*Product { … } func GetProductsOrderByNameAsc() []*Product { … } func GetProductsOrderByNameDesc() []*Product { … }
Questo è ovviamente non gestibile in quanto porta a molte query SQL quasi identiche, dette anche "codice duplicato".
-
Concatena le stringhe di SQL:
func GetProducts(orderBy string, orderDirection string) []*Product { return db.query(' SELECT id, name, description FROM products ORDER BY ' + orderBy + ' ' + orderDirection + ' ') }
Questo è inelegante, illeggibile e non gestibile in quanto diventa rapidamente un disastro-immaginare l'aggiunta di impaginazione e filtraggio. Il binding dei parametri non funzionerà qui poiché sono colonne e non valori.
-
Ordina, filtra e impagina in Vai invece che in SQL. Ciò risolverebbe il problema della duplicazione del codice ma potrebbe essere un problema di prestazioni quando si registrano migliaia di record.
Qual è il solito concreto modo di risolvere questo problema? Idealmente non ci sarebbe nessun codice duplicato, nessuna brutta sintesi di query e nessuna inefficienza importante.