![]() |
AW: System.Length: Warum Integer und nicht Cardinal ?
Zitat:
Delphi-Quellcode:
if(ALen < 0) then
raise EArgumentOutOfRangeException.Create(..); if(ALen > Length(AArray)) then raise EArgumentOutOfRangeException.Create(..); |
AW: System.Length: Warum Integer und nicht Cardinal ?
Zitat:
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. |
AW: System.Length: Warum Integer und nicht Cardinal ?
Zitat:
![]() Es ist doch kein Aufwand einmal eine Klassenmethode
Delphi-Quellcode:
einzuführen, die kannst du überall recyclen. Alternativ bringt z.B. Spring4D gleich ein
CheckArguments(const bytes: TBytes; const index: NativeInt)
Delphi-Quellcode:
mit (wie viele andere auch). An Prüfungen sollte man wirklich nicht sparen wollen.
Guard.CheckRange(..)
|
AW: System.Length: Warum Integer und nicht Cardinal ?
Zitat:
Zitat:
|
AW: System.Length: Warum Integer und nicht Cardinal ?
Zitat:
aber ich brauche dann nur < Length() zu prüfen, was ich sowieso tun muss, und da schliesst sich der Kreis :stupid: 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:
Die kann ich Anwenden von 1 bis MaxInt, und schneidet entsprechend viele Left-Zeichen raus.
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; Negative Werte werden ignoriert. Ich kann die Anwenden mit Berechnungen, wie
Delphi-Quellcode:
Das Ergebnis ist immer korrekt ( aus meiner Sicht ) kein Grund hier irgendwelche "Exception" zu werfen.
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 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 :stupid: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz