Mittwoch, 3. Dezember 2014

 

OOP in Java, Beispiel Geld/Währungstabelle (POS1: 2BHIF)

Laut Wikipedia kann Objektorientierte Programmierung definiert werden als:

Die objektorientierte Programmierung (kurz OOP) ist ein auf dem Konzept der Objektorientierung basierendes Programmierparadigma. Die Grundidee besteht darin, die Architektur einer Software an den Grundstrukturen desjenigen Bereichs der Wirklichkeit auszurichten, der die gegebene Anwendung betrifft. Ein Modell dieser Strukturen wird in der Entwurfsphase aufgestellt. Es enthält Informationen über die auftretenden Objekte und deren Abstraktionen, ihre Typen. Die Umsetzung dieser Denkweise erfordert die Einführung verschiedener Konzepte, insbesondere Klassen, Vererbung, Polymorphie und spätes Binden.

Alan Kay, der Erfinder der Programmiersprache Smalltalk und des Begriffs „object oriented“, definierte ihn im Kontext von Smalltalk folgendermaßen:

1. Everything is an object, 2. Objects communicate by sending and receiving messages (in terms of objects), 3. Objects have their own memory (in terms of objects), 4. Every object is an instance of a class (which must be an object), 5. The class holds the shared behavior for its instances (in the form of objects in a program list), 6. To eval a program list, control is passed to the first object and the remainder is treated as its message

„1. Alles ist ein Objekt, 2. Objekte kommunizieren durch das Senden und Empfangen von Nachrichten (welche aus Objekten bestehen), 3. Objekte haben ihren eigenen Speicher (strukturiert als Objekte), 4. Jedes Objekt ist Instanz einer Klasse (welche ein Objekt sein muss), 5. Die Klasse beinhaltet das Verhalten aller ihrer Instanzen (in der Form von Objekten in einer Programmliste), 6. Um eine Programmliste auszuführen, wird die Ausführungskontrolle dem ersten Objekt gegeben und das Verbleibende als dessen Nachricht behandelt“
– Alan Kay: The Early History of Smalltalk (1993)

Beispielanwendung

Anhand des folgenden Beispiels soll ein kurzer Einblick in die Objektorientierte Programmierung gegeben werden.

Es soll Geld implementiert werden. Da es in verschiedenen Ländern unterschiedliche Währungen gibt, muss unsere Klasse neben dem Betrag auch die Währung beinhalten. Um rechnen zu können wird noch eine Währungstabelle mitgespeichert.

Die Währungstabelle wechselkurs könnte natürlich auch wieder in eigenen Klassen/Objekten realisiert werden (im Java-Code ist das auch tatsächlich der Fall).

Die Attribute (Eigenschaften) sind alle öffentlich (public), da damit das Beispiel kürzer wird. Tatsächlich werden normalerweise die Attribute nach außen unsichtbar gemacht (private) und nur Methoden (Methoden-Aufrufe entsprechen Alan Kays "Nachrichten") öffentlich gemacht, um den Zugriff auf das Innere der Objekte zu verhinden (Information Hiding oder Datenkapselung).

Die Methode getEuro() liefert den auf Euro umgerechneten Geldbetrag.
Die Methode add(geld) addiert den Wert des Parameters geld zum Wert des aktuellen Objekts und erzeugt ein neues Objekt mit der Summe und liefert es als Returnwert zurück.

Der Konstruktor wird in diesem Klassendiagramm nicht angegeben. Durch ihn wird aber die Währung der Betrag festgelegt. Der Konstruktor wird ausgeführt, wenn ein Objekt erzeugt wird.

Die Umsetzung in Java:

In Java heißt die Referenz auf das aktuelle Objekt this. this wird nicht als Parameter deklariert (anders als in Python). Den Methoden fehlt ein this-Parameter (bzw. self in Python). Dieser Parameter existiert nur intern.
Dennoch kann man this beim Zugriff auf Attribute (und Methoden) angeben. Im folgenden Beispiel wird das auch gemacht.

Man muss this nur dann angeben, wenn es sonst zu Mehrdeutigkeiten käme (in unserem Beispiel beim Konstruktor, bi dem die Parameter genauso benannt sind wie die Attribute).

Der Kunstruktor heißt in Java immer so wie die Klasse, in unserem Fall Geld().

Die Währungstabelle wechselkurs wird als Array einer eigenen Klasse Wechselkurs realisiert. Zusätzlich benötigt man mangels Dictionary eine Methode, die zu einer gegebenen Währung den Kurs liefert: getKurs()

class Geld {
  final class Wechselkurs { // final nur für's scrapbook
    String waehrung;
    double kurs;

    public Wechselkurs(String waehrung, double kurs) {
      this.waehrung = waehrung;
      this.kurs = kurs;
    }
  }

  private Wechselkurs[] wechselkurs = { 
      new Wechselkurs("USD", 1.505),  // US-$ (1EUR sind 1.505 USD)
      new Wechselkurs("GBP", 0.908),  // Britische Pfund
      new Wechselkurs("EUR", 1.0),  
      new Wechselkurs("CHF", 1.509),  // Schweizer Franken
      new Wechselkurs("JPY", 130.582),// Japanische Yen
   };

  String waehrung;
  double betrag;

  public Geld(String waehrung, double betrag) {
    this.waehrung = waehrung;
    this.betrag = betrag;
  }

  public double getEuro() {
    return this.betrag / this.getKurs();
  }

  private double getKurs() {
    for (Wechselkurs kurs : this.wechselkurs) {
      if (kurs.waehrung.equals(this.waehrung)) {
        return kurs.kurs;
      }
    }
    return 0.0;
  }

  public Geld add(Geld geld) {
    double summeInEuro = this.getEuro() + geld.getEuro();
    Geld summe = new Geld(this.waehrung, summeInEuro * this.getKurs());
    return summe;
  }
}

/*** Testaufrufe ***/
Geld hotelrechnung = new Geld("EUR", 560);
Geld mietwagen = new Geld("USD", 760);
Geld summe = mietwagen.add(hotelrechnung);
System.out.printf("Summe: %s%.2f, %s%.2f\n", summe.waehrung, summe.betrag,
    "EUR", summe.getEuro());

Testausgabe:

Summe: USD1602,80, EUR1064,98

Scrapbook oop.jpage zum Download.

Labels: , , ,


Kommentare:

Kommentar veröffentlichen

Abonnieren Kommentare zum Post [Atom]





<< Startseite

This page is powered by Blogger. Isn't yours?

Abonnieren Posts [Atom]