Die Geschichte, zum ersten Mal seit 5 Jahren wieder an die Front zurückzukehren und Python Django umzugestalten

Hintergrund

Ich bin seit letztem Jahr an Startups beteiligt und entwickle mit dem Python-Framework Django. Fast fünf Jahre lang gab es eine Entwicklungslücke, daher entschied ich mich optimistisch zu sein: "Ist das die Entwicklung von heute?" Es war jedoch voll von verschiedenen Anti-Mustern und Tauchpunkten.

Die frühere ehemalige verantwortliche Person und die vorherige verantwortliche Person haben angehalten, und der Anhang wurde umgedreht. Wenn ich mir den verbleibenden Code ansehe, kann ich nicht anders, als darüber nachzudenken.

Unter solchen Umständen möchte ich die Geschichte des Refactorings und die Geschichte des Refactorings von nun an zusammenfassen.

Das Problem, das beschuldigt wurde

Es scheint, als würde es nicht aufhören, wenn ich anfange zu reden, aber es gab zwei enttäuschende Dinge in Bezug auf die Architektur.

Ansicht zu schlau

Es scheint eine einfache App zu sein, bei der die Ansicht nur die Daten abruft, die ursprünglich durch Stapelverarbeitung erstellt wurden. Mit dem Hinzufügen von Funktionen werden jetzt jedoch verschiedene Berechnungen in der Ansicht durchgeführt.

Überfüllte Logik

Es scheint, dass die vorherige Person versucht hat, etwas zu tun, aber die Logik blieb in der Ansicht, und das Modell hatte Logik. Sie können Zirkelverweise in zwei verschiedenen Paketen erstellen. Ich habe die Operation nicht bestätigt. Es war schrecklich.

Das grundlegende Problem ist ...

Ich habe die Tatsache beiseite gelegt, dass ich nicht genug Zeit hatte, ~~ die verantwortliche Person war dumm ~~, und es hängt von der Situation und den Menschen ab.

Zunächst nimmt Django eine einfache Konfiguration mit einer 1: 1-Tabelle und einem Modell an. Es ist ein bisschen von der ursprünglichen Bedeutung entfernt, aber es ist wahrscheinlich das Active Record-Muster.

Diese Konfiguration wird problematisch, wenn die App komplexer wird.

Wenn die Funktionalität komplexer wird, ändert sich die Tabelle. Es stimmt möglicherweise nicht mit dem ursprünglich erwarteten Modell überein.

Mit Django rufen Sie das Modell in der Regel direkt aus der Ansicht auf.

Wenn Sie Informationen aus mehreren Tabellen kombinieren, schreiben Sie in der Regel Logik in die Ansicht. Wenn Sie komplizierte Berechnungen durchführen, ist es schwierig zu verstehen, wo die Verantwortung liegt, und zu fragen: "Was? Ist dies das verantwortliche Modell?"

Model-View-Controller ist in erster Linie ein Präsentationsschichtmuster. Es scheint, dass das Modell mit dem Architekturmuster der Datenquelle gemischt ist, was verwirrend ist. (Ich glaube ich verstehe einfach nicht)

Lösung

Ich ging zurück zu den Grundlagen und begann mit der Überlagerung. Zu dieser Zeit bezog ich mich auf das domänengesteuerte Design und das Muster der Unternehmensarchitektur (obwohl es einen schlechten Ruf hat).

Persönlich hatte ich den Inhalt des Unternehmensarchitekturmusters satt.

http://www.amazon.co.jp/dp/4798121967 http://www.amazon.co.jp/dp/4798105538

Rückblick: Grundlegende Anwendungsschicht

Es gibt einige Muster, aber es war leicht zu verstehen, wie man sie in 4 Schichten unterteilt.

Wiederum war es für Django persönlich verwirrend, dass das Modell der Präsentationsschicht, die Domänenschicht und die Datenschicht in einem waren. Es wurde ein Schlüssel, um diesen Bereich zu teilen.

Einführung der Serviceschicht

Geändert, um einen Dienst für eine Ansicht bereitzustellen. Ich möchte nicht, dass die Methodenparameter kompliziert sind, also lasse ich sie die Datenübertragungsobjekt-ähnlichen Parameter verarbeiten.

Der Dienst ist auch in zwei Typen unterteilt.

Eine ist, grundlegende CRUD zu behandeln. Die Namenskonvention lautet auch XxxService.

Die andere besteht darin, mehrere Objekte zu kombinieren, um komplizierte Berechnungen und Verarbeitungen durchzuführen. Die Namenskonvention ist auch XxxEngine.

Ich habe es nicht gut verstanden, auch wenn ich verschiedene Erklärungen gelesen habe, also habe ich mich auf den folgenden Code bezogen. http://www.infoq.com/jp/news/2015/04/ddd-trading-example https://github.com/archfirst/bullsfirst-server-java

Es ist auch ineffizient, jedes Mal eine Instanz des Dienstes zu erstellen, also habe ich es zu Singleton gemacht.

http://code.activestate.com/recipes/579090-yet-another-singleton-pattern-in-python-using-clas/

Dies ist eine zukünftige Ausgabe.

Es gab einige ähnliche Dinge in XxxEngine. Dies ist ein Dunst, der Ihnen eine bessere Sicht gibt, wenn Sie ihn durch das Strategiemuster trennen.

Umgang mit Modellen

Ich beschloss, Djangos Modell als Datenschicht zu betrachten.

Einführung der Domänenschicht

In Zukunft denke ich darüber nach, eine Domänenschicht einzuführen. Implementieren Sie die Domänenlogik in einer Klasse, die vom Django-Modell erbt.

Früher wurde beim Konvertieren von einer Tabelle in ein Objekt POJO (Plain Old Java Object) zugeordnet. Um die Logik als Domänenmodell zu implementieren, wurde eine Klasse verwendet, die POJO geerbt hat. Mit dieser Referenz denke ich darüber nach, POMO (mein geprägtes Wort w: Plain Old Model Object) zu erben und es zu einem Domänenmodell zu machen.

Zusammenfassung

Ich finde es immer noch subtil, aber die aktuelle Situation ist so.

Als ich die Geschichte der Einführung der Service-Schicht in Rails sah, dachte ich: "Es gibt Leute, die das Gleiche denken" und fasste zusammen, was ich in Django dachte / antwortete.

Was mich diesmal jedoch beunruhigte, war das Problem, über das im Muster der Unternehmensanwendung gesprochen wurde. Heutzutage gibt es viele Dinge, die das Framework verbirgt und nicht kennt. Aber als ich versuchte, die Grenzen des Frameworks zu erweitern, hielt ich es für wichtig, die Grundlagen zu kennen.

Recommended Posts

Die Geschichte, zum ersten Mal seit 5 Jahren wieder an die Front zurückzukehren und Python Django umzugestalten
Zusammenfassung der Stolperpunkte in Django zum ersten Mal
Überprüfen Sie die Verarbeitungszeit und die Anzahl der Aufrufe für jeden Prozess mit Python (cProfile).
Google sucht mit Python nach der Zeichenfolge in der letzten Zeile der Datei
Die Geschichte von Python und die Geschichte von NaN
Die Geschichte der Schaffung eines "Geist- und Zeit-Chatrooms" exklusiv für Ingenieure im Unternehmen
Bestimmen Sie das Datums- und Uhrzeitformat mit Python und konvertieren Sie es in Unixtime
[Python] So erhalten Sie den ersten und den letzten Tag des Monats
Schlafverarbeitung für einen bestimmten Zeitraum (Sekunden) oder länger in Python
Zum ersten Mal veröffentlichte GitHub x Circle CI ein Textüberprüfungstool von Python
[Python] Die Rolle des Sterns vor der Variablen. Teilen Sie den Eingabewert und weisen Sie ihn einer Variablen zu
Ein Python-Anfänger hat in den letzten 10 Jahren zunächst versucht, die Wetterdaten schnell und einfach zu analysieren.
So ermitteln Sie mit Python den Unterschied zwischen Datum und Uhrzeit in Sekunden
Zum ersten Mal in Numpy werde ich es von Zeit zu Zeit aktualisieren
Ein nützlicher Hinweis, wenn Sie Python nach langer Zeit verwenden
Die Geschichte, wie ein Geschäft BOT (AI LINE BOT) nach Go To EAT in der Präfektur Chiba durchsucht (1)
Eine Geschichte über den Versuch, den Testprozess eines 20 Jahre alten Systems in C zu verbessern
So verwenden Sie MkDocs zum ersten Mal
Die Geschichte, dass die Lernkosten von Python niedrig sind
Ich habe zum ersten Mal versucht, Python zu programmieren.
Bildverarbeitung? Die Geschichte, Python für zu starten
Die Geschichte des Lesens von HSPICE-Daten in Python
Die Geschichte der Anzeige von Mediendateien in Django
Zur Darstellung von Datum, Uhrzeit, Uhrzeit und Sekunden in Python
Grundlegende Geschichte der Vererbung in Python (für Anfänger)
Versuchen Sie zum ersten Mal, in Qiita zu posten
Verschiedene Möglichkeiten, die letzte Zeile einer CSV-Datei in Python zu lesen
Datenanalyse in Python Zusammenfassung der Quellen, die Anfänger zuerst betrachten sollten
So zählen Sie die Anzahl der Elemente in Django und geben sie in die Vorlage aus
Ich möchte den Dateinamen, die Zeilennummer und den Funktionsnamen in Python 3.4 erhalten
Die Geschichte, wie ein Geschäft BOT (AI LINE BOT) nach Go To EAT in der Präfektur Chiba durchsucht (2) [Übersicht]
[Super einfach! ] So zeigen Sie den Inhalt von Wörterbüchern und Listen einschließlich Japanisch in Python an
[Tipps] Probleme und Lösungen bei der Entwicklung von Python + Kivy
Die Geschichte, zum ersten Mal seit 5 Jahren wieder an die Front zurückzukehren und Python Django umzugestalten
Zählen Sie die Anzahl der thailändischen und arabischen Zeichen in Python gut
Hinweis: Holen Sie sich das erste und letzte Element von Python OrderedDict zerstörungsfrei
[Python] So erhalten Sie den ersten und den letzten Tag des Monats
Holen Sie sich den Titel und das Lieferdatum von Yahoo! News in Python
Konvertieren Sie Datum und Uhrzeit in Zeitzonen in Unixtime in Python2.7
Die Wand beim Ändern des Django-Dienstes von Python 2.7 auf Python 3-Serie
So ermitteln Sie die Anzahl der Stellen in Python
Was ich zum ersten Mal in Python bekommen habe
Ich habe Python zum ersten Mal auf dem Mac ausprobiert.
Die Geschichte von Airflows Webserver und DAG, deren Laden lange dauert
Der erste Schritt des maschinellen Lernens ~ Für diejenigen, die versuchen möchten, mit Python zu implementieren ~
[Python] Misst und zeigt die für die Verarbeitung erforderliche Zeit an
Registrieren Sie zum ersten Mal eine Aufgabe in cron
Erstellen Sie einen API-Server, um den Betrieb der Front-Implementierung mit Python3 und Flask zu überprüfen
Ich habe Python zum ersten Mal mit Heroku ausprobiert
Die Geschichte von FileNotFound im Python open () -Modus = 'w'
[Python] Berechnung der Differenz von Datum und Zeit in Monaten und Jahren
Ich möchte zum ersten Mal eine Django-Studie zum Mittagessen [EP1-4] erstellen
Der erste Schritt für diejenigen, die Amateure der Statistik sind, aber Modelle für maschinelles Lernen in Python implementieren möchten
Geben Sie für jede Datei die angegebene Tabelle der Oracle-Datenbank in Python in Excel aus
Ich wollte nur die Daten des gewünschten Datums und der gewünschten Uhrzeit mit Django extrahieren
Eine Geschichte über den Versuch, Linter mitten in einem Python (Flask) -Projekt vorzustellen
Um das Äquivalent von Rubys ObjectSpace._id2ref in Python zu tun
Ich bin gerade in Singapur. Eine Geschichte über das Erstellen eines LineBot und den Wunsch, einen unvergesslichen Job zu machen
Verfahren zum gleichzeitigen Ändern des Tabellennamens und des Spaltennamens des Django-Modells
[Super einfach! ] So zeigen Sie den Inhalt von Wörterbüchern und Listen einschließlich Japanisch in Python an
Von null Python-Kenntnissen bis hin zur KI in der ersten Klasse der Junior High School
Welche Umgebung sollten Leute, die Python zum ersten Mal lernen, bauen?
Eine einfache Möglichkeit, die in Python benötigte Zeit anzuzeigen und sie intelligenter zu verbessern
Tipps für Python-Anfänger, um das Scikit-Image-Beispiel für sich selbst zu verwenden 8 Verarbeitungszeitmessung und Profiler
Überprüfen Sie die Funktionsweise von Python für .NET in jeder Umgebung
Die Geschichte der Einführung von Jedi (automatisches Vervollständigungspaket von Python) in Emacs