AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

[ORM] Lazy Loading - Wie implementieren?

Ein Thema von mquadrat · begonnen am 23. Sep 2011 · letzter Beitrag vom 26. Sep 2011
Antwort Antwort
Seite 2 von 3     12 3   
mquadrat

Registriert seit: 13. Feb 2004
1.113 Beiträge
 
Delphi XE2 Professional
 
#11

AW: [ORM] Lazy Loading - Wie implementieren?

  Alt 23. Sep 2011, 18:04
Mal schauen, vielleicht wird ja aus dem "In-House-Projekt" mal ein ausgewachsener ORM. Aktuell evaluiere ich ja eh erst mal, ob ich was passendes finde oder eben selber was schreiben muss. Das Lazy Loading hat mich jetzt vor allem mal konzeptionell interessiert.
  Mit Zitat antworten Zitat
r2c2

Registriert seit: 9. Mai 2005
Ort: Nordbaden
925 Beiträge
 
#12

AW: [ORM] Lazy Loading - Wie implementieren?

  Alt 23. Sep 2011, 18:04
1. Sorry, ich bin kein studierter Informatiker – was heißt „Persistenz orthogonal zur Geschäftslogik“?
Normalerweise sollte eine Klasse nur eine Aufgabe haben (Single Responsibility Principle) oder anders ausgedrückt: verschiedene Aufgaben sollten auch verschiedene Klassen aufgeteilt werden (Separation Of Concerns). Das sind grundlegende Prinzipien der Softwareentwicklung, die helfen Software wartbar zu machen. Man kann so leicht Teile austauschen, ändern und wiederverwenden ohne dabei unnötigen Aufwand zu haben und unnötig Fehler zu produzieren.

So sollte also die Persistenz (das Speichern in der DB) unabhängig von der eigentlichen Programmlogik sein (das nennt man Orthogonalität). im Idealfall steht in den Klassen die gespeichert werden sollen gar kein Code, der sich ums Speichern kümmert. Das Speichern steht in einer anderen Klasse, die jedes beliebige Objekt speichern kann.

Nicht immer ist Orthogonalität einfach zu erreichen, aber es hat ja auch niemand behauptet Softwareentwicklung wär immer nur einfach.

Zitat:
2. Normal lässt man bei ORMs den Code doch eh generieren, da kann man doch den Getter ohne Probleme einbauen.
Wenn man drum herum kommen kann, verzichtet man lieber aufs generieren. Es ist ein zusätzlicher Schritt, der den build-Prozess verkompliziert und damit fehleranfällig macht. Manchmal ist das Generieren von Code aber der schlauere Weg, weil man dadurch ganz andere Fehlerquellen vermeidet. Es ist eben eine Abwägungssache.

Zitat:
3. Was ist daran unsauber?
Die fehlende Orthogonalität.

[
Ich weiß nicht was mit Delphi möglich ist, NHibernate, mit dem ich gerade arbeite, implementiert die Proxies als zur Laufzeit erzeugte Ableitung der Entity.
Das ist das, was ich meine. In Java gibt es eine proxy-Klasse, die zur Laufzeit beliebige Interfaces implementieren kann. Die wird u.a. für RMI verwendet um die Stubs/Proxys zu erzeugen und ich vermute mal Hibernate benutzt das auch.


mfg

Christian
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#13

AW: [ORM] Lazy Loading - Wie implementieren?

  Alt 23. Sep 2011, 18:22
1. Sorry, ich bin kein studierter Informatiker – was heißt „Persistenz orthogonal zur Geschäftslogik“?
Normalerweise sollte eine Klasse nur eine Aufgabe haben (Single Responsibility Principle) oder anders ausgedrückt: verschiedene Aufgaben sollten auch verschiedene Klassen aufgeteilt werden (Separation Of Concerns). Das sind grundlegende Prinzipien der Softwareentwicklung, die helfen Software wartbar zu machen. Man kann so leicht Teile austauschen, ändern und wiederverwenden ohne dabei unnötigen Aufwand zu haben und unnötig Fehler zu produzieren.
Jo, weiß ich, mach ich natürlich auch so. Sehe aber nicht inwiefern der Getter dieses Prinzip verletzt. Der Getter erzeugt ja nur das Objekt mit dem entsprechenden Parameter (z.B. ID), das eigentliche Laden sollte dann das erzeugte Objekt anstoßen – der Code zum Laden selbst sollte natürlich wieder in eine weitere Klasse ausgelagert sein. Diese Klasse (die ein festgelegtes Interface implementiert) könnte man entweder als Parameter im Konstruktor übergeben, oder sonstwie registrieren, wodurch sich der Ladecode nachträglich austauschen lässt.

In der Datenklasse steht dann kein Code, der sich direkt um die Persistenz kümmert, lediglich ein Getter, der eine Eigenschaft zurückliefert. Das würde ich noch nicht als Geschäftslogik bezeichnen.
  Mit Zitat antworten Zitat
mquadrat

Registriert seit: 13. Feb 2004
1.113 Beiträge
 
Delphi XE2 Professional
 
#14

AW: [ORM] Lazy Loading - Wie implementieren?

  Alt 23. Sep 2011, 18:36
Lazy Initialization widerspricht dem meiner Meinung nach auch nicht. Der Punkt ist viel mehr, dass es viel bequemer ist, wenn das der ORM übernehmen kann Wenn die Anwendung nichts von der DB wissen soll, dann weiß sie auch nicht wie teuer es ist ein bestimmtes Objekt zu erzeugen. Hier kann man dann ggf. beim Mapping eingreifen, womit das Lazy Loading in das Hoheitsgebiet des ORM fällt.
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.902 Beiträge
 
Delphi 2010 Professional
 
#15

AW: [ORM] Lazy Loading - Wie implementieren?

  Alt 23. Sep 2011, 21:27
Proxies von Interfaces scheinen mir hier am sinnvollsten zu sein.

Mir fallen da spontan ein paar Wege ein:
  • TVirtualInterface
    In XE2 kam die Klasse TVirtualInterface hinzu. Die sollte dir schonmal einen Ansatz geben, um zur Laufzeit eine Implementierung eines Interfaces zu erzeugen.
    Was in Delphi halt immer noch komplett bescheuert (höflich ausgedrückt) ist, ist, dass man immer noch ewig viel hässlichen Code tippen muss, nur um eine dumme Property in ein Interface zu kriegen.
    Du musst also immer noch komplett hirnlose Getter/Setter schreiben und die Property selbst auch noch.
    Gibt aber schlimmeres denke ich mal.
    Collection-Properties würdest du initialisieren, da bräuchte man dann nur einen Getter,
    Als zugrundeliegenden Store für die Properties könntest du ein Dictionary und TValue nehmen.
  • Maschinencode zur Laufzeit erzeugen
    Wenn du die TVirtualInterface-Lösung am Laufen hast, kannst du ja versuchen tatsächliche Klassen zur Laufzeit zu erzeugen.
    Aber ohne IL/Byte-Code ist das gleich mal 100-mal aufwendiger und instabiler. In IL gibt es eine Exception, wenn der IL Code nicht verifiziert, in native Delphi schreibst du fröhlich irgendwas irgendwohin und 10 Minuten später knallt es an einer ganz anderen Stelle.
    Nur mit so einem Runtime-Codegen könntest du auch dynamisch Proxies für Klassen erzeugen.
  • Automatisch erzeugte Proxies zur Compilezeit
    Ein einfacherer Weg wäre es wohl, wenn du es zur Pflicht machst, dass dein Modell in einem Package liegt.
    Dann könntest du dieses im Post-Build laden, die Typen finden und nun relativ einfach die Proxies als Delphi Code erzeugen.
    Die fertige App muss ja deshalb noch lange keine Runtime-Packages benötigen, wäre also keine so schlimme Einschränkung.
    Der erzeugte Code müsste dann nur irgendwo so registriert werden, dass dein ORM weiß, wie er zur Laufzeit die Proxies finden kann.
    Das hier würde es auch ermöglichen, Klassen anstatt Interfaces für das Modell nehmen zu können.
    Denn zirkuläre Bezüge bringen das autom. Referenzzählen immer durcheinander, und ein Modell ohne die Möglichkeit den Graph hoch & runter zu navigieren ist bekanntlich grauenvoll.

btw: Ich weiß nicht wieweit tiOpf ist. In meinen alten Delphi-Tagen fand ich es immer ein wenig zu einschränkend und creepy. Aber das muss ja gar nicht mehr so sein.
Damit hättest du das Thema ORM/OPF abgehakt.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”

Geändert von Elvis (23. Sep 2011 um 21:29 Uhr)
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
2.786 Beiträge
 
Delphi 2009 Professional
 
#16

AW: [ORM] Lazy Loading - Wie implementieren?

  Alt 25. Sep 2011, 09:52
NHibernate an sich zu verwenden kam für uns jedenfalls aufgrund des XML-Overheads absolut nicht in Frage, deshalb dann Fluent NHibernate, welches ich dir als Anregungsimplementation größtenteils sehr empfehlen kann
Den XML "Overhead" kann man aber nach meiner Erfahrung zumindest in den Java Hibernate Versionen gut nutzen, um aus den HBM (Hibernate Mapping) Dateien, die man sich entweder automatisch per Hibernate Tool aus den Datenbankmetadaten erzeugt oder manuell erstellt, automatisch Delphi Quelltext für die Datenklassen zu erzeugen.

Unter http://hbm2pascal.appspot.com/ habe ich eine Online-Anwendung dafür, der Delphicode wird dynamisch aus den HBM Daten erzeugt. Wenn es für Delphi einmal gutes Templatig System geben sollte, lässt es sich das hbm2pascal Tool auch komplett in Delphi bauen.

Haken ist allerdings, dass XML für die Definition der Tabellen / Felder / Referentiellen Integritäten verwendet wird. Doch wenn man DB-Werkzeuge wie IBExpert & Co. hat, lässt sich über deren Editor ja auch bequem arbeiten und anschliessend läßt man DDL2HBM drüber laufen.
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
neo4a

Registriert seit: 22. Jan 2007
Ort: Ingolstadt
362 Beiträge
 
Delphi XE2 Architect
 
#17

AW: [ORM] Lazy Loading - Wie implementieren?

  Alt 25. Sep 2011, 12:17
dann Fluent NHibernate, welches ich dir als Anregungsimplementation größtenteils sehr empfehlen kann
In der Delphi-Praxis sind Konzepte aus der Java-Welt viel zu oft nur virtual;abstract; Selbst wenn die Konzepte überzeugen, wird eine Implentierung leider häufig auch durch die speziellen Delphi-Gegebenheiten beschränkt.

Soweit ich das beurteilen kann, findet sich bei unseren französischen Kollegen eine funktionierende Delphi-Implementierung dieses Fluent- NHibernate- ORM- Ansatzes. Der "spiritus rector" hat für meinen Geschmack ein wenig zu lange für das französische Militär gearbeitet: Wenn man den Formalismus aus seiner 600-Seiten Dok. entfernt, bleiben ca. 50 Seiten Substanz, die dann aber sehr interessant sind.

Nicht nur dasLazy Loading verlangt von dem Entwickler ein hohes Maß an Vertrauen (die Quelle spricht u.a. von Pest und Cholera) in das Framework und seine Leistungsfähigkeit. Die zugrunde liegende Implementierung erscheint mir jedenfalls immer sehr komplex und durch Formalismen aufgebläht, so dass mir in der täglichen Praxis der direkte Weg irgendwie "sicherer" erscheint (und ich mich trotzdem damit nicht wohler fühle).
Andreas
  Mit Zitat antworten Zitat
mquadrat

Registriert seit: 13. Feb 2004
1.113 Beiträge
 
Delphi XE2 Professional
 
#18

AW: [ORM] Lazy Loading - Wie implementieren?

  Alt 26. Sep 2011, 10:01
Ist ja doch noch eine muntere Diskussion geworden

Ich werde bei Gelegenheit mal einige der existierenden ORMs anschauen.
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.341 Beiträge
 
Delphi XE5 Professional
 
#19

AW: [ORM] Lazy Loading - Wie implementieren?

  Alt 26. Sep 2011, 10:51
In Delphi XE wurde der TVirtualMethodInterceptor eingeführt.
Da drüber würde sich auch sehr einfach was basteln lassen.
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/channel/UCUG...aXLclwO9qA-lzA
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
3.822 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#20

AW: [ORM] Lazy Loading - Wie implementieren?

  Alt 26. Sep 2011, 10:58
Sehr interessanter Thread.

Ich denke, man muss hier unterscheiden zwischen 1 zu 1 Relationen und 1 zu n Relationen. Lazy loading für 1 zu n Relationen sind imo einfacher zu implementieren, da man hier die Logik in die Listenklasse implementieren kann. Hierbei muss man dann auch darauf achten, ob man pro Listen Element ein SQL abfeuert (z.B. bei Linq to SQL Standard verhalten) oder ob man beim Zugriff auf die Liste diese direkt komplett befüllt (gibts afair auch eine Einstellung bei Linq to SQL).

In einem DSharp Prototypen benutze ich eine von TObjectList<T> abgeleitete Klasse, um das zu realisieren.

Lazy loading für 1 zu 1 Relationen zu implementieren, halte ich mit derzeitigem Stand für etwas schwieriger. Möglicherweise könnte man an dieser Stelle mit einem virtuellen Getter arbeiten, welcher über TVirtualMethodInterceptor zur Laufzeit erweitert wird.

Ich muss mich mit der gesamten ORM Thematik nochmals auseinander setzen - eventuell bietet sich dort auch meine jüngste AOP Implementierung an.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +2. Es ist jetzt 20:53 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf