![]() |
Delphi-Version: 5
Unpräzise Namensgebung bei TRectF.Empty und TRectF.IsEmpty ?
Hallo zusammen,
ich stolpere gerade über einen Konflikt bei den IsEmpty Routinen, welche so definiert sind:
Delphi-Quellcode:
Das Problem ist, dass ich TRectF als Speicher für separate Left,Top,Right,Bottom benutze, welche nicht unbedingt ein Rechteck aufspannen.
class function TRectF.Empty: TRectF;
begin Result := TRectF.Create(0,0,0,0); end; function TRectF.IsEmpty: Boolean; begin Result := (Right <= Left) or (Bottom <= Top); end; Also könnte RectF( 0, 0, 0, 50 ) sein, somit die Fläche IsEmpty: JA, aber die Variable IsEmpty: NEIN ( aus meiner Sicht ). Als Argument dafür sehe ich, dass es die Funktion TRectF.Empty gibt, welche (0,0,0,0) definiert, also würde ich IsEmpty für (0,0,0,0) erwarten. Für meinen angedachten Fall würde ich die Funktion IsZero vorsehen, in ähnlicher Weise wie dies bei TPointF und Anderen vorhanden ist, bei TRectF aber nicht:
Delphi-Quellcode:
function TRectF_Helper.IsZero : Boolean;
begin Result := SameValue(Left, 0.0) and SameValue(Top, 0.0) and SameValue(Right, 0.0) and SameValue(Bottom, 0.0); end; Wie seht Ihr das, ist Empty / IsEmpty vielleicht ein gar nicht so präziser Name wie ich immer dachte ? Oder sollte die Funktion IsEmpty vielleicht sogar ein Ergebnis ergänzt um IsZero zurückgeben ? Vielleicht sollten die Funktionen auch einfach nur anders heißen, um präzise zu sein, wie EmptySpace und IsEmptySpace ? Bin ich jetzt einfach nur zu pedantisch, oder gibt es ein gutes Argument für IsEmpty ? Immerhin sagt "TRectF" ja implizit aus, dass es um die Fläche von Rechtecken geht. Keine Angst, ich will hier keinen Feature-Request starten, ich möchte nur wissen, wie man den Unterschied Empty/Zero am besten im Namen oder Funktionsweise beschreiben würde :-D Immerhin benutze ich TRectF ja als Speicher für nicht-Flächen, somit etwas außerhalb der Spezifikationen ... |
AW: Unpräzise Namensgebung bei TRectF.Empty und TRectF.IsEmpty ?
Zitat:
Zweckentfremdest du TRectF für etwas anderes? Ja. Mach dir doch deine eigene Struktur und benenne die Felder innen drin auch für das, was sie ausdrücken. Deinen bestehenden Code musst du auch nicht umschreiben, du kannst deiner eigenen Struktur doch eine Operator-Überladung verpassen, mit welcher sie implizit in ein TRectF konvertiert wird. |
AW: Unpräzise Namensgebung bei TRectF.Empty und TRectF.IsEmpty ?
Zitat:
Diesen Konflikt meine ich, speziell (0,0,0,0) deutet darauf hin, dass auch das IsZero gemeint sein könnte. Zitat:
Im Prinzip finde ich das TRectF dafür in Ordnung, wegen Left / Top / Right / Bottom, obwohl es natürlich besser ein TMargins sein sollte. Zitat:
Damit komme ich klar. Nach meiner Definition ist: Zero - es geht um 0,0,0,0 und Empty - es geht um Fläche. Mir ging es mehr um die Konflikte mit der Namensgebung. Würdest Du im oben genannten Fall auf z.B. TMargins (ist aber eine Klasse meines Wissens) oder noch besser ein TInsets Record umsteigen, selbst wenn es auf TRectF ausgelegt ist ? In diesem Fall kommt das aus einer externen Library, aber ich selber missbrauche auch gerne die Delphi Basic-Typen für solche naheliegende Fälle. Das ist meine Frage: "Missbraucht" Ihr solche Basistypen (TRect, TPoint, TSize, ...) auch manchmal, oder seid ihr IMMER strikt Namenskonform ? Das richtige Festlegen von Namen ist manchmal eine Qual :-D |
AW: Unpräzise Namensgebung bei TRectF.Empty und TRectF.IsEmpty ?
Man kann mal was missbrauchen, aber gerade wenn der Typ dann nicht ganz den Anforderungen entspricht und letztendlich nur ein Record mit 4 Feldern ist, würde ich eindeutig für nen eigenen Typ sprechen.
Du hast wahrscheinlich so viel mehr Zeit jetzt verschwendet (allein schon mit dem Thread hier) als das schreiben eines eigenen Typs gedauert hätte. |
AW: Unpräzise Namensgebung bei TRectF.Empty und TRectF.IsEmpty ?
Ja, aber wie gesagt, es kommt von Extern.
Dann würde ich intern und extern verschiedene Typen verwenden und müsste extra noch konvertieren. Da finde ich die Ergänzung mit IsZero für mich sinnvoller, auch weil das Problem eventuell mal auch woanders auftreten kann. Damit könnte ich dann immer eindeutig definieren, was ich gerade brauche: IsEmpty oder IsZero. Ich finde diese Ergänzung einigermaßen natürlich, insbesondere auch weil es das bei anderen Typen so gibt, z.B. TPoint. Falls ich spezielle Typen brauche, dann lege ich die in der Regel auch an. Aber wenn es einen zu 99% gut passenden Basistypen gibt, auch vom Namen her, sollte man den nicht einfach nehmen ? Ursprünglich bin ich von 100% passend ausgegangen, das war leider falsch, aber werden bei ganz neu angelegten Typen die Fehlerraten nicht noch viel heftiger werden als bei den jahrzehntelang perfekt gewarteten Typen ? |
AW: Unpräzise Namensgebung bei TRectF.Empty und TRectF.IsEmpty ?
implizites Type-Casting :
![]()
Delphi-Quellcode:
VariableMitInternemTyp := VariableMitExternemTyp;
oder via Record-Helper ein passenderes "IstLeer" hinzufügen oder kapseln
Delphi-Quellcode:
type
TMyRecord = record {private} Intern: TRect; function GetWidth: Integer; procedure SetWidth(Value : Integer); ... {public} property Top: Integer read Intern.Top write Intern.Top; property Left: Integer read Intern.Left write Intern.Left; property Width: Integer read GetWidth write SetWidth; property Height: Integer read GetHeight write SetHeight; end; Was ist "Extern"? Wenn es eine DLL ist, dann verbietet dir niemand intern einen anderen/eigenen Typen zu benutzen (so lange er von den Daten/Feldern her identisch/kompatibel ist) |
AW: Unpräzise Namensgebung bei TRectF.Empty und TRectF.IsEmpty ?
Zitat:
Mir ging es eher um die Frage inwieweit man solche Basistypen "missbrauchen" sollte und ob, wann und wo Ihr das auch mal macht. Der Wrapper, den Du vorschlägst, wäre ja für diesem Fall der Worst-Case, aus meiner Sicht, nur um L,T,R,B zu kapseln ( dann doppelt gekapselt ). Viel Overhead bei Null Nutzen. Ich nutze schonmal gerne die Basictypen TRect, TRectF, TPoint, TPointF, TSize, ... um ähnliche Dinge zu kapseln. Bisher war mit der Unterschied IsEmpty und IsZero nicht so bewusst geworden. :stupid: |
AW: Unpräzise Namensgebung bei TRectF.Empty und TRectF.IsEmpty ?
Wenn möglich verwende ich vorzugsweise Typen der StandardUnits des Delphi.
(von Typen aus mitgelieferten Units, ala INDY, nehme ich aber zunehmend Abstand) Auch wenn es um neuere Typen geht, in Codes/Komponenten auch für ältere Delphis, da dann natürlich mit Fallback. ![]() |
AW: Unpräzise Namensgebung bei TRectF.Empty und TRectF.IsEmpty ?
Genau das meine ich.
|
AW: Unpräzise Namensgebung bei TRectF.Empty und TRectF.IsEmpty ?
Zitat:
Es sei denn du wartest noch auf jemanden der dir Recht gibt :P |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:02 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-2025 by Thomas Breitkreuz