OOP, wie gehts richtig? (Beispiel von meinem Prof)

h4nk

Mitglied
Hallo Leute, ich versuche gerade die Gedanken meines Profs für Programmierung nachzuvollziehen.

Es geht konkret darum, einen Rechner zu implementieren, der in der Lage ist, Brüche zu addieren, multiplizieren, dividieren und subtrahieren. Das ganze schön objektorientiert.

Mein Ansatz war folgender Klassenaufbau:

1. Bruch:
- Zähler und Nenner als Variablen mit Getter
- Konstruktor, in dem direkt mithilfe des Größten gemeinsamen Teilers gekürzt wird

2. Rechner:
- Methoden zum Berechnen, alle kriegen als Argument zwei Brüche übergeben und geben einen "Ergebnisbruch" zurück

3. Starter:
- main-Methode, in der Rechner-, Eingabe- und Ausgabeobjekte instanziiert werden und die Methoden zum Einlesen, Rechnen und Ausgeben aufgerufen werden

4. Eingabe/Ausgabe:

- Methode zum Einlesen von Brüchen, zum einlesen der Operation und eine weitere zum Ausgeben. Letztere bekommt den Ergebnisbruch übergeben.


Mein Prof hat allerdings einen anderen Ansatz:

1. Input/Output:
- Eine Methode zur Eingabe eines Bruchs, eine zweite für die Operation
2. Bruchautomat:
- main-Methode, User wird aufgefordert,
3. Bruch:
- Hier ist das, was mich verwirrt: Die Klasse Bruch besitzt alle Methoden zum Berechnen selbst. Jede Methode wird also von einem Bruchobjekt aufgerufen und ihr wird ein zweiter übergeben. Die Methode addiert dann zum Beispiel den übergebenen Bruch zum Bruchobjekt, von dem die Methode aufgerufen wird.
- Zähler- und Nennervariable und getter+setter

Wie sieht denn jetzt eine Musterlösung aus, ich dachte es ist nicht OOP, wenn die Datenklasse solche Methoden hat? Ich kann morgen auch gerne Codebeispiele posten.

Vielen Dank 🙂
 
ich würde sagen, dass Bruch hier kein reines Datenobjekt ist, sondern eben ein Objekt mit implementierter Logik. Woanders hätte ich die Logik jetzt auch nicht hingepackt, denn man addiert zwei Brüche ja anders als zwei ganze Zahlen und da gehört die Logik eben zu der Klasse Bruch dazu.
 
ich würde sagen, dass Bruch hier kein reines Datenobjekt ist, sondern eben ein Objekt mit implementierter Logik. Woanders hätte ich die Logik jetzt auch nicht hingepackt, denn man addiert zwei Brüche ja anders als zwei ganze Zahlen und da gehört die Logik eben zu der Klasse Bruch dazu.
Sehe ich eigentlich auch so, denn dann könnte man die Brüche z.B. so verwenden:
Java:
Bruch a = ...;
Bruch b = ...;
Bruch c = a.add(b);

Ansonsten wäre es hilfreich die exakte Aufgabenstellung zu kennen.
 
Danke euch, anscheinend macht es tatsächlich mehr Sinn, wie mein Prof es gemacht hat. Woran erkenne ich, wann die Logik mit zu einer Klasse gehört und wann sie ausgelagert werden sollte?

... man addiert zwei Brüche ja anders als zwei ganze Zahlen und da gehört die Logik eben zu der Klasse Bruch dazu.

Wo genau liegt hier der Unterschied zu ganzen Zahlen, schließlich sind die Operationen doch im Endeffekt das Gleiche, das bei Brüchen halt noch ein paar Sachen mehr beachtet werden müssen.
 
Finde ich immer noch nicht ganz klar 😀 Denn so könnte man ja sagen, dass bei allen Sachen, bei denen es über simple Operationen ganzer Zahlen hinausgeht, die Rechnungen in der Klasse gemacht werden. Soll heißen: dann müsste es ja auch bei Vektoren, Matrizen usw das gleiche sein, oder?

Einen Satz darüber welche Kriterien erfüllt sein müssen, oder ein Link zu einem Artikel den ich mir durchlesen kann, wäre klasse, denn so glaube ich nicht, dass ich es in Zukunft reproduzieren kann (außer bei den hier genannten Sachen).
 
So ist es ja auch. Kommt natürllch auch auf die Anwendung an.
In der Schule/Uni muss das allerdings nicht so sein, da geht meist um das "Wie wird das implementiert" und vernachlässigt dann auch mal gutes Design. Da geht's dann rein um die Funktion.

Prinzipiell musst du dich nur Fragen, was dein Objekt alles können muss und das schöne daran ist, dass sich diese Frage sehr realitätsnah beantworten lässt.
Eine Formel dazu gibt es nicht ..
 

Zurück
Oben