Variablen und Ihre Einheiten



  • Oft habe ich mit Variablen zu tun, deren Einheit nicht eindeutig ist. Zum Beispiel kann

    double witdth = 0.0;
    

    ja mm, cm, Pixel, Felder, Schritte oder sonstwas sein.

    Deswegen hänge ich seit kurzem die Einheit an den Variablennamen an:

    double WidthCm = 0.0;
    

    Das scheint mir v.a. dann sinnvoll, wenn im gleichen Projekt mit Pixeln, cm, Zoll (inch) etc. hantiert und ständig umrechnet.

    Wie löst ihr sowas?

    P.S. bei Strings, booleschen Werten oder einfachen Anzahlen (numberOfTrees) gibt es ja keine Einheit und deswegen hänge ich in diesen Fällen auch nicht an



  • Evtl. lohnt es sich, dieses Verhalten in einer Klasse zu kapseln:

    class Length {
        private double mm;
    
        public Length(double mm) {
            this.mm = mm;
        }
    
        public double getMillimeters() {
            return mm;
        }
    
        public double getCentimeters() {
            return mm / 10;
        }
    }
    

    Damit ist die interne Speicherung unabhängig von der äußeren Repräsentation.



  • Das ist eine gute Idee!



  • Auf folgende Weise ist noch sichergestellt, dass immer eine Einheit angegeben wird:

    enum Unit
    {
    	mm,
    	cm,
    	dm,
    	m,
    	km,
    }
    
    public class Length
    {
    	private double length;
    
    	public Length(double length, Unit unit)
    	{
    		setLength(length, unit);
    	}
    
    	public double getLength(Unit unit)
    	{
    		return length / conversionFactor(unit);
    	}
    
    	public void setLength(double length, Unit unit)
    	{
    		this.length = length * conversionFactor(unit);
    	}
    
    	private double conversionFactor(Unit unit)
    	{
    		switch (unit)
    		{
    			case mm:	return    0.001;
    			case cm:	return    0.01;
    			case dm:	return    0.1;
    			case m: 	return    1.;
    			case km:	return 1000.;
    		}
    
    		return 0; // Funktion muss ja unbedingt etwas zurückgeben
    	}
    }
    

    Anwendung:

    public static void main(String[] args)
    	{
    		Length s = new Length(300, Unit.mm);
    		System.out.println(s.getLength(Unit.m));
    		s.setLength(0.25, Unit.km);
    		System.out.println(s.getLength(Unit.m));
    		System.out.println(s.getLength(Unit.cm));
    	}
    


  • Aber kein Overengeneering betreiben.
    Ich halte es so, daß ich die Einheiten nicht zusätzlich nenne, wenn ich physikalische Größen in Grundeinheiten angebe, also Masse in kg und Länge in m. Und das versuche ich auch zu tun.
    Also nicht

    double WidthInCm = 31.4;
    

    sondern

    double Width = 31.4*Length::CentiMeter;
    


  • Intern wird immer nit der gleich einheit gerechnet, alles was von außen über GUI oder File kommt, wird dort sofortumgerechnet


Log in to reply