Quiero mencionar dos puntos aquí. La primera son las pruebas, la segunda la pregunta de rendimiento.
1) Pruebas de
Usted ha mencionado que las pruebas pueden hacer mucho y que las pruebas son la única manera para asegurarse de que el código es correcto. En general, diría que esto es absolutamente correcto. Pero las pruebas en sí solo resuelven un problema.
Si escribe un módulo que tienen dos problemas o digamos dos diferentes la gente que utiliza su módulo.
Usted como desarrollador y un usuario que utiliza su módulo. Las pruebas ayudan con el primero que su módulo es correcto y que hace lo correcto, pero no ayudó al usuario que solo usa su módulo .
Para la tarde, tengo un ejemplo. había escrito un módulo usando Moose y algunas otras cosas, mi código terminaba siempre en un error de segmentación. Luego comencé a depurar mi código y buscar el problema. Gasto alrededor de 4 horas para encontrar el error.Al final, el problema fue que tengo que usé Moose con Array Trait. Utilicé la función "mapa" y no hice para proporcionar una función de subrutina, solo una cadena u otra cosa.
Claro que este fue un error absolutamente estúpido mío, pero pasé mucho tiempo en depurarlo. Al final solo una comprobación de la entrada de que el argumento es un subref le costaría al desarrollador 10 segundos de tiempo, y me costaría y probablemente otro mucho más tiempo.
También sé de otros ejemplos. Escribí un cliente REST a una interfaz completamente OOP con Moose. Al final siempre recuperas Objetos, puedes cambiar los atributos pero seguro que no llamó a la API REST para cada cambio que hiciste. En cambio, cambia sus valores y al final llama a un método update() que transfiere los datos y cambia los valores.
ahora tenía un usuario que escribió entonces:
$obj->update({ foo => 'bar' })
de que me dieron un error de vuelta, que se actualizan() no funciona. Pero seguro que no funcionó, porque el método update() no aceptó un hashref. Solo hace una sincronización del estado real del objeto con el servicio en línea . El código correcto sería.
$obj->foo('bar');
$obj->update();
Lo primero funciona porque nunca hice una comprobación de los argumentos. Y no arrojo un error si alguien da más argumentos entonces espero. El método simplemente comienza normal como.
sub update {
my ($self) = @_;
...
}
Sure all my tests absolutamente funciona 100% bien. Pero manejar estos errores que no son errores me costó tiempo también. Y le cuesta mucho al usuario mucho de más tiempo.
Así que al final. Sí, las pruebas son la única forma correcta de garantizar que su código funcione correctamente. Pero eso no significa que la verificación de tipos no tenga sentido. La verificación de tipos está ahí para ayudar a todos los que no son desarrolladores (en su módulo) a usar su módulo correctamente. Y le ahorra tiempo a usted y otros al encontrar errores de volcado.
2) Rendimiento
El resumen: No te importa para un rendimiento hasta que importa.
Eso significa que hasta que su módulo funcione para ralentizar, el rendimiento siempre es rápido suficiente y no necesita preocuparse por esto. Si su módulo realmente funciona para reducir la velocidad, necesita más investigaciones. Pero para estas investigaciones debe usar un generador de perfiles como Devel :: NYTProf para ver qué es lento.
Y yo diría. En 99% de lentitud no es porque usted escriba comprobando, es más su algoritmo. Hace un montón de cálculos, llamando a funciones a menudo etc. A menudo ayuda si completa otras soluciones use otro mejor algoritmo, haga el almacenamiento en caché u otra cosa, y el golpe de rendimiento no es su tipo de comprobación. Pero incluso si la verificación es el golpe de rendimiento. Entonces solo quítalo donde sea importante.
No hay ninguna razón para dejar el tipo de comprobación donde no importa el rendimiento . ¿Crees que la verificación de tipos importa en un caso como el anterior? ¿Dónde escribí un cliente REST? El 99% de los problemas de rendimiento aquí son el importe de la solicitud que va al servicio web o el momento de dicha solicitud . No utilice la comprobación de tipo o MooseX :: Declare etc. propalablemente acelere absolutamente nada.
E incluso si ve desventajas de rendimiento. Algunas veces es aceptable. Porque la velocidad no importa o, a veces, algo le da un mayor valor de . DBIx :: Class es más lento que SQL puro con DBI, pero DBIx :: Class le ofrece mucho para estos.
+1 for Moose info – DVK