i

Übungsprojekt - Autobewertung

Gebrauchtes Auto[1]

Jedes Jahr werden in Deutschland mehrere hundert Tausend Autos gekauft und verkauft. Bei Gebrauchtwagen stellt sich dann immer die Frage: Wie viel ist ein Auto noch wert? Egal ob man selbst ein Auto kaufen oder verkaufen möchte, eine möglichst genaue Abschätzung des Wertes ist nicht ganz einfach, aber natürlich sehr wichtig. Man stellt sich dann Fragen wie:

  • Wie viel ist mein Auto noch wert?
  • Wenn ich 5000,- Euro zur Verfügung habe, was für ein Auto bekomme ich dafür?
  • Sollte ich mein Auto noch behalten, da der Wertverlust jetzt besonders hoch ist?
  • ...

Ziel ist es ein Modell eines Autos zu programmieren, mit dem sich diese und ähnliche Fragen beantworten lassen.

Ein mathematisches Modell für ein Auto finden

Um die Preisentwicklung von Autos mathematisch zu modellieren, kann man z.B. die Inseratspreise von Autos sammeln und auswerten. Betrachtet man sich die Preise z.B. für einen VW Golf ergibt sich folgendes Bild:

Preisentwicklung Golf in Abhängigkeit vom Alter[2]
Preisentwicklung Golf in Abhängigkeit vom Kilometerstand[3]

Ob man nun das Alter, die Laufleistung, die Zahl der Vorbesitzer oder andere Faktoren betrachtet: Der Marktwert verringert sich immer, wenn einer dieser Faktoren wächst. Dabei ist der Wertverlust am Anfang eher hoch, wird dann aber immer kleiner. Ob ein Auto 0km oder 10.000km gefahren ist macht einen großen Unterschied im Preis aus, während der Wertverlust zwischen 240.000km oder 250.000km Fahrleistung beinahe vernachlässigbar ist. Analog verhält es sich mit dem Alter oder der Zahl der Vorbesitzer. Für den Anfang reicht es, das Alter des Autos zu berücksichtigen. Wenn man den Restwert eines Autos in Abhängigkeit vom Neupreis und dem Alter berechnen möchte, benötigt man also eine Funktion, die ungefähr folgendermaßen aussieht:
Funktionsplot

Aufgabe 1

Finde eine Funktion f, die folgenden Zusammenhang näherungsweise erfüllt:

restwert = neupreis * f(alter)

Beachte: Die Funktion schneidet die y-Achse. (Warum muss das so sein?)
Tipp: Du kannst Deine Ideen auch mit einem Funktionsplotter oder Geogebra testen.

Ein objektorientiertes Modell für ein Auto finden

Um ein Auto im Computer darstellen zu können, müssen wir (z.B.) ein objektorientiertes Modell dazu finden. Dazu müssen wir uns fragen:

  • Welche Eigenschaften sind für ein Auto relevant?
  • Welche Fähigkeiten muss ein Auto besitzen?

Oder anders ausgedrückt:

  • Welche Attribute muss ein Auto besitzen?
  • Welche Methoden muss ein Auto besitzen?

Wesentliche Eigenschaften sind sicher: Der Neupreis und das Alter eines Autos. Wesentliche Fähigkeiten sind sicher: "Berechne den aktuellen Marktwert", "Berechne den Wertverlust" oder "Berechne den zu erwartenden Händler-Einkaufspreis". Letzterer liegt sicher unter dem Marktwert, da der Händler an dem Auto ja auch verdienen möchte.

Ein Klassendiagramm könnte also folgendermaßen aussehen:

Methoden, die Werte berechnen und zurück geben, werden üblicherweise mit get... begonnen. In der UML werden Kommazahlen mit dem Datentyp Real bezeichnet. In Java gibt es diesen Datentyp nicht, hier wird double benutzt.

Nähere Informationen zu double

Es gibt in Java mehrere Datentypen für Kommazahlen, die sich in ihrer Genauigkeit unterscheiden. Der Datentyp double ist der Datentyp, der meistens für Kommazahlen benutzt wird. Man spricht hier von "doppelter Genauigkeit", da er doppelt so viel Speicherplatz benötigt wie der Datentyp float.

Aufgabe 2

Betrachte die verwendeten Datentypen und die Signatur der Methoden. Begründe die Auswahl. Welche Alternativen hätte es noch gegeben? Warum benötigen die Methoden hier keine Parameter, z.B. für das Alter?

Ein Automodell objektorientiert implementieren

Wie man das Klassendiagramm mit Hilfe von BlueJ und Java umsetzt, zeigt Dir der Screencast:

Aufgabe 3

  • Probiere das selbst aus. Du kannst den Screencast jederzeit pausieren oder zurückspulen.
  • Erstelle auch ein Auto-Objekt und rufe die bisher implementierten Methoden auf. Erkläre die Ergebnisse.
  • Welche Bedeutung hat das return ?
  • Was bewirkt der Ausdruck Math.pow(0.87, alter)?
  • Was passiert bei der Ausführung der Zeile return neupreis - getMarktwert(); genau?
  • Ergänze die noch fehlende Methode double getHaendlerEK(). Der Händler-Einkaufspreis soll sich aus 80% des Marktwertes ergeben.

Objekte initialisieren

Das Auto besitzt noch nicht das gewünschte Verhalten. Es muss möglich sein die Attribute, z.B. bei der Erzeugung des Objektes, mit entsprechenden Werten zu belegen. Dies erreicht man durch Einführung eines Konstruktors. Man kann diesen auch im Klassendiagramm darstellen. Dort ordnet man ihn dann bei den Methoden ein. In manchen Sprachen spricht man auch von der "Konstruktormethode". In Java ist das eher unüblich, da es (unabhänig von Java) einige Unterschiede zwischen gewöhnlichen Methoden und Konstruktoren gibt.

Im Quellcode wird der Konstruktor - üblicherweise zwischen Attributen und Methoden - folgendermaßen ergänzt:

Konstruktor - Code

Aufgabe 4

  • Füge den Konstruktor ein und teste Dein Programm.
  • Beschreibe Gemeinsamkeiten und Unterschiede zwischen Konstruktoren und Methoden.

Attributwerte verändern

Wirklich nützlich wird das Programm erst, wenn man auch mit den Attributwerten experimentieren kann, und testen kann wie sich z.B. eine Veränderung des Alters auf den Wert des Autos auswirkt.

Wenn Du den Objektinspektor aufrufst, wirst Du allerdings merken, dass Du dort den Wert der Attribute nur sehen, aber nicht verändern kannst. Normalerweise greift man auf Attribute nur indirekt über Methoden zu. Warum das so ist, wirst Du im nächsten Projekt genauer erfahren. Du benötigst also eine Methode, die nichts anderes macht, als den Attributwert für das Attribut alter zu verändern. Der folgende Screencast demonstriert dies:

Das Klassendiagramm hat nun folgende Gestalt:

Aufgabe 5

Probiere das selbst aus.

Aufgabe 6 - Erweiterung des Klassendiagramms

Ergänze ein Attribut für den Kilometerstand und eine entsprechende set-Methode im Klassendiagramm.

Aufgabe 7 - Erweiterung der Implementierung

Ergänze die Implementierung um den Kilometerstand und eine entsprechende set-Methode. Der Marktwert soll außer dem Alter jetzt auch noch den Kilometerstand berücksichtigen. Ergänze dazu analog zum Faktor für das Alter einen weiteren Faktor zum Kilometerstand. Tipp: Es fällt leichter eine geeignete Basis zu finden, wenn man festlegt, dass der Kilometerstand in "Tausend Kilometer" angegeben wird.

Aufgabe 8 - Eigene Ideen

Überlege wie sich die Modellierung verbessern lässt. Ergänze das Klassendiagramm und setze die Ideen im Programm um.

Grenzen von Modellen

Wir haben oben Modelle entwickelt, um den Wert eines Autos zu berechnen. Modelle vereinfachen dabei sehr häufig die zu beschreibende Realität.

Aufgabe 9

Welche Grenzen hat das bisher benutzte Modell? Wie könnte man das Modell verbessern?

Quellen

Suche

v
7.1.1.2.5
inf-schule.de/oop/java/klassen/aufbau/autobewertung
inf-schule.de/7.1.1.2.5
inf-schule.de/@/page/NewcoLX77uFsdXrz

Rückmeldung geben