Oggi ho avuto un acceso dibattito con un altro sviluppatore della mia organizzazione su dove e come aggiungere metodi alle classi mappate nel database. Usiamo sqlalchemy
, e gran parte della base di codice esistente nei nostri modelli di database è poco più di un insieme di proprietà mappate con un nome di classe, una traduzione quasi meccanica dalle tabelle del database agli oggetti Python.
Nell'argomento, la mia posizione era che il valore principale dell'utilizzo di un ORM era che era possibile associare comportamenti e algoritmi di basso livello alle classi mappate. I modelli sono prima di tutto classi e secondariamente persistenti (potrebbero essere persistenti usando xml in un filesystem, non è necessario preoccuparsene). Il suo punto di vista era che qualsiasi comportamento è "logica commerciale", e appartiene necessariamente a qualunque luogo tranne che al modello persistente, che deve essere usato solo per la persistenza del database.
Penso certamente che ci sia una distinzione tra ciò che è la logica aziendale, e dovrebbe essere separato, dal momento che ha un certo isolamento dal livello inferiore di come viene implementato, e la logica del dominio, che credo sia l'astrazione fornita dalle classi del modello discusso nel paragrafo precedente, ma sto facendo fatica a mettere il dito su quello che è. Ho una migliore idea di quale potrebbe essere l'API (che, nel nostro caso, è HTTP "ReSTful"), in quanto gli utenti invocano l'API con ciò che vogliono fare , distinto da ciò che gli è permesso fare e da come viene fatto.
tl; dr: che tipo di cose possono o dovrebbero andare in un metodo in una classe mappata quando si usa un ORM, e cosa dovrebbe essere lasciato fuori, per vivere in un altro livello di astrazione?