it-swarm.dev

Entspricht / fördert das ActiveRecord-Muster die SOLID Designprinzipien?

Ich bin daran interessiert, ob das ActiveRecord-Muster, das durch Ruby on Rails] bekannt wurde, die Verwendung von SOLID Design fördert oder davon abhält Prinzipien.

Zum Beispiel scheint es mir, dass ActiveRecord-Objekte sowohl Domänenlogik als auch Persistenzlogik enthalten, was eine Verletzung der Einzelverantwortung darstellt.

43
nicholaides

Es gibt einige berechtigte Kritik an ActiveRecord. Wie immer Onkel Bobfasst es perfekt zusammen :

Das Problem, das ich mit Active Record habe, ist, dass es Verwirrung über diese beiden sehr unterschiedlichen Programmierstile schafft. Eine Datenbanktabelle ist eine Datenstruktur. Es hat Daten und kein Verhalten ausgesetzt. Ein aktiver Datensatz scheint jedoch ein Objekt zu sein. Es hat "versteckte" Daten und offengelegtes Verhalten. Ich habe das Wort in Anführungszeichen "versteckt" gesetzt, weil die Daten tatsächlich nicht versteckt sind. Fast alle ActiveRecord-Derivate exportieren die Datenbankspalten über Accessoren und Mutatoren. In der Tat soll der aktive Datensatz wie eine Datenstruktur verwendet werden.

Auf der anderen Seite fügen viele Leute Geschäftsregelmethoden in ihre Active Record-Klassen ein. was sie als Objekte erscheinen lässt. Dies führt zu einem Dilemma. Auf welche Seite der Linie fällt der aktive Datensatz wirklich? Ist es ein Objekt? Oder ist es eine Datenstruktur?

Wikipedia fasst die Kritik in einem Testbarkeitsproblem zusammen:

In OOP] steht das Konzept der Einkapselung häufig im Widerspruch zum Konzept der Trennung von Bedenken. Im Allgemeinen sind Muster, die die Trennung von Bedenken begünstigen, besser für isolierte Komponententests geeignet, während Muster, die die Einkapselung begünstigen, einfacher sind Active Record bevorzugt die Kapselung bis zu einem Punkt, an dem das Testen ohne Datenbank ziemlich schwierig ist.

Speziell für die Implementierung von Ruby on Rails, Gavin King schreibt (Hervorhebung von mir)):

Zu diesem Zeitpunkt denken die meisten Entwickler ähm, ok. Wie zum Teufel soll ich also wissen, welche Attribute ein Unternehmen hat, wenn ich meinen Code betrachte? Und wie kann mein IDE sie automatisch vervollständigen? Natürlich haben die Rails Leute eine schnelle Antwort auf diese Frage Oh, starten Sie einfach Ihren Datenbankclient und Schauen Sie in die Datenbank! Dann unter der Annahme , dass Sie die Regeln für die automatische Groß- und Kleinschreibung von ActiveRecord/ perfekt kennen /können Sie die Namen der Attribute Ihrer eigenen Unternehmensklasse erraten und manuell eingeben.

Auch auf der Ruby on Rails Implementierung, John Januszczak schreibt (Hervorhebung meiner):

PROBLEM 1: STATISCHE METHODEN

...

Einige würden sagen, dass die Verwendung statischer Methoden einfach einer prozeduralen Programmierung gleichkommt und daher ein schlechtes objektorientiertes Design ist. Andere würden sagen, statische Methoden sind der Tod für die Testbarkeit.

PROBLEM 2: GLOBALE KONFIGURATIONSEINSTELLUNGEN

...

Daher gibt es in meinem Beispiel keine Abhängigkeitsinjektion für die Account-Klasse und im weiteren Sinne für die Account-Instanzen. Wie wir alle inzwischen wissen sollten, ist es sehr, sehr schlecht, nach Dingen zu suchen!

Einige weitere Ressourcen, warum ActiveRecord und ORM im Allgemeinen als Anti-Pattern angesehen werden:

ActiveRecord fühlte sich immer wie ein äußerst nützliches Anti-Pattern an, aber ich stimme zu, dass es gegen SRP und zusätzlich gegen das Prinzip der Abhängigkeitsinversion verstößt.

56
yannis

(Ich gehe davon aus, dass die ActiveRecord-Klasse ohne die Möglichkeit einer Abhängigkeitsinjektion implementiert ist).

Aus persönlicher Erfahrung kann ich sagen, dass das ActiveRecord-Muster ein großes Hindernis für das Schreiben von Komponententests darstellt. Die Kopplung der Persistenzschicht und der Geschäftslogik in einer einzigen "ActiveRecord-Klasse" macht es unmöglich, Komponententests zu schreiben (es sei denn, Sie überarbeiten zuerst). Daher besteht die einzige Möglichkeit darin, Integrationstests zu schreiben. und das ist nicht so effektiv wie Unit-Tests. Dies wird zu einem Hauptproblem, insbesondere wenn Sie ein Projekt mit vielen ActiveRecord-Klassen übernehmen. Dies führt zu hochkomplizierten Integrationstests, die schwer zu warten sind.

Der ActiveRecord ist also ziemlich gegen SRP und verursacht einige Wartungsprobleme. es scheint die Macht zu nehmen, Unit-Tests zu schreiben.

6
Guven