AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Unpräzise Namensgebung bei TRectF.Empty und TRectF.IsEmpty ?
Thema durchsuchen
Ansicht
Themen-Optionen

Unpräzise Namensgebung bei TRectF.Empty und TRectF.IsEmpty ?

Ein Thema von Rollo62 · begonnen am 25. Mai 2023 · letzter Beitrag vom 26. Mai 2023
Antwort Antwort
Seite 1 von 2  1 2      
Rollo62

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

Unpräzise Namensgebung bei TRectF.Empty und TRectF.IsEmpty ?

  Alt 25. Mai 2023, 10:16
Delphi-Version: 5
Hallo zusammen,

ich stolpere gerade über einen Konflikt bei den IsEmpty Routinen, welche so definiert sind:

Delphi-Quellcode:
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;
Das Problem ist, dass ich TRectF als Speicher für separate Left,Top,Right,Bottom benutze, welche nicht unbedingt ein Rechteck aufspannen.
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
Immerhin benutze ich TRectF ja als Speicher für nicht-Flächen, somit etwas außerhalb der Spezifikationen ...
  Mit Zitat antworten Zitat
Der schöne Günther

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

AW: Unpräzise Namensgebung bei TRectF.Empty und TRectF.IsEmpty ?

  Alt 25. Mai 2023, 10:19
dass ich TRectF als Speicher für separate Left,Top,Right,Bottom benutze, welche nicht unbedingt ein Rechteck aufspannen.
(...)
Immerhin benutze ich TRectF ja als Speicher für nicht-Flächen, somit außerhalb der Spezifikationen ...
Genau das ist doch der Punkt. Ist die Fläche leer? Ja. Gibt TRectF.Empty() eine leere Fläche zurück? Ja. Mit dem Code ist alles in Ordnung und die Namen passen auch.

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.
  Mit Zitat antworten Zitat
Rollo62

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

AW: Unpräzise Namensgebung bei TRectF.Empty und TRectF.IsEmpty ?

  Alt 25. Mai 2023, 11:04
Genau das ist doch der Punkt. Ist die Fläche leer? Ja. Gibt TRectF.Empty() eine leere Fläche zurück? Ja. Mit dem Code ist alles in Ordnung und die Namen passen auch.
Ja, das sehe ich auch so, allerdings sagt IsEmpty möglicherweise nicht deutlich genug, dass es NUR um die Fläche geht und nichts anderes, zumal Empty = (0,0,0,0) setzt.
Diesen Konflikt meine ich, speziell (0,0,0,0) deutet darauf hin, dass auch das IsZero gemeint sein könnte.

Zweckentfremdest du TRectF für etwas anderes? Ja.
Genau, ich speichere dort die Insets, das sind mehr oder weniger Margins, weil das von anderen Libraries dafür genommen wird.
Im Prinzip finde ich das TRectF dafür in Ordnung, wegen Left / Top / Right / Bottom, obwohl es natürlich besser ein TMargins sein sollte.

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.
Danke für die Vorschläge, meine Lösung ist es einen TRectF-Helper mit Zero / IsZero für das RectF anzulegen.
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

Geändert von Rollo62 (25. Mai 2023 um 11:07 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Unpräzise Namensgebung bei TRectF.Empty und TRectF.IsEmpty ?

  Alt 25. Mai 2023, 11:10
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.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Rollo62

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

AW: Unpräzise Namensgebung bei TRectF.Empty und TRectF.IsEmpty ?

  Alt 25. Mai 2023, 12:07
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 ?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Unpräzise Namensgebung bei TRectF.Empty und TRectF.IsEmpty ?

  Alt 25. Mai 2023, 12:16
implizites Type-Casting : https://docwiki.embarcadero.com/RADS...toren_(Delphi)
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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (25. Mai 2023 um 12:26 Uhr)
  Mit Zitat antworten Zitat
Rollo62

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

AW: Unpräzise Namensgebung bei TRectF.Empty und TRectF.IsEmpty ?

  Alt 25. Mai 2023, 13:14
oder via Record-Helper ein passenderes "IstLeer" hinzufügen
Dankesehr, wie gesagt das mache ich mit einem Record-Helper als "IsZero"

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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Unpräzise Namensgebung bei TRectF.Empty und TRectF.IsEmpty ?

  Alt 25. Mai 2023, 13:18
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. https://www.delphipraxis.net/213082-...ml#post1522679
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (25. Mai 2023 um 13:27 Uhr)
  Mit Zitat antworten Zitat
Rollo62

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

AW: Unpräzise Namensgebung bei TRectF.Empty und TRectF.IsEmpty ?

  Alt 25. Mai 2023, 13:20
Genau das meine ich.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#10

AW: Unpräzise Namensgebung bei TRectF.Empty und TRectF.IsEmpty ?

  Alt 25. Mai 2023, 13:20
oder via Record-Helper ein passenderes "IstLeer" hinzufügen
Mir ging es eher um die Frage inwieweit man solche Basistypen "missbrauchen" sollte und ob, wann und wo Ihr das auch mal macht.
Ich denke himitsu und ich waren da relativ eindeutig, aber da du deine Lösung immer noch stark verteidigst weiß ich nicht was noch groß dazu gesagt werden soll.
Es sei denn du wartest noch auf jemanden der dir Recht gibt
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 06:39 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