Ganane: OOP, wozu? (Fragen zu Java/Classen etc.)

Beitrag lesen

Hallo,

seit einigen tagen befasse ich mich mit Java (wie andere auch wie ich sehe).
Ich begreife eigentlich die ganze OOP nicht wirklich, wozu soll es denn gut sein, dass wenn ich eine Klasse erstellt habe davon eine Instanz zu machen?
Wie kann man die OOP erklären damit es eine Newbie ohne erfahrung im OOP bereich verstehen kann?

Wieso muss in Java die Datei genau so heißen wie die Class?
Wie wird aus meiner kleinen Klasse -im Moment nur ein kleiner Calculator- eine wirkiche Anwendung die auf jedem Rechner -mit Installiertem Java- laufen kann?

Für deinen Taschenrechner ist das gar nicht sinnvoll. Ich versuche es dir an einem Beispiel zu erklären.

Stell dir ein beliebiges Strategiespiel vor. Zum Beispiel C&C oder Age of Empires oder die Siedler usw.
In diesen Spielen Werden Einheiten produziert. Wie könnte man das produzieren verschiedener Einheiten programmiertechnisch Umsetzen? Entweder mit ganz vielen Arrays, jedes Array steht dann für eine Einheit und enthält Werte für die Kampfstärke, die Verteidigung usw.
Besser ist es mit OOP: Die Syntax ist angepasst, jedes Objekt hat fest definierte Eigenschaften und Methoden. Bei einem Array müsstest du immer aufpassen, dass du auch die richtigen Methoden anwendest. Du brauchst z.B. eine Methode "Panzerangriff", wenn ein Panzer schießt, eine Methode "Gewehrangriff", wenn ein Soldat schießt usw. Bei OOP brauchst du immer nur eine Methode, nämlich "Angriff". Und das tolle ist: je nachdem, welches Objekt diese Methode, tut die Methode unterschiedliche Dinge. Das spart Schreibarbeit und vermeidet Fehler.

Ein weiterer großer Vorteil ist die Vererbbarkeit. Du müsstest ja jeweils ein Array für Kampfpanzer, für Spähpanzer, für Transportpanzer usw haben. Jedes mal müsstest du in jedem Array alle Werte notieren, also so:

Kampfpanzer
{
   ["stärke"] = ...;
   ["defensive"] = ...;
   ["geschwindigkeit"] =...;
   ["sichtweite"] = ...;
   ["ketten"] = ...;
}

Spähpanzer
{
   ["stärke"] = ...;
   ["defensive"] = ...;
   ["geschwindigkeit"] = ...;
   ["sichtweite"] = ...;
   ["räder"] = ...;
}

Wie du erkennst, haben Kampfpanzer und Spähpanzer fast die gleichen Eigenschaften (nur unterschiedliche Werte), _aber_ der Spähpanzer hat Räder, der Kampfpanzer hat Ketten. Nun, wenn du das ganze für alle Panzer-, Einheiten-, Gebäude-, Untergründetypen aufschreiben musst, wirst du ja ganz verrückt. Leichter geht es mit OOP, nämlich so:

Panzer
{
   ["stärke"] = ...;
   ["defensive"] = ...;
   ["geschwindigkeit"] =...;
   ["sichtweite"] = ...;
}

Kampfpanzer[erbt von Panzer]
{
   ["ketten"] = ...;
}

Spähpanzer[erbt von Panzer]
{
   ["räder"] = ...;
}

Das bedeutet, dass Kampfpanzer nicht nur die Eigenschaft "ketten" hat, sondern auch alle Eigenschaften von der Klasse Panzer. Jetzt stell dir vor, dass es nicht nur 2 verschiedene Panzer sondern dutzende gibt. Und die haben alle noch viel mehr Eigenschaften, und du siehst: du sparst eine Menge Schreibarbeit. Aber nicht nur das: stell dir mal vor, du willst, dass alle deine Panzer auch noch die Eigenschaft "Treibstoffverbrauch" bekommen sollen. Im Fall mit den Arrays müsstest du jedes mal wieder "Treibstoffverbrauch" dazukopieren. Bei OOP musst einfach nur ein einziges mal bei Panzer den Treibstoffverbrauch notieren und alle anderen Panzer bekommen diese Eigenschaft auch, weil sie ja alle Eigenschaften von Panzer erben. Das Programm ist also viel leichter wartbar.

Das ist nur ein kleiner Einblick, es gibt noch viel mehr Vorteile. Die merkst du aber erst, wenn du wirklich an größeren Projekten arbeitest. Bei einem kleinen Taschenrechner bringt dir OOP eigentlich nichts.

Leider wird oft empfohlen, sofort mit OOP anzufangen. Ich finde man sollte lieber erst eine einfache Programmiersprache lernen, die kein OOP voraussetzt. Wenn man dann nämlich anfängt auf die oben genannten Probleme zu stoßen, erst _dann_ versteht man so richtig, warum es überhaupt OOP gibt und wie schlimm es ohne OOP ist.

Ich hoffe ich konnte dir ein bisschen helfen. Gib nicht gleich auf, wenn du etwas nicht verstehst. Das meiste braucht ein bisschen Zeit und irgendwann wirst du auf ein Problem stoßen und dir sagen "Aha, _deswegen_ braucht man das also!".

Gruß,
Ganane