Tengo una función que toma un conjunto de parámetros y luego se aplica a ellos como condiciones para una consulta SQL. Sin embargo, si bien preferí una matriz de argumento único que contenga las condiciones mismas:
function searchQuery($params = array()) {
foreach($params as $param => $value) {
switch ($param) {
case 'name':
$query->where('name', $value);
break;
case 'phone':
$query->join('phone');
$query->where('phone', $value);
break;
}
}
}
Mi colega prefirió enumerar todos los argumentos explícitamente en su lugar:
function searchQuery($name = '', $phone = '') {
if ($name) {
$query->where('name', $value);
}
if ($phone) {
$query->join('phone');
$query->where('phone', $value);
}
}
Su argumento fue que al enumerar los argumentos explícitamente, el comportamiento de la función se vuelve más evidente, en lugar de tener que profundizar en el código para descubrir cuál era el argumento misterioso $param
.
Mi problema fue que esto se vuelve muy detallado cuando se trata con muchos argumentos, como 10+. ¿Hay alguna práctica preferida? Mi peor de los casos sería ver algo como lo siguiente:
searchQuery('', '', '', '', '', '', '', '', '', '', '', '', 'search_query')
foreach
es innecesario en este caso, podría usarlo en if(!empty($params['name']))
lugar de foreach
y switch
.
!empty($params['name'])
para probar parámetros; por ejemplo, la cadena "0" estaría vacía. Es mejor usar array_key_exists
para verificar la clave, o isset
si no te importa null
.