Persistente abgeleitete Attribute
Ein kleines Beispiel für das abgeleitete Attribute, die in der Datenbank gespeichert sind.
Persistente abgeleitete Attribute in Fettschrift
Fett abgeleitete Attribute werden immer im Arbeitsspeicher ausgewertet, dies macht es unmöglich, Durchführen einer Suche InPS (persistenten Speicher) gegen bestimmte Daten. Jeder Suche Ausdruck bezieht sich auf einen abgeleiteten Attribut bewirkt, dass Fett alle Objekte aus der Datenbank in den Speicher zuerst für eine Auswertung im Arbeitsspeicher geladen, dies kann sehr langsam sein und Ressourcen verbraucht.
Auf die Fragen, wie man abgeleitete Attribute zu erreichen, die auch die DB für SQL-Bewertung beibehalten werden Selbsthilfegruppen wurden vergangene Diskussionen veröffentlicht. Heute hatte ich die gleiche Anforderung, und das ist die Lösung, die, der ich kam mit.
Das erste, was zu tun ist, um zu vermeiden, markieren das Attribut, wie im Modell abgeleitet. Stattdessen machen Sie dem Attribut eine permanente Attribut zB
FullName: Zeichenfolge (128)
Der nächste Schritt besteht darin sicherzustellen, dass der Wert der FullName ist immer auf dem neuesten Stand, so müssen wir ReceiveEventFromOwned in jeder abgeleiteten Klasse überschreiben, erstellen wir.
Verfahren TPerson.ReceiveEventFromOwned ((Urheber: TObject; OriginalEvent: TBoldEvent); beginnen geerbt; if (OriginalEvent = BeCompleteModify) und (Urheber = M_Name) dann FullName: = M_FirstName.AsString + '' + M_LastName.AsString; Ende;
|
Dadurch wird sichergestellt, dass das Attribut immer up to date ist, aber die Schwäche, die wir jetzt beschäftigen wird, ist, dass man FullName manuell ändern kann. Um dieses Problem zu lösen, wir FullName schreibgeschützt machen müssen, etwa so
Funktion TPerson.ReceiveQueryFromOwned (Begründer: TObject; OriginalEvent: TBoldEvent; const Args: Array von Const; Abonnenten: TBoldSubscriber): Boolean; beginnen Ergebnis: = geerbt ReceiveQueryFromOwned (Urheber, OriginalEvent, Args, Abonnenten); Wenn nicht Führen oder BoldObjectIsDeleted dann Ausfahrt; if (Urheber = M_FullName) und (OriginalEvent = BqMayModify) dann beginnen Ergebnis: = False; Unerwarteter Fehler SetBoldLastFailureReason (TBoldFailureReason.Create ('FullName ist unveränderlich', Self)); end; end;
|
FullName kann nun nicht mehr geändert werden, leider ist der Fehlers, die wir eingeführt haben, dass wir nicht mehr den Wert der FullName in unserem Ableitung-Code festlegen können.
Um dieses Problem endgültig zu lösen brauchen wir eine Möglichkeit Benutzercode/Normal-Änderungen und 'intern' zu identifizieren. Dazu implementieren ich immer ein gemeinsames Muster für meine Basisobjekt wie folgt
1) Erstellen einer Delphi-Attribut - InternalChangeCount: Integer
2) fügen Sie eine geschützte Methode BeginInternalChange
3) fügen Sie eine geschützte Methode EndInternalChange
4) fügen Sie eine geschützte Methode IsInternalChange: Boolean
Hinweis: TRootObject ist das Stammobjekt meines Modells Verfahren TRootObject.BeginInternalChange; beginnen
Inc(fInternalChangeCount); end; Verfahren TRootObject.EndInternalChange; beginnen Wenn fInternalChangeCount = 0 dann erhöhen Exception.Create ('EndInternalChange ohne BeginInternalChange'); Dec(fInternalChangeCount); end; Funktion TRootObject.IsInternalChange: Boolean; beginnen Ergebnis: = (InternalChangeCount > 0); end;
|
Schließlich müssen wir nur den ursprünglichen Quellcode aktualisieren so dass
1) einstellen des abgeleiteten Codes erfolgt innerhalb einer 'innere Wandel'
2) FullName Änderungen sind zulässig, wenn die Änderung eine interne ist.
Verfahren TPerson.ReceiveEventFromOwned (Begründer: TObject; OriginalEvent: TBoldEvent); beginnen geerbt; if OriginalEvent = BeCompleteModify dann beginnen if (Urheber = M_FirstName) or (Urheber = M_LastName) dann versuchen Sie BeginInternalChange; FullName: = M_FirstName.AsString + '' + M_LastName.AsString; schließlich EndInternalChange; end; end; end; Funktion TPerson.ReceiveQueryFromOwned (Begründer: TObject; OriginalEvent: TBoldEvent; const Args: Array von Const; Abonnenten: TBoldSubscriber): Boolean; beginnen Ergebnis: = geerbt ReceiveQueryFromOwned (Urheber, OriginalEvent, Args, Abonnenten); Wenn nicht Führen oder BoldObjectIsDeleted dann Ausfahrt; if (Urheber = M_FullName) und (OriginalEvent = BqMayModify) dann beginnen if IsInternalChange dann Ergebnis: = True sonst Ergebnis: = False; Unerwarteter Fehler Wenn nicht Ergebnis dann SetBoldLastFailureReason (TBoldFailureReason.Create ('FullName ist unveränderlich', Self)); end; end;
|
In der Anwendung erstellte bin ist die Objektstruktur tatsächlich wie folgt:
RootObject (ModelRoot)
RoledObject (hat ein FullName)
Person (FullName = Vorname + '' + Nachname)
Abteilung (FullName = Name)
Unternehmen (FullName = Name)
Fazit:
Diese Technik erfordert nur ein kleines Stück des Codes für jeden Nachfolgerklasse (RecevieEventFromOwned), gleichzeitig die Fähigkeit zur Durchführung von Recherchen auf dem DB-Server gegen einen abgeleiteten Attribut. Ich glaube, dass die Vorteile deutlich die kleine Menge von Arbeit erforderlich überwiegen, um diese Ziele zu erreichen.
Persistente abgeleitete Attribute
Persistente abgeleitete Attribute : Mehreren tausend Tipps, um Ihr Leben einfacher machen.
Ein kleines Beispiel für das abgeleitete Attribute, die in der Datenbank gespeichert sind.
Persistente abgeleitete Attribute in Fettschrift
Fett abgeleitete Attribute werden immer im Arbeitsspeicher ausgewertet, dies macht es unmöglich, Durchführen einer Suche InPS (persistenten Speicher) gegen bestimmte Daten. Jeder Suche Ausdruck bezieht sich auf einen abgeleiteten Attribut bewirkt, dass Fett alle Objekte aus der Datenbank in den Speicher zuerst für eine Auswertung im Arbeitsspeicher geladen, dies kann sehr langsam sein und Ressourcen verbraucht.
Auf die Fragen, wie man abgeleitete Attribute zu erreichen, die auch die DB für SQL-Bewertung beibehalten werden Selbsthilfegruppen wurden vergangene Diskussionen veröffentlicht. Heute hatte ich die gleiche Anforderung, und das ist die Lösung, die, der ich kam mit.
Das erste, was zu tun ist, um zu vermeiden, markieren das Attribut, wie im Modell abgeleitet. Stattdessen machen Sie dem Attribut eine permanente Attribut zB
FullName: Zeichenfolge (128)
Der nächste Schritt besteht darin sicherzustellen, dass der Wert der FullName ist immer auf dem neuesten Stand, so müssen wir ReceiveEventFromOwned in jeder abgeleiteten Klasse überschreiben, erstellen wir.
Verfahren TPerson.ReceiveEventFromOwned ((Urheber: TObject; OriginalEvent: TBoldEvent); beginnen geerbt; if (OriginalEvent = BeCompleteModify) und (Urheber = M_Name) dann FullName: = M_FirstName.AsString + '' + M_LastName.AsString; Ende;
|
Dadurch wird sichergestellt, dass das Attribut immer up to date ist, aber die Schwäche, die wir jetzt beschäftigen wird, ist, dass man FullName manuell ändern kann. Um dieses Problem zu lösen, wir FullName schreibgeschützt machen müssen, etwa so
Funktion TPerson.ReceiveQueryFromOwned (Begründer: TObject; OriginalEvent: TBoldEvent; const Args: Array von Const; Abonnenten: TBoldSubscriber): Boolean; beginnen Ergebnis: = geerbt ReceiveQueryFromOwned (Urheber, OriginalEvent, Args, Abonnenten); Wenn nicht Führen oder BoldObjectIsDeleted dann Ausfahrt; if (Urheber = M_FullName) und (OriginalEvent = BqMayModify) dann beginnen Ergebnis: = False; Unerwarteter Fehler SetBoldLastFailureReason (TBoldFailureReason.Create ('FullName ist unveränderlich', Self)); end; end;
|
FullName kann nun nicht mehr geändert werden, leider ist der Fehlers, die wir eingeführt haben, dass wir nicht mehr den Wert der FullName in unserem Ableitung-Code festlegen können.
Um dieses Problem endgültig zu lösen brauchen wir eine Möglichkeit Benutzercode/Normal-Änderungen und 'intern' zu identifizieren. Dazu implementieren ich immer ein gemeinsames Muster für meine Basisobjekt wie folgt
1) Erstellen einer Delphi-Attribut - InternalChangeCount: Integer
2) fügen Sie eine geschützte Methode BeginInternalChange
3) fügen Sie eine geschützte Methode EndInternalChange
4) fügen Sie eine geschützte Methode IsInternalChange: Boolean
Hinweis: TRootObject ist das Stammobjekt meines Modells Verfahren TRootObject.BeginInternalChange; beginnen
Inc(fInternalChangeCount); end; Verfahren TRootObject.EndInternalChange; beginnen Wenn fInternalChangeCount = 0 dann erhöhen Exception.Create ('EndInternalChange ohne BeginInternalChange'); Dec(fInternalChangeCount); end; Funktion TRootObject.IsInternalChange: Boolean; beginnen Ergebnis: = (InternalChangeCount > 0); end;
|
Schließlich müssen wir nur den ursprünglichen Quellcode aktualisieren so dass
1) einstellen des abgeleiteten Codes erfolgt innerhalb einer 'innere Wandel'
2) FullName Änderungen sind zulässig, wenn die Änderung eine interne ist.
Verfahren TPerson.ReceiveEventFromOwned (Begründer: TObject; OriginalEvent: TBoldEvent); beginnen geerbt; if OriginalEvent = BeCompleteModify dann beginnen if (Urheber = M_FirstName) or (Urheber = M_LastName) dann versuchen Sie BeginInternalChange; FullName: = M_FirstName.AsString + '' + M_LastName.AsString; schließlich EndInternalChange; end; end; end; Funktion TPerson.ReceiveQueryFromOwned (Begründer: TObject; OriginalEvent: TBoldEvent; const Args: Array von Const; Abonnenten: TBoldSubscriber): Boolean; beginnen Ergebnis: = geerbt ReceiveQueryFromOwned (Urheber, OriginalEvent, Args, Abonnenten); Wenn nicht Führen oder BoldObjectIsDeleted dann Ausfahrt; if (Urheber = M_FullName) und (OriginalEvent = BqMayModify) dann beginnen if IsInternalChange dann Ergebnis: = True sonst Ergebnis: = False; Unerwarteter Fehler Wenn nicht Ergebnis dann SetBoldLastFailureReason (TBoldFailureReason.Create ('FullName ist unveränderlich', Self)); end; end;
|
In der Anwendung erstellte bin ist die Objektstruktur tatsächlich wie folgt:
RootObject (ModelRoot)
RoledObject (hat ein FullName)
Person (FullName = Vorname + '' + Nachname)
Abteilung (FullName = Name)
Unternehmen (FullName = Name)
Fazit:
Diese Technik erfordert nur ein kleines Stück des Codes für jeden Nachfolgerklasse (RecevieEventFromOwned), gleichzeitig die Fähigkeit zur Durchführung von Recherchen auf dem DB-Server gegen einen abgeleiteten Attribut. Ich glaube, dass die Vorteile deutlich die kleine Menge von Arbeit erforderlich überwiegen, um diese Ziele zu erreichen.
Persistente abgeleitete Attribute
By Wiezutun
Persistente abgeleitete Attribute : Mehreren tausend Tipps, um Ihr Leben einfacher machen.