Blöde Frage - "ab wann" verwendet man Klassen?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
xoechz
User
Beiträge: 8
Registriert: Dienstag 6. Oktober 2020, 21:58

Hallo Leute!

Angenommen, ich schreibe ein kleines Skript, welches die Quadratwurzel einer eingegebenen Zahl berechnet.

Jetzt könnte ich natürlich eine Klasse für Zahlen definieren, in dieser ein Objekt erstellen, welches meiner eigegeben Zahl entspricht, dann eine Methode Quadratwurzel berechenen erstellen, und diese auf mein Objekt anwenden. Also das Grundkonzept der OOP.

Aber meiner Meinung nach ist das doch in diesem Fall totaler Overkill, oder?

Meine Frage also:
Gibt es so etwas wie allgemeine Regeln, ab welcher Komplexiät einer Aufgabe man Klassen, Objekte und Methoden erstellt, also OOP anwendet? Oder wann man "nur" eine oder mehrere Funktionen erstellt, oder was auch immer.

Oder liegt das immer im Ermessen des Programmierers?
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Das hat nicht mit der Komplexität zu tun. Es gibt auch Programmiersprachen (zum Beispiel Java) die einen zwingen _alles_ in Klassen zu stecken. Ich finde das nicht zielführend.
Eine Klasse wird dann benötigt, wenn sie tatsächlich ein Objekt abbilden kann und soll. Wenn die Klasse als reiner "Container" für Funktionen benutzt wird, dann ist das keine Klasse.
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@xoechz: In Objekten fasst man zusammengehörende Daten und darauf operierende Funktionen zu einem Wert zusammen. Das würde ich als Grundkonzept von OOP bezeichnen. Es gibt dann Programmiersprachen die Klassen als Konzept haben um sozusagen Vorlagen für Objekte zu beschreiben. Klassen gehören nicht zwingend zu OOP — es gibt objektorientierte Programmiersprachen ohne Klassen. Bekanntestes Beispiel wäre JavaScript wo es bis vor 5 Jahren Klassen noch nicht gab, aber trotzdem zwei Wege objektorientiert zu programmieren: prototypbasiert, und funktional. Andere Beispiele für solche Sprachen wären Io oder Self.

Eine Klasse für Zahlen definieren ist unnötig, denn die gibt es bereits zu genüge. Angefangen mit den eingebauten `int` und `float`, über `fractions.Fraction` und `decimal.Decimal` in der Standardbibliothek, zu den diversen Zahltypen beispielsweise im Numpy-Package oder im Sympy-Package.

Ob die Berechnung der Quadratwurzel eine Methode auf Zahlobjekten sein sollte ist nicht abschliessend geklärt. Es gibt Sprachen da ist das eine Methode auf Zahlobjekten und es gibt welche da ist das eine Funktion, oder falls die Sprache keine Funktionen bietet, eine statische ”Methode”.

In welcher Sprache man programmiert ist also auch nicht ganz unwichtig für diese Frage, denn wenn Deine Klasse in Python nur von `float` erbt um da eine `sqrt()`-Methode zu definieren, die nichts anderes tut als `math.sqrt()` aufzurufen, dann hast Du letztendlich nichts gewonnen und nur Code geschrieben der das Programm komplexer macht als es sein müsste. Und in Io brauchst Du keine Klasse weil `sqrt()` dort bereits eine Methode von `Number` ist.

Je nach Programmiersprache und Konvention ist es auch möglich und ”erlaubt” vorhandene Objekte/Klassen um Methoden zu erweitern. Falls es dort also keine Wurzelmethode auf Zahlen gäbe, könnte man sich die definieren. Beispiel JavaScript hat eine `Math.sqrt()`-Funktion aber keine `sqrt()`-Methode auf Zahlen. Kann man aber nachrüsten:

Code: Alles auswählen

$ node
> 25 .sqrt()
TypeError: 25.sqrt is not a function
> Number.prototype.sqrt = function() { return Math.sqrt(this); }
[Function]
> 25 .sqrt()
5
Es liegt letztlich im ermessen des Programmierers. Aber es gibt „best practices“ und eine sehr einfache und universelle, die nicht nur für OOP gilt, lautet, das man es einfach halten sollte. Also nicht komplexer als nötig.

In Python halte ich das so, dass Funktionen viel machen können. Und Klassen dann ins Spiel kommen wenn mehrere Werte sinnvoll zu einem Objekt zusammengefasst werden können, weil es sonst zu viele Einzelwerte gibt die man bei Funktionsaufrufen umher reichen muss. Reine Datenklassen, also ohne zusätzliche Methoden sind okay. Oft findet man dann aber auch Funktionalität, die man sinnvoll auf so einer Klasse unterbringen kann.

Nur einen einzelnen Wert als Zustand einer Klasse zu haben ist oft nicht sinnvoll, also beispielsweise wenn man da bloss eine Zahl hat um eine `sqrt()`-Methode zur Verfügung zu stellen. Das heisst nicht, das es nicht auch manchmal sinnvoll sein kann nur einen einzigen Wert in den Objekten zu haben. Das hat man oft, wenn man über diesen Wert mit etwas ”externen” interagiert. Also beispielsweise eine Verbindung (Seriell, Socket, Zeiger, …) die nur sehr primitive, allgemeine Operationen bietet, und man da spezialisiertere Operationen zur Verfügung stellen will.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten