Considera un'applicazione che visualizza solo i Foobar appartenenti a se stessi agli utenti normali e tutti i Foobar agli amministratori:
-- Normal users:
SELECT * FROM Foobar WHERE user_id=:user_id;
-- Admins:
SELECT * FROM Foobar;
Attualmente, questo è il modo in cui le query sono rappresentate nella base di codice:
$sql = "SELECT * FROM Foobar";
if ( $user['type']!='admin' ) {
$sql.= ' WHERE user_id=:user_id';
}
$stmt = $pdo->prepare($sql);
if ( $user['type']!='admin' ) {
$stmt->bindValue(':user_id', $user['id']);
}
Non mi piace questo approccio dual-branching dal punto di vista della mantenibilità. Ad esempio, un errore come digitare $user['type']=='admin'
anziché $user['type']!='admin'
dovrebbe essere trovato e risolto in due posti anziché uno. Tuttavia, non mi piace l'idea di funzioni separate per ogni caso: amministratori e utenti regolari.
Un terzo approccio sarebbe quello di diramare una volta e lì creare l'SQL da aggiungere e i valori da associare:
$sql_to_add = '';
$array_to_bind = array();
if ( $user['type']!='admin' ) {
$sql_to_add = ' WHERE user_id=:user_id';
$array_to_bind = array( ':user_id'=>$user['id'] );
}
$sql = "SELECT * FROM Foobar {$sql_to_add}";
$stmt = $pdo->prepare($sql);
foreach ( $array_to_bind as $k=>$v ) {
$stmt->bindValue($k, $v);
}
Tuttavia trovo questo approccio ingombrante. Esiste uno schema di progettazione per questa situazione? Qual è il modo canonico per gestire le situazioni in cui il codice deve diramarsi in due posizioni separate sulla stessa condizione if
?