AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Spring4D: Nullables

Ein Thema von Der schöne Günther · begonnen am 13. Nov 2015 · letzter Beitrag vom 10. Aug 2017
Antwort Antwort
Seite 2 von 4     12 34   
Benutzerbild von Stevie
Stevie

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

AW: Spring4D: Nullables

  Alt 13. Nov 2015, 19:02
Bitter, da habe ich auf die Schnelle nicht dran gedacht.

Trotzdem macht mir myNullableInteger := 'Wurst' Angst. Ist mir neulich zum ersten mal zur Laufzeit um die Ohren geflogen und jetzt frage ich mich die ganze Zeit wie ich noch solche Stellen finden kann...
Ja, das ist zugegebenerweise ziemlich bescheiden so, da hier der string erst in einen Variant konvertiert wird, um dann in den Implicit operator gepackt zu werden...
Wir machen uns mal Gedanken dazu

Eine Möglichkeit, die mir spontan einfällt, wäre den implicit operator für Variant->Nullable<T> auf explicit zu ändern. Dann muss man einen Hardcast schreiben:

Delphi-Quellcode:
myNullableInteger := 'Wurst'; // kompiliert nicht
myNullableInteger := Nullable<Integer>('Wurst'); // kompiliert aber wie gehabt Exception
myNullableInteger := myVariant; // kompiliert nicht mehr - breaking change (*)
myNullableInteger := Nullable<Integer>(myVariant); // kompiliert und wie bisher je nachdem, was im Variant drin steckt erfolgreich oder Exception
P.S. Näää, vergisset, dat geht nich -.- Dann würde bei (*) wieder die Variant to T konvertierung zuschlagen und möglicherweise strings in Integer casten und die in den Nullable packen oder EVariantTypeCastError werfen, wenn null drin steckt.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (13. Nov 2015 um 19:15 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#12

AW: Spring4D: Nullables

  Alt 13. Nov 2015, 19:15
Ich habe in meiner Bibliothek auch einen Nullable-Typen und da gibt es zusätzlich einen
Delphi-Quellcode:
type
  Nullable = record
    const NULL : Nullable;
  end;

type
  Nullable<T> = record
  public
    class operator implicit( const Value : Nullable ): Nullable<T>;
  end;
Dafür habe ich zwar keine Variants-Unterstützung, aber immer eine Typsichere Zuweisung

Hübsch finde ich es auch noch
Delphi-Quellcode:
var
  ni : Nullable<Integer>;
begin
  ni := 5;
  ni := Nullable.Null;

  // auf NULL prüfen
  if ni = Nullable.Null then
  begin
  end;
  // auf NULL prüfen
  if not ni.HasValue then
  begin
  end;
  
end;
Hübsch fand ich auch noch die Abkürzungen (damit meine zarten Finger geschont werden )
Delphi-Quellcode:
NullableInteger = Nullable<Integer>;
NInteger = NullableInteger;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (13. Nov 2015 um 19:23 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

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

AW: Spring4D: Nullables

  Alt 13. Nov 2015, 19:30
Dafür habe ich zwar keine Variants-Unterstützung, aber immer eine Typsichere Zuweisung
Najo, einen Variant nem Nullable<Integer> zuweisen, der nicht in einen Integer konvertiert werden kann, knallt bei dir leider ebenfalls zur Laufzeit.

Hübsch fand ich auch noch die Abkürzungen (damit meine zarten Finger geschont werden )
Simples Aliasing, das kann ja auch jeder mit den Spring4D Nullables machen, wie er beliebt.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#14

AW: Spring4D: Nullables

  Alt 13. Nov 2015, 19:35
Dafür habe ich zwar keine Variants-Unterstützung, aber immer eine Typsichere Zuweisung
Najo, einen Variant nem Nullable<Integer> zuweisen, der nicht in einen Integer konvertiert werden kann, knallt bei dir leider ebenfalls zur Laufzeit.
Das ist aber ein Verhalten, was auch ohne den Nullable Typen auftritt ... ich verbessere nichts, verschlechtere aber auch nichts
Hübsch fand ich auch noch die Abkürzungen (damit meine zarten Finger geschont werden )
Simples Aliasing, das kann ja auch jeder mit den Spring4D Nullables machen, wie er beliebt.
Die Menschen/Programmierer sind doch faul (ich zumindesntens)
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
HeZa

Registriert seit: 4. Nov 2004
Ort: Dortmund
182 Beiträge
 
Delphi 10 Seattle Professional
 
#15

AW: Spring4D: Nullables

  Alt 13. Nov 2015, 22:20
Weil du dann aus einer Datenbank die Werte direkt zuweisen kannst und ein NULL -Wert dann korrekt zugewiesen wird.
Den Wunsch nach einer einfachen Zuweisung für ein Datenbank-Feld kann ich nachvollziehen. Dafür aber die Typ-Sicherheit beim Kompilieren aufzugeben wäre mir ein zu hoher Preis.

Mein Vorschlag
  • Implizite Variant Zuweisung aus Spring.Nullable<T> entfernen
  • Helper-Klasse für TDataSet mit AsNullable<T>

Dann könnte man schreiben

Delphi-Quellcode:
var
  myNullableInt: Spring.Nullable<T>
...
  myNullableInt := myQuery.FieldByName('MY_FELD').AsNullable<Integer>;
  // alternative Syntax
  myNullableInt := myQuery.NullableField<Integer>('MY_FELD');

Geändert von HeZa (13. Nov 2015 um 22:24 Uhr) Grund: Kleine Ergänzung
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.154 Beiträge
 
Delphi 10 Seattle Enterprise
 
#16

AW: Spring4D: Nullables

  Alt 16. Nov 2015, 09:32
Ich verstehe eins hierbei noch nicht:

Warum ist denn die Variant-Geschichte eigentlich Implicit und nicht Explicit?

Wäre Sie es, kann ich immer noch sagen
myNullableInt := myDatabaseField.Value oder
myNullableInt := myStrangeVariant

Ich kann allerdings nicht mehr sagen
myNullableInt := myFloatValue
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#17

AW: Spring4D: Nullables

  Alt 16. Nov 2015, 09:34
Wenn also Nullables beliebigen Typs sein können, wieso verwende ich nicht dann einfach Variants?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#18

AW: Spring4D: Nullables

  Alt 16. Nov 2015, 09:48
Wenn also Nullables beliebigen Typs sein können, wieso verwende ich nicht dann einfach Variants?
Ein Nullable<T> soll eben nicht alles beinhalten, sondern typsicher einen Wert vom Typ T oder eben nichts.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

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

AW: Spring4D: Nullables

  Alt 16. Nov 2015, 10:41
Ich verstehe eins hierbei noch nicht:

Warum ist denn die Variant-Geschichte eigentlich Implicit und nicht Explicit?

Wäre Sie es, kann ich immer noch sagen
myNullableInt := myDatabaseField.Value oder
myNullableInt := myStrangeVariant

Ich kann allerdings nicht mehr sagen
myNullableInt := myFloatValue
Nö, implicit heißt normale Zuweisung, explicit heißt, dass man einen Hardcast nutzen muss.

Also so:
myNullableInt := Nullable<Integer>(myDatabaseField.Value); oder
myNullableInt := Nullable<Integer>(myStrangeVariant)
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#20

AW: Spring4D: Nullables

  Alt 16. Nov 2015, 11:07
Ein Nullable<T> soll eben nicht alles beinhalten, sondern typsicher einen Wert vom Typ T oder eben nichts.
Ach so. Und es geht darum, das man einem typsicheren Nullable<Integer> auch einen String zuweisen kann, ohne das es knallt (also eher 'ein bisschen typsicher'). Und das der Wert dann 0 ist.

Na ja. Ein etwas besseres 'VarToInt' (aka convert) tut's ja auch. Also: Ich weise einem Variant zu, was ich will und erst beim Auslesen interpretiere ich, was da drin steht. Hmm. Vom Verhalten sehe ich jetzt nicht so den Unterschied zu normalen Variants, aber egal.
  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 +1. Es ist jetzt 17:43 Uhr.
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