Comencemos con un ejemplo.
Digamos que tengo un método llamado exportque depende en gran medida del esquema DB. Y por "depende en gran medida" quiero decir que sé que agregar una nueva columna a una tabla determinada a menudo (muy a menudo) conduce al exportcambio de método correspondiente (por lo general, también debe agregar el nuevo campo a los datos de exportación).
Los programadores a menudo se olvidan de cambiar el exportmétodo, ya que no está muy claro que incluso debas mirar esto. Mi objetivo es obligar al programador a tomar una decisión explícita para determinar si olvidó mirar el exportmétodo o simplemente no quiere agregar un campo a los datos de exportación. Y estoy buscando la solución de diseño para este problema.
Tengo dos ideas, pero ambas tienen fallas.
Contenedor inteligente "Leer todo"
Puedo crear el contenedor inteligente que se asegura de que todos los datos se lean explícitamente.
Algo como esto:
def export():
checker = AllReadChecker.new(table_row)
name = checker.get('name')
surname = checker.get('surname')
checker.ignore('age') # explicitly ignore the "age" field
result = [name, surname] # or whatever
checker.check_now() # check all is read
return result
Entonces, checkerafirma si table_rowcontiene otros campos que no fueron leídos. Pero todo esto parece un poco pesado y (tal vez) afecta el rendimiento.
Prueba de unidad "Verificar ese método"
Solo puedo crear la prueba de unidad que recuerda el último esquema de tabla y falla cada vez que se cambia la tabla. En ese caso, el programador vería algo así como "no olvides revisar el exportmétodo". Para ocultar el programador de advertencia, (o no lo haría, eso es un problema) verifique exporty corrija manualmente la prueba (ese es otro problema) agregando nuevos campos.
Tengo algunas otras ideas, pero son demasiado problemáticas para implementar o demasiado difíciles de entender (y no quiero que el proyecto se convierta en un rompecabezas).
El problema anterior es solo un ejemplo de la clase más amplia de problemas que encuentro de vez en cuando. Quiero vincular algunas piezas de código y / o infraestructura, por lo que cambiar una de ellas alerta inmediatamente al programador para que compruebe otra. Por lo general, tiene algunas herramientas simples, como extraer una lógica común o escribir pruebas unitarias confiables, pero estoy buscando la herramienta para casos más complejos: quizás conozco algunos patrones de diseño.
export tiene todo lo que realmente necesita?
exportsegún el esquema?