![]() |
AW: Maßeinheiten als Typen
@Schokohase
Mein Post bezog sich insbesondere auf diese Aussage: Zitat:
Klar sind 1000g = 1Kg [B]ABER] 1000g <> 1000Kg <> 1000m <> 1000V |
AW: Maßeinheiten als Typen
Zitat:
Sowas wie 1000g <> 1000kg zog niemand in Zweifel, da 1000 g ungleich zu 1000000 g ist (bzw. 1 kg ungleich 1000 kg). Du denkst - oder es kommt uns allen nur so vor - das die MaßEINHEIT Gramm und Kilogramm zwei verschiedene Paar Schuhe sind. Das ist aber nicht so. Das eine Schuh-Paar ist nur "größer", aber sonst das selbe (!) Modell. Einen gängigen Weg, wie man das mit Operatoren im Record erschlagen kann, hast du im Laufe der letzten Seiten vielfach aufgezeigt bekommen. |
AW: Maßeinheiten als Typen
Zitat:
Die Maßeinheiten Gramm und Kilogramm bezeichnen letztlich ein Gewicht. Der Unterschied besteht hier nur in der Granulierung oder dem Faktor mit Bezug zu den anderen Einheiten bei Gewichten. Und richtig, es wurde ein Beispiel für die Impelentierung mit einem Typen genannt. Leider konnte mir bisher keiner Erläutern, wo der Vorteil liegt, wenn man das als ein Typ implementiert (gegenüber der Implementierung durch einzelne Typen; den seh ich nämlich irgendwie nicht wirklich). |
AW: Maßeinheiten als Typen
Zitat:
|
AW: Maßeinheiten als Typen
Zitat:
Ich nehme da nur einen und bin schon fertig. Warum wohl? Eben, weil es schneller geht und ich keinen Vorteil bei der Aufsplitung sehe. |
AW: Maßeinheiten als Typen
Zitat:
Einfaches Beispiel:
Delphi-Quellcode:
Im Gegensatz zu
procedure doSomething(weight: TTon);
procedure doSomething(weight: TTonne); procedure doSomething(weight: TKilogram); procedure doSomething(weight: TGram); procedure doSomething(weight: TMilligram); procedure doSomething(weight: TMicrogram); procedure doSomething(weight: TPound); procedure doSomething(weight: TStone); procedure doSomething(weight: TSlug); // Aufruf: doSomething(100 as TStone);
Delphi-Quellcode:
Und das ganze wird schlimmer, wenn du Parameter kombinieren willst:
procedure doSomething(weight: TWeight);
// Aufruf: doSomething(TWeight.getStones(100));
Delphi-Quellcode:
function computeSpeed(distance: TYards; time: TSeconds): TMeterPerSecond
function computeSpeed(distance: TMeters; time: TSeconds): TMeterPerSecond function computeSpeed(distance: TMillimeters; time: TSeconds): TMeterPerSecond function computeSpeed(distance: TKilometers; time: TSeconds): TMeterPerSecond function computeSpeed(distance: TInches; time: TSeconds): TMeterPerSecond function computeSpeed(distance: TMiles; time: TSeconds): TMeterPerSecond function computeSpeed(distance: TYards; time: TMinutes): TMeterPerSecond function computeSpeed(distance: TMeters; time: TMinutes): TMeterPerSecond function computeSpeed(distance: TMillimeters; time: TMinutes): TMeterPerSecond function computeSpeed(distance: TKilometers; time: TMinutes): TMeterPerSecond function computeSpeed(distance: TInches; time: TMinutes): TMeterPerSecond function computeSpeed(distance: TMiles; time: TMinutes): TMeterPerSecond function computeSpeed(distance: TYards; time: THours): TMeterPerSecond function computeSpeed(distance: TMeters; time: THours): TMeterPerSecond function computeSpeed(distance: TMillimeters; time: THours): TMeterPerSecond function computeSpeed(distance: TKilometers; time: THours): TMeterPerSecond function computeSpeed(distance: TInches; time: THours): TMeterPerSecond function computeSpeed(distance: TMiles; time: THours): TMeterPerSecond |
AW: Maßeinheiten als Typen
Eine Anregung von jenseits des Delphi-Tellerrands:
Es gibt für C++ eine Bibliothek, die Deine Aufgabenstellung (m.E. perfekt) aufgreift: ![]() Ich habe die selbst schon verwendet und finde den Ansatz sehr gut. Vielleicht kannst Du daraus ein paar Anregungen mitnehmen und Dir etwas erstellen, was (natürlich) nicht so komplett ist, aber den Bedarf erfüllt. |
AW: Maßeinheiten als Typen
Hmm. Zurück auf den Boden. Ich kenn das, was der TE will, zB aus dem Bereich von Rezepturen. Da hast du Zutaten, mache in GRAMM, manche in KILOGRAMM, vielleicht sogar manche in LITER.
Wenn man das Gesamtgewicht der Rezeptur wissen will, muss man addieren + da wäre es natürlich ganz cool wenn schon der Compiler dafür sorgt, dass GRAMM und KILOGRAMM von der richtigen Methode addiert würden. Aber wie ich auch schon gesagt habe, scheint mir das zu umständlich und auch knapp daneben gezielt. Denn ich habe ja immer eine Kombination aus Wert+Einheit + so würde ich das auch meinen Methoden übergeben: Addiere(120, 'KG', 12, 'GRAMM'); AddiereKGzuGRAMM(120,12); // da kann ich sogar Typsicherheit haben! type TKG = type Float; ToGramm(TKG):TGRAMM; // wieder: Typsicher ToGramm(TMG):TGRAMM; // wieder: Typsicher + overloaded |
AW: Maßeinheiten als Typen
Zitat:
Delphi-Quellcode:
In diesem Record kann man jetzt problemlos die Rechenoperationen und Umrechnungen implementieren und man hat einen Typen für das Gewicht.
TMassUnit = (Undefined, Gram, Kilogram, Milligram, Tonne);
TMass = record private FValue: Extended; // Wert FUnit: TMassUnit; // Einheit public constructor Create(AValue: Extended; AUnit: TMassUnit); property Value: Extended read FValue; property &Unit: TMassUnit read FUnit; private function AsBaseUnit(): Extended; function AsBaseNumericType(AUnit: TMassUnit); public property Grams: Extended index TMassUnit.Gram read AsBaseNumericType; property Kilograms: Extended index TMassUnit.Kilogram read AsBaseNumericType; property Milligrams: Extended index TMassUnit.Milligram read AsBaseNumericType; property Tonnes: Extended index TMassUnit.Tonne read AsBaseNumericType; end; function TMass.AsBaseUnit(): Extended; var x:Extended; begin x := Value; case FUnit of TMass.Gram: Result := x / 1e3; TMass.Kilogram: Result := x; TMass.Milligram: Result := x / 1e6; TMass.Tonne: Result := x * 1e3; else raise ENotImplementedException.Create('Fehler'); end; end; function TMass.AsBaseNumericType(AUnit: TMassUnit): Extended; var x: Extended; begin if (AUnit = FUnit) Exit(FValue); x := AsBaseUnit(); case AUnit of TMass.Gram: Result := x * 1e3; TMass.Kilogram: Result := x; TMass.Milligram: Result := x * 1e6; TMass.Tonne: Result := x / 1e3; else raise ENotImplementedException.Create('Fehler'); end; end; |
AW: Maßeinheiten als Typen
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:37 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