Hoy entré en un acalorado debate con otro desarrollador de mi organización sobre dónde y cómo agregar métodos a las clases mapeadas de la base de datos. Usamos sqlalchemy
, y una parte importante de la base de código existente en nuestros modelos de base de datos es poco más que una bolsa de propiedades mapeadas con un nombre de clase, una traducción casi mecánica de las tablas de la base de datos a los objetos de Python.
En el argumento, mi posición era que el valor principal de usar un ORM era que se pueden asociar comportamientos y algoritmos de bajo nivel a las clases asignadas. Los modelos son primero las clases y, en segundo lugar, persistentes (podrían ser persistentes utilizando xml en un sistema de archivos, no es necesario que le importe). Su punto de vista era que cualquier comportamiento es "lógica de negocios", y necesariamente pertenece a cualquier lugar que no sea el modelo persistente, que debe usarse solo para la persistencia de la base de datos.
Ciertamente, creo que hay una distinción entre lo que es la lógica de negocios, y debe separarse, ya que tiene cierto aislamiento del nivel inferior de cómo se implementa, y la lógica de dominio, que creo que es la abstracción proporcionada por las clases modelo. discutí en el párrafo anterior, pero estoy teniendo dificultades para señalar qué es eso. Tengo una mejor idea de lo que podría ser la API (que, en nuestro caso, es HTTP "ReSTful"), en el sentido de que los usuarios invocan la API con lo que quieren hacer , distinto de lo que se les permite hacer y cómo se hace.
tl; dr: ¿Qué tipo de cosas pueden o deben ir en un método en una clase asignada cuando se usa un ORM, y qué se debe dejar de lado, para vivir en otra capa de abstracción?