© LanKogal/Shutterstock.com
Hartkodierten Code verringern

Mehr Flexibilität


Klar, die Verwendung von hartkodiertem Code geht wesentlich einfacher von der Hand: Man muss fürs Erste weniger überlegen, da der Code nur im Hier und Jetzt läuft. Zukünftige Änderungen werden mit dieser Technik hingegen erschwert. Sobald der Code um neue Funktionen oder Datentypen erweitert wird, muss er erst überarbeitet werden. Wir zeigen, mit welchen Bibliotheken, Klassen und Techniken sich hartkodierter Code reduzieren lässt.

Am Anfang ist es immer wichtig, dass Software schnellstmöglich auf den Markt gebracht wird, damit man zu den Ersten gehört, die ein neues Produkt herausbringen. Doch Code, der sich leichter warten lässt, lässt sich an zukünftige Änderungen besser anpassen. Immerhin legen etliche Firmen großen Wert darauf, doppelten Code zu vermeiden, indem sie Menschen beschäftigen, die die Menge an Zeilen reduzieren und Code flexibler gestalten [1]. Mit den folgenden Techniken werden wir uns in diesem Tutorial näher beschäftigen:

  • Konstanten

  • flexibler Code

  • typensichere Datenbank-Statements mit jOOQ

  • Internationalisierung

Konstanten

Konstanten zeichnen sich dadurch aus, dass sie im gesamten Programm unverändert bleiben. Sie sind demnach hartkodiert. Ihr solltet Konstanten in einer eigenen Datei abspeichern. Beispielsweise könnt ihr die Datei Constants.java nennen und darin Pfade, Zahlen, Anzahl von Spalten, Zeilen etc. festhalten (Listing 1).

Listing 1

public class Constants { public static final String CSS = "Simple.css"; public static final String DARROW = "=>"; public static final int COLUMNS = 3; }

Eine Variable, die das Schlüsselwort final beinhaltet, kann nach dem Initialisieren nicht mehr geändert werden. Das Schlüsselwort static sorgt dafür, dass die Klasse Constants.java nicht initialisiert werden muss, um auf die Konstante zuzugreifen. Außerdem sollte die Konstante mit dem Schlüsselwort public versehen werden, damit von anderen Klassen aus darauf zugegriffen werden kann.

Eine weitere Möglichkeit, hartkodierten Code zu vermeiden, ist es, Datentypen für Mengen, Einheiten etc. zu erstellen und Methoden bereitzustellen, die die Werte leserlich ausgeben. Beispielsweise gibt es die Bibliothek JScience, die empfehlenswert ist, sofern euer Programm mit Geld rechnet, geografische Koordinaten einsetzt, sich mit Physik beschäftigt oder mathematische Funktionen verwendet [3]. Das in Abbildung 1 dargestellte Beispielprogramm verdeutlicht, wie JScience benutzt wird. Es berechnet die Zahl der Elektronen, die sich in 100 Coulomb befinden (Listing 2).

Listing 2

import org.jscience.physics.amount.*; import org.jscience.physics.amount.Constants; import javax.measure.quantity.*; import javax.measure.unit.*; import static javax.measure.unit.NonSI.*; import static javax.measure.unit.SI.*; public class PhysicsExample { public static void main (String[] args) { Amount<ElectricCharge> e100 = Amount.valueOf(100, SI.COULOMB); Amount q = e100.divide(Constants.e); System.out.println("Wieviele Elektronen befinden sich in "+e100 + "?"); System.out.println(q); } }

Bei JScience existiert eine eigene Konstantenliste in der Datei Constants.java, wobei ihr auf die einzelnen Konstanten mit Constants.Name zugreifen könnt. Die Konstanten sind bei JScience nicht irgendwelche Zahlen wie int oder double. Stattdessen wurden sie mit eigenen Datentypen und Einheiten versehen (Tabelle 1). Weitere Beispiele findet ihr unter [4].

Beispiel

Bedeutung

Amount<Mass> m0 = Amount.valueOf(100, POUND);

erzeugt eine Variable vom Typ „Masse“ mit der Einheit „Pfund“

Amount<ElectricCurrent> m2 = mount.valueOf("234 mA").to(MICRO(AMPERE));

erzeugt eine Variable vom Typ „Strom“ mit der Einheit Milliampere und wandelt den Wert in Ampere um

Amount<Temperature> t0 = Amount.valueOf(-7.3, 0.5, CELSIUS);

erzeugt eine Variable vom Typ „Temperatur“ mit der Einheit „Celsius“

Amount<Volume> m6 = Amount.valueOf(20, 0.1, LITRE);

erzeugt eine Variable vom Typ „Volumen“ mit der Einheit „Liter“

Amount<Frequency> m7 = Amount.rangeOf(10, 11, KILO(HERTZ));

erzeugt eine Variable vom Typ „Frequenz“ mit der Einheit „Kilohertz“

Amount<Frequency> m8 = Amount.valueOf(9000, HERTZ);

erzeugt eine Variable vom Typ „Frequenz“ mit der Einheit „Hertz“

Amount<Length> x = Amount.valueOf(1.0, METRE);

erzeugt eine Variable vom Typ „Länge“ mit der Einheit „Meter“

Amount<Velocity> v = Amount.valueOf(0.01, METRES_PER_SECOND);

erzeugt eine Variable vom Typ „Geschwindigkeit“ mit der Einheit „Meter pro Sekunde“

Amount<Duration> t = Amount.valueOf(1.0, MICRO(SECOND));

erzeugt eine Variable vom Typ „Zeit“ mit der Einheit „Mikrosekunde“

Amount<Length> x = Amount.valueOf(100, NonSI.INCH);

erzeugt eine Variable vom Typ „Länge“ mit der Einheit „Inch“

Amount<Mass> m = Amount.valueOf("12 GeV").to(KILOGRAM);

erzeugt eine Variable vom Typ „Masse“ mit der Einheit Gigaelektronenvolt und wandelt den Wert in Kilogramm um

Amount<ElectricResistance> R1 = Amount.valueOf(100, 1, OHM);

erzeugt eine Variable vom Typ „Elektrischer Widerstand“ mit der Einheit „Ohm“

Amount<ElectricPotential> U0 = Amount.valueOf(28, 0.01, VOLT);

erzeugt eine Variable vom Typ „Elektrisches Potenzial“ mit der Einheit „Volt“

Variable<Complex> varX = new Variable.Local<Complex>("x");

erzeugt eine lokale Variable, die für komplexe Zahlen benutzt werden kann

Tabelle 1: Beispiele mit JScience

Fixe versus flexible Lösung

Ein Programm, in dem der User nichts einstellt, muss bei zukünftigen Änderungen mühevoll angepasst werden. Um den Code flexibler zu gestalten, sollte man den User dazu auffordern, die nötigen Eingaben vorzunehmen (Listing 3).

Listing 3

public class Random { public static void main (String[] args) { int min = 0; int max = 0; double randomNumber = getRandomDoubleBetweenRange(10,50); System.out.println("Die Zufallszahl ist: "+Math.round(randomNumber)); Scanner input = new Scanner(System.in); System.out.print("Um eine Zufallszahl zu generieren, gib bitte die kleinste Zahl ein: "); min = input.nextInt(); System.out.print("Gib bitte die größte Zahl ein: "); max = input.nextInt(); double randomNumber2 = getRandomDoubleBetweenRange(min,max); System.out.println("Die Zufallszahl lautet: "+Math.round(randomNumber2)); input.close(); } public static double getRandomDoubleBetw...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang