Ich schreibe ein Projekt in Django und ich sehe, dass 80% des Codes in der Datei ist models.py
. Dieser Code ist verwirrend und nach einer gewissen Zeit verstehe ich nicht mehr, was wirklich passiert.
Folgendes stört mich:
- Ich finde es hässlich, dass meine Modellebene (die eigentlich nur für die Arbeit mit Daten aus einer Datenbank zuständig ist) auch E-Mails versendet, über API zu anderen Diensten geht usw.
- Außerdem halte ich es für inakzeptabel, Geschäftslogik in der Ansicht zu platzieren, weil denn auf diese Weise wird es schwierig, sie zu kontrollieren. Zum Beispiel gibt es in meiner Anwendung gibt es mindestens drei Möglichkeiten, neue Instanzen von
User
aber technisch gesehen sollte es sie einheitlich erstellen. - Ich merke nicht immer, wenn die Methoden und Eigenschaften meiner Modelle nicht-deterministisch werden und wenn sie Nebeneffekte entwickeln.
Hier ist ein einfaches Beispiel. Zunächst wird die User
Modell war so:
class User(db.Models):
def get_present_name(self):
return self.name or 'Anonymous'
def activate(self):
self.status = 'activated'
self.save()
Mit der Zeit wurde daraus das hier:
class User(db.Models):
def get_present_name(self):
# property became non-deterministic in terms of database
# data is taken from another service by api
return remote_api.request_user_name(self.uid) or 'Anonymous'
def activate(self):
# method now has a side effect (send message to user)
self.status = 'activated'
self.save()
send_mail('Your account is activated!', '…', [self.email])
Ich möchte Entitäten in meinem Code trennen:
- Entitäten auf Datenbankebene, d. h. Logik auf Datenbankebene: Welche Art von Daten speichert meine Anwendung?
- Entitäten auf Anwendungsebene, d. h. Logik auf Geschäftsebene: Was macht meine Anwendung?
Was sind die bewährten Verfahren zur Umsetzung eines solchen Ansatzes, der in Django angewendet werden kann?