Heute war ich mit einem anderen Entwickler in meiner Organisation in einer hitzigen Debatte darüber, wo und wie Methoden zu Klassen mit Datenbankzuordnung hinzugefügt werden können. Wir verwenden sqlalchemy
, und ein Großteil der vorhandenen Codebasis in unseren Datenbankmodellen besteht aus kaum mehr als einer Menge zugeordneter Eigenschaften mit einem Klassennamen, einer nahezu mechanischen Übersetzung von Datenbanktabellen in Python-Objekte.
In dem Argument war meine Position, dass der Hauptwert der Verwendung eines ORM darin bestand, dass Sie den zugeordneten Klassen Verhalten und Algorithmen auf niedriger Ebene zuordnen können. Modelle sind erstens Klassen und zweitens beständig (sie könnten unter Verwendung von XML in einem Dateisystem beständig sein, Sie brauchen sich nicht darum zu kümmern). Seiner Ansicht nach ist jedes Verhalten "Geschäftslogik" und gehört notwendigerweise irgendwo anders als in das persistente Modell, das nur für die Datenbankpersistenz verwendet werden soll.
Ich bin sicher der Meinung, dass es einen Unterschied zwischen dem gibt, was Geschäftslogik ist, und dass dies getrennt werden sollte, da es eine gewisse Isolation von der unteren Ebene der Implementierung und der Domänenlogik gibt, die meiner Meinung nach die Abstraktion ist, die von den Modellklassen bereitgestellt wird Ich habe im vorigen Absatz darüber gestritten, aber es fällt mir schwer, den Finger auf das zu legen, was das ist. Ich habe ein besseres Gespür dafür, was die API sein könnte (was in unserem Fall HTTP "ReSTful" ist), indem Benutzer die API mit dem aufrufen, was sie tun möchten, und zwar unabhängig davon , was und wie sie tun dürfen fertig.
tl; dr: Welche Art von Dingen kann oder sollte in einer Methode in einer zugeordneten Klasse ablaufen, wenn ein ORM verwendet wird, und was sollte ausgelassen werden, um in einer anderen Abstraktionsebene zu leben?