Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Nullable VS Nullable (https://www.delphipraxis.net/199250-nullable-vs-nullable.html)

WiPhi 10. Jan 2019 14:45

AW: Nullable VS Nullable
 
Entschuldige freimatz, deine Antwort hatte ich vorhin übersehen.
Zitat:

Zitat von freimatz (Beitrag 1423010)
Bei Spring4D vorstellig werden, sie mögen doch bitte eine eigene unit für die Nullable machen?

Darüber habe ich auch schon nachgedacht, wollte aber erstmal sehen, ob es vielleicht eine einfache Lösung gibt, ohne in das Framework einzugreifen.

Zitat:

Zitat von Schokohase (Beitrag 1423042)
Ich möchte nochmals darauf hinweisen, dass gerade hier bei der Einhaltung von SoC dieses Problem nicht wirklich existiert, bzw. an nur einer überschaubaren Stelle auftritt.

Die Entity-Klassen für Aurelius (oder jedes andere ORM-Framework) spiegeln 1:1 die SQL-Tabellen wieder und nur in den eher zufällig seltenen Fällen auch Anwendungs-Klassen.

Anwendungs- und Datenhaltungsklassen sind strikt getrennt.

Ich denke bei meinem Fall geht es gerade um diese "überschaubare" Stelle: eine Import-Klasse, welche aus einer Datei in die Datenbank (sprich ORM) einliest. Diese Klasse muss zwangsläufig das Datenobjekt und somit auch den Aurelius-Nullable kennen. Weiterhin muss der Import bei Bedarf Werte konvertieren können (u.a. in Aurelius-Nullables). Ich möchte gar nicht den Spring Nullable verwenden, jedoch aber den TValue-Helper, welcher sich in der Spring-Unit befindet. Dummerweise befindet sich in dieser Unit auch der Spring Nullable.

Somit hat freimatz natürlich Recht: Wenn der Spring Nullable-Typ in einer separaten Unit liegen würde, hätte ich das Problem nicht.

Zitat:

Zitat von TiGü (Beitrag 1423046)
Hm, so richtig will das nicht mit den generischen Operator für record helper.
Höchstens so ein "stumpfer" Ansatz mit Konvertierungsfunktionen scheint zu kompilieren:

Ja sowas hatte ich auch schon mal vor mir, war aber nicht besonders begeistert und habe es wieder verworfen. Wenn sollte das schon Implicit funktionieren.

Wie gesagt, derzeit funktioniert die Variante mit Aurelius Nullable als letzte Unit einbinden gut. Mittelfristig werde ich bei Gelegenheit mal bei Spring4D anfragen, ob der Nullable-Type in eine eigene Unit (so wie bei Aurelius ;)) wandern könnte.
OT: Da steht doch bald ein neues Release an? Wenn dort einige Major Änderungen gemacht welchen, wäre das ja eine Idee.

TiGü 10. Jan 2019 15:36

AW: Nullable VS Nullable
 
Zitat:

Zitat von WiPhi (Beitrag 1423063)
Ich möchte gar nicht den Spring Nullable verwenden, jedoch aber den TValue-Helper, welcher sich in der Spring-Unit befindet. Dummerweise befindet sich in dieser Unit auch der Spring Nullable.

Somit hat freimatz natürlich Recht: Wenn der Spring Nullable-Typ in einer separaten Unit liegen würde, hätte ich das Problem nicht.

Delphi-Quellcode:
unit DeineUnitWoDuNichtSpringNullableNehmenWillst;

interface

uses
//  Spring,
  SpringHelperUnitMitTypeForwarding;

implementation

end.
Delphi-Quellcode:
unit SpringHelperUnitMitTypeForwarding;

interface

uses
  Spring;

  TValueHelper = Spring.TValueHelper;

implementation

end.
Geht das?

Stevie 7. Feb 2019 10:33

AW: Nullable VS Nullable
 
Zitat:

Zitat von WiPhi (Beitrag 1423009)
Besonders schön ist das die Klasse TTypeToNullableConverter nicht von mir, sondern auch aus Spring stammt und augenscheinlich mit dem Aurelius-Nullable klar kommt.

Die braucht man nicht - die von und nach Nullable<T> Konvertierung ist im TValueHelper direkt implementiert.
Diese benutzt aber die Implementierung, wie Spring4D sie hat und scheint nur mit Aurelius zu funktionieren, wird aber im Endeffekt Speicher korrumpieren. Bei Spring ist das interne FHasValue Feld ein String, damit auch lokale Variablen vom Typ Nullable<T> immer so initialisieren, dass sie signalisieren, null zu sein. Bei Aurelius ist es einfach ein Boolean. Hat auch Vorteile (kein expliziter Code für Init und Finalize für solche Variablen notwendig. Dafür sind sie erstmal in einem nicht definierten Zustand wie alle nicht gemanagten Wertetypen.

Wenn du ToType<Nullable<T>> für Aurelius Nullable<T> benutzt, wirst du dir Speicherlöcher schaffen und Speicher überschreiben, weil das intern auf das FHasValue Feld schreibt, was es für ein string Feld hält.

Aurelius ist im übrigen nicht die einzige Drittanbieter Komponente, die den Nullable Typen für sich entdeckt hat - da aber leider die Bereitschaft der meisten für Zusammenarbeit mit OpenSource Bibliotheken zusammen zu arbeiten gleich null ist, ist mir das dann auch egal, wenn der Klump nicht kompatibel ist. Ich wäre gern gewillt, bestimmte Teile so zu restrukturieren, dass sie gemeinsam mit anderen genutzt werden können, ohne dass jeder das Rad ein bisschen anders neu erfinden muss.

P.S. Ich werd mal zumindest schauen, dass er auch Aurelius Nullable korrekt konvertiert, ohne, dass es den Speicher zerfräst. Das sollte sich einfach genug machen lassen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:18 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz