Situazione
Sto progettando un livello di astrazione del database per sql (mysql, sqlite) e mongoDb. L'obiettivo è fornire all'utente / sviluppatore una libreria in grado di creare query per diversi database. Senza nemmeno sapere quale tipo di database viene interrogato.
Diciamo che abbiamo una classe che è in grado di creare ad esempio la dove parte (condizione) di una query come (in caso di sql):
name = 'Toni' AND age = 42 AND (status = 'ok' OR status = 'maybe-ok')
Il modo in cui creare questa stringa chiama diversi metodi di un oggetto in una determinata sequenza.
La classe dalla quale l'oggetto è derivato potrebbe apparire (pseudo):
class ConditionCreator:
private-field condition
public-function and:
self.condition += ' AND '
return self
end
public-function or:
self.condition += ' OR '
return self
end
public-function block:
self.condition += '('
return self
end
public-function blockend:
self.condition += ')'
return self
end
public-function comparison(key, value):
self.condition += key + ' = ' + value
return self
end
end
E le chiamate a dovrebbe essere simile a:
creator = new ConditinoCreator
creator.comparison('name', "'Toni'")
.and()
.comparison('age', 42)
.and()
.block()
.comparison('status', "'ok'")
.or()
.comparison('status', "maybe-ok")
.blockend()
Problema
Come ci si dovrebbe assicurare che le chiamate siano nell'ordine corretto ?
- Nessun confronto dopo un confronto
- Nessun operatore (o, e) dopo un operatore (o, e)
- Nessun operatore dopo un blocco
(
- Nessun confronto dopo un blocco
)
- Lo stesso numero di
)
del blocco e% co_de del blocco - ecc. pp.
Cose a cui ho pensato:
Regex
Il mio primo pensiero è stato quello di aggiungere una seconda variabile di classe alla quale ogni metodo (e, o, bloccare, blockend, confronto) aggiunge un carattere in modo che l'esempio produca questa stringa (
dopo che questa stringa è stata generata si potrebbe fare un po 'di regex magic su di esso per verificare che la condizione sia valida.
Programma
Come dice il titolo, è necessario programmare manualmente le regole dalla sezione Problema . Se questa è la strada da percorrere, come si farebbe? Si creerebbe una stringa come quella nella soluzione Regex e si testerebbe contro le regole?
Fai affidamento sull'implementazione del database sottostante
Non testare / convalidare la condizione e affidarsi al database per generare errori (il che è orribile per il debug dato che ogni database fornisce un livello diverso di dettagli di output e fornire messaggi di errore chiari è davvero difficile).
C'è di più?
C'è qualcosa che mi manca completamente?