2010-02-03 10 views
6

¿Dónde debo escribir códigos para verificar la validez de las propiedades de la clase? (Por ejemplo: "amount" debe ser un entero positivo, "email" debe ser una cadena con el formato de correo electrónico correcto) En los métodos setter, en algún lugar lo uso (usando try/catch) u otros.Comprobación de la validez de las propiedades en las clases de Python

Si compruebo la validez en los métodos setter, puede parecer fea (como la comprobación de tipos). Pero si lo controlo cuando lo uso, puede aparecer código duplicado cuando se usa muchas veces.

(Lo siento por mi mala Inglés.)

Respuesta

4

duda hacerlo en el organismo, si es necesario hacerlo en absoluto.

En primer lugar, probablemente se llama al colocador con menos frecuencia que los captadores, por lo que está haciendo menos trabajo.

En segundo lugar, detecta el problema anteriormente.

En tercer lugar, mantiene constante el estado interno del objeto. Mantener los datos incorrectos significa que sabes que tu objeto es "correcto".

+0

+1: El estado interno del objeto debe ser perfecto, consistente, correcto. –

2

Si parece una fea comprobación de tipo, puede ser porque sí lo es. Si "cantidad" tiene que ser un número entero positivo, y el resto del módulo fallará mal si no es así, entonces necesita hacer algún tipo de comprobación.

La forma de hacerlo de Python es solo verificar las propiedades reales que necesita.

En el ejemplo entero positivo, eso significa no verificar que el valor sea un objeto Int, pero verificando que tenga un valor, y que el valor sea> 0. Esto permite a otros programadores pasar sus métodos objetos que actúan como números, sin restringir estrictamente su tipo.

Lo mismo ocurre con el ejemplo del correo electrónico: compruebe que esté formateado correctamente (coincide con la expresión regular de correo electrónico que esté utilizando), pero no insista en que sea una instancia de la clase Str. No insista en nada en su verificación de validez, excepto las propiedades que realmente va a utilizar.

Cuestiones relacionadas