AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language System.Length: Warum Integer und nicht Cardinal ?

System.Length: Warum Integer und nicht Cardinal ?

Ein Thema von Rollo62 · begonnen am 26. Mai 2021 · letzter Beitrag vom 26. Mai 2021
Antwort Antwort
Seite 2 von 2     12
Der schöne Günther

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

AW: System.Length: Warum Integer und nicht Cardinal ?

  Alt 26. Mai 2021, 16:09
Delphi-Quellcode:
 //<== DAS WÜRDE ICH SICHERHEITSHALBER EINBAUEN MÜSSEN, STATT CARDINAL ==

//<== ODER ARBEITET IHR MIT ASSERT ? Hilft aber nur beim Debuggen.
Stillschweigend die Methode einfach zu verlassen ist glaube ich nicht der richtige Weg.

Delphi-Quellcode:
if(ALen < 0) then
   raise EArgumentOutOfRangeException.Create(..);
if(ALen > Length(AArray)) then
   raise EArgumentOutOfRangeException.Create(..);
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.896 Beiträge
 
Delphi 12 Athens
 
#12

AW: System.Length: Warum Integer und nicht Cardinal ?

  Alt 26. Mai 2021, 16:21
Stillschweigend die Methode einfach zu verlassen ist glaube ich nicht der richtige Weg.
Ok, mir ging es eigentlich um cast vs. Guard, das wird jetzt eher philosophisch.
Aber gut:

1.) Wenn ALen = 0 dann macht die Routine mit 0-Elementen nichts : OK
2.) Wenn ALen < 0 dann kann die Routine mit < 0 Elementen auch nichts machen: So what ?

Bei 1.) ist es kein Parameterfehler, und ich sehe das bei 2.) sehr ähnlich.
Deshalb kommt ja der Gedanke Cardinal zu nutzen, weil es dann < 0 Situationen technisch gar nicht geben kann.

Das 2.) jetzt noch weiter abzufangen und zu bearbeiten ist ja genau der extra Guard-Code den ich mir sparen möchte.
Wenn meine Funktion >= 0 verlangt, und ich < 0 ignoriere (gleiches Verhalten wie 0), ist das für mich logisch erstmal konform
( mach nur das was du wirklich machen kannst ).

Für die korrekte Übergabe der Parameter ist dann der Aufrufer verantwortlich, der sicher den passenden Guard-Code schon drin hat.
  Mit Zitat antworten Zitat
Der schöne Günther

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

AW: System.Length: Warum Integer und nicht Cardinal ?

  Alt 26. Mai 2021, 16:46
Für die korrekte Übergabe der Parameter ist dann der Aufrufer verantwortlich, der sicher den passenden Guard-Code schon drin hat.
Dem würde ich aber härtestens widersprechen. Das schiebt doch nur die Verantwortung von sich weg.
https://de.wikipedia.org/wiki/Fail-Fast

Es ist doch kein Aufwand einmal eine Klassenmethode CheckArguments(const bytes: TBytes; const index: NativeInt) einzuführen, die kannst du überall recyclen. Alternativ bringt z.B. Spring4D gleich ein Guard.CheckRange(..) mit (wie viele andere auch). An Prüfungen sollte man wirklich nicht sparen wollen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.105 Beiträge
 
Delphi 12 Athens
 
#14

AW: System.Length: Warum Integer und nicht Cardinal ?

  Alt 26. Mai 2021, 17:03
2.) Wenn ALen < 0 dann kann die Routine mit < 0 Elementen auch nichts machen:
Ist auch Philosophisch/Ideologisch/Mutmaßlich ... man könnte ja davon ausgehen, dass es ein Eingabefehler ist.


Deshalb kommt ja der Gedanke Cardinal zu nutzen, weil es dann < 0 Situationen technisch gar nicht geben kann.
Im Gegenzug gibt es bei Cardinal aber auch 2 Milliarden Werte, die es technisch niemals geben kann. ( >2 GB )
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.896 Beiträge
 
Delphi 12 Athens
 
#15

AW: System.Length: Warum Integer und nicht Cardinal ?

  Alt 26. Mai 2021, 18:25
Im Gegenzug gibt es bei Cardinal aber auch 2 Milliarden Werte, die es technisch niemals geben kann. ( >2 GB )
Schon klar,
aber ich brauche dann nur < Length() zu prüfen, was ich sowieso tun muss, und da schliesst sich der Kreis

Zu dem Fail-first:
Es ist vieleicht die Frage was man als Fehler definiert, und was nicht.
Bei Div0 ist das ja klar.
Aber zum Beispiel könnte ein Ignorieren bei < 0 Teil der Funktion sein,
so dass man abhängig von einem Ergebnis eine Funktion auslösen kann.

Mal als Beispiel eine CutLeft Funktion (sorry, ist schon spät, mir fällt momentan nichts Besseres ein).
Delphi-Quellcode:
procedure CutLeft( var AArray : TBytes; const ACutCount : Integer );
var LTemp : TBytes;
begin
    if (ACutCount > 0) and (Max(ACutCount, Length(AArray)) <= Length(AArray)) then
    begin
        SetLength( LTemp, Length( AArray )- ACutCount );
        if Length( LTemp ) > 0 then
            System.Move( AArray[ 0 ], LTemp[ 0 ], Length( LTemp ) );
        AArray := ATemp;
    end;
end;
Die kann ich Anwenden von 1 bis MaxInt, und schneidet entsprechend viele Left-Zeichen raus.
Negative Werte werden ignoriert.

Ich kann die Anwenden mit Berechnungen, wie
Delphi-Quellcode:
var
  LValue : TBytes;
  LPos : Integer;

begin
    LValue := Xyz;
    ...
    LPos := FindCut( LValue, CutSequence );
    ...
    LPos := LPos + 3; // Berechne CutPosition

    CutLeft( LValue, LPos ); //<== Ich kann mich drauf verlassen das nichts Ungewolltes passiert

    oder

    LPos := LPos - 3; // Berechne CutPosition

    CutLeft( LValue, LPos ); //<== Ich kann mich drauf verlassen das nichts Ungewolltes passiert

end;
Das Ergebnis ist immer korrekt ( aus meiner Sicht ) kein Grund hier irgendwelche "Exception" zu werfen.
Das Ergebnis ist entweder leer oder das gesamte Array, mögliche Überläufe werden ignoriert.

Wenn ich die Überläufe Vermeiden oder Erkennen muss, dann kann ich ganz simpel im Aufrufer LPos checken,
sowas in der Art meinte ich.
Die Funktion selbst ins intrinsisch resilient gegen irgendwelche Über/Unterläufe,
und ich kann mich auf das Ergebnis verlassen und z.B. ohne weitere Prüfungen weiterverarbeiten.

Falls da ein LPos-1 OffsetFehler drin sein sollte, dann hilft mir eine scharfe Abfrage doch auch nicht weiter.

Es gibt sicher Funktionen wo ich die scharfe Prüfung explizit möchte, das ist richtig, und die darf "Exception" werfen.
Ich denke es kann auch gute Gründe für eine "ignorante" Funktion geben
  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 01:40 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