design-patterns - patterns - visitor pattern example
¿Cuál es una forma(o patrón) limpia para hacer la verificación de parámetros de funciones? (3)
¿Hay algún patrón de diseño o forma limpia para hacer la verificación de parámetros de función / método (contra los valores permitidos)?
Actualmente, muchos de los códigos iniciales en mis funciones consisten en estas verificaciones de parámetros (cadenas vacías, caracteres inválidos, identificador existente, ...) y, si bien es necesario, es un poco feo y ofusca el código "real" de la función. Por lo general, mi código es algo como esto:
def my_function(p1,p2,p3,p4):
#check parameters
if p1 == ''''
raise InvalidArgError(''p1 can not be empty'')
if p1 not in valid_list:
raise InvalidArgError(''p1 does not exist'')
if p2 < 0:
raise InvalidArgError(''p2 can not be negative'')
...
#finally do something
p = p2+p3
Para la solución, estoy pensando en las líneas de decoradores en Python.
Estoy usando Python, aunque supongo que una buena solución sería independiente del lenguaje.
Cada parámetro de un método representa una entidad. Debe haber algunas restricciones o suposiciones sobre los valores del argumento en función del cual funciona el método / toda la clase. Entonces escribo métodos para verificar la validez de esos parámetros.
void drawRectangle(int length, int width) {
if (isValidLength(length) == false || isValidWidth(width) == false) {
// log about invalid argument so that it can be easily traced for debugging
return;
}
// remaining code
}
boolean isValidLength(int length) {
if (value < 0 || value > 100) {
return false;
}
return true;
}
La ventaja es evitar el código duplicado. Si la verificación nula, la comprobación de rango se realiza para el mismo tipo de parámetro en varios métodos y, en algún momento más tarde, el rango para ese parámetro cambia debido a la modificación de requisitos, entonces los cambios deben realizarse en varios lugares. Por otro lado, si el control se realiza en un método separado, el alcance del cambio se reduce.
La única cosa bastante independiente del lenguaje que puedo imaginar en este momento es algún tipo de contrato de código para que pueda hacer cosas como:
func foo(param1, param2)
{
Contract.NotNull(param1)
Contract.IsIn(0, 100, param2)
}
Supongo que podría llegar a una implementación de algún tipo en la mayoría de los lenguajes de programación.
Actualizar
Microsoft está trabajando en una implementación y hay una implementación de Java .
Supongo que no realmente, no hay una manera uniforme de hacerlo.
Personalmente, lo aclaro en mis funciones donde se inicia el código real si hay una gran cantidad de comprobación de parámetros por hacer (ejemplo al azar):
def setpoint(x, y):
# checking for out of bounds
if x < 0 or x >= maxwidth: return false
if y < 0 or y >= maxheight: return false
# start function
map[x][y] = true
Tal vez debería considerar dividir sus funciones en funciones más pequeñas para extender la verificación de parámetros.