Seite 1 von 1

Wann ist OOP sinnvoll ?

Verfasst: Donnerstag 9. März 2006, 17:24
von prof_weirdo
Hallo ! Ich bin neu hier im Forum und noch ein relativer Python- Anfänger.
Nachdem ich mich mit der Kernsprache beschäftigt habe wende ich mich gerade der OOP in Python zu.
Bei relativ kleinen, wenig komplexen Programmen fällt es mir auch noch relativ leicht da den Überblick zu bekommen, ganz anders sieht es da aber schon bei komplexeren Geschichten aus.

Mich würde mal interessieren was die erfahrenen Pythonprogrammierer hier im Forum zu der Frage sagen in welchen Fällen OOP mit Python wirklich angebracht ist, in welchen Fällen sie der prozeduralen Programmierung vorzuziehen ist. Mir persönlich erscheint sie im Moment noch unheimlich kompliziert und vor allem Zeitintensiv anzuwenden.

Verfasst: Donnerstag 9. März 2006, 17:58
von jens
Hi, neuer... ;)

Also ich denke ich bin ehr einer der prozeduralen Programmiert... d.h. aber nicht das ich kein OOP nutzte... Das macht man IMHO mit Python automatisch, schließlich ist fast alles in Python ein Objekt ;)

Meist sind die Beispiele in Büchern und Tutorial nicht so super toll...

Ein Tipp: Such im Forum mal nach "OOP" ;)

Verfasst: Donnerstag 9. März 2006, 18:03
von mitsuhiko
Eigentlich immer. Zumindest sind meine Programme und Libs eigentlich rein Objekt Orientiert. :wink:

Verfasst: Donnerstag 9. März 2006, 18:07
von prof_weirdo
Hi Jens !

Danke für die Antwort.

Habe mich auch schon über die Suchfunktion umgesehen. Ich habe mich halt gefragt ob OOP nicht für kleine Soloprojekte ein wenig "Overkill" ist. Mir scheint da zumindest zum momentanen Zeitpunkt der Aufwand zur Lösung eines Problems wesentlich grösser als auf dem prozeduralen Weg, aber vielleicht liegt das ja auch an der Mangelnden Übung. Vermutlich ist das auch individuell verschieden.

Ich werde mich aber auf jeden Fall weiterhin mit der OOP beschäftigen, gehöre eben nur nicht zu den Leuten die ohne zu hinterfragen alles benutzen wollen nur weil es eben da ist oder weil "man" es sollte.

Verfasst: Donnerstag 9. März 2006, 18:12
von jens
Ich denke es kommt halt auf den Fall an und ob man schnell was spezielles machen will oder eine allgemeinere Lösung...

Generell ist es aber so, das ich persönlich auch gern für kleinere Sachen Klassen baue... Nicht weil es zwingend notwendig ist (weil man Instanzen benötigt), sondern weil man damit ganz gut Themen kapseln kann. Außerdem kann man innerhalb dieser Klasse mit globale Variablen (self.variable) arbeiten kann. Das gefällt mir einfach... Hat das jetzt was mit OOP zu tun? Ich weiß nicht...

Mir ist es meist garnicht bewust, das ich nun OOP benutzte... Wahrscheinlich würde es mir erst dann auffallen, wenn ich versuche in anderen Sprachen, die kein OOP können, das selbe zu Lösen...

Lange rede kurzer Sinn: Python ist einfach cool :lol:

Verfasst: Donnerstag 9. März 2006, 18:21
von prof_weirdo
Na gut, wahrscheinlich wirds mir auch irgendwann gefallen wenn ich das ganze erstmal ein wenig verinnerlicht habe, empfinde es im moment nunmal noch eher als verwirrend... habe die Kernsprache und Konzepte wie Funktionsdefinitionen eigentlich ohne grössere Mühe verstehen können, aber das OOP sieht mir nach etwas mehr Arbeit aus... aber es ist sicher die Mühe Wert.

Python gefällt mir auch super, hatte davor Standard C++ gelernt, dagegen ist dies hier der Himmel :wink: .

Verfasst: Donnerstag 9. März 2006, 19:21
von Kompottkin
Außerdem kann man innerhalb dieser Klasse mit globale Variablen (self.variable) arbeiten kann. Das gefällt mir einfach... Hat das jetzt was mit OOP zu tun? Ich weiß nicht...
Das kommt dem Kern der Objektorientierung schon sehr nahe.

Objektorientierte Programmierung ist nämlich genau dann sinnvoll, wenn es darum geht, ein System zu modellieren, das aus mehreren mehr oder weniger unabhängigen Objekten besteht (daher der Name), die miteinander kommunizieren. Der entscheidende Punkt dabei ist, daß jedes Objekt über einen eigenen lokalen Zustand verfügt.

Möchte man hingegen ein System modellieren, das vor allem über seinen globalen Zustand definiert wird (d.h. die Teile des Systems, soweit man überhaupt welche benennen kann, sind in hohem Maße voneinander abhängig), ist objektorientierte Programmierung nicht angebracht. In diesem Fall eignen sich rein prozedurale und funktionale Programmierung besser.

Sehr kleine Programme und Skripte bestehen in der Regel nicht aus klar trennbaren, unabhängigen Komponenten. OOP ist in solchen Fällen einfach Zeitverschwendung. Andererseits muß man natürlich bedenken, daß viele kleine Skripte irgendwann zu großen Systemen heranwachsen. Es ist daher auch nicht sinnvoll, sich einen eventuell vorhandenen Weg hin zur Objektorientierung künstlich zu verbauen (denn dort, wo sie sinnvoll ist, erhöht die objektiorientierte Programmierung die Wartbarkeit eines Systems enorm). In anderen Worten: bevor man die Regeln bricht, sollte man sie gut kennen :)

Verfasst: Donnerstag 9. März 2006, 19:27
von jens
Ab damit in's Wiki! Vielleicht unter http://wiki.python.de/Tutorial mit einem neuen Unterpunkt OOP? Man könnte auch die Seiten von dookie übernehmen und vervollständigen: http://de.wikibooks.org/wiki/Python-Pro ... nd_Klassen

Verfasst: Donnerstag 9. März 2006, 19:57
von Mad-Marty
Das hängt vom jeweiligen problem ab.

Brauchst du gemeingültige funktionen, ist OO sinnlos.

Hast du mehrere geräte o.ä. desselben typs ist OO praktisch ein muss.


Funktion sinnvoll :

Code: Alles auswählen

def calc_blah(a,b,c):
    return a *c /(b*a)**c

OO zum beispiel wäre sinnvoll wenn du viele arten von bällen hast und diese gleich behandeln willst:

Code: Alles auswählen

baelle = [ball('federball'), ball('tennisball'), ball('baseball'), ball('fussball')]

for ball in  baelle:
    ball.setcolor("blue")
    ball.throw()

Verfasst: Donnerstag 9. März 2006, 23:53
von BlackJack
Wenn man von einer prozeduralen Sprache kommt, die so etwas wie structs in C oder RECORDs in Pascal kennt, dann ergibt sich "OOP" oft recht natürlich, wenn man eine Klasse als so eine struct/RECORD Definition sieht und alle Funktionen die hauptsächlich den Inhalt der Struktur ändern als Methoden schreibt.

Vererbung kann man sich dann immer noch für später aufheben, aber dieses Bündeln von zusammengehörigen Daten und Funktionen/Methoden ist ein erster Schritt, der gar nicht so verschieden vom prozeduralen Blickwinkel ist.

Umgekehrt kann man so auch "quasi-objektorientierte", d.h. recht sauber aufgebaute Programme in prozeduralen Sprachen schreiben. Also die Daten in Strukturen packen und dann Funktionen schreiben die eine Referenz auf so eine Struktur als ersten Parameter erwarten, was in Python das `self` bei Methoden ist.

Verfasst: Freitag 10. März 2006, 10:53
von prof_weirdo
Erstmal danke an euch alle für eure Antworten die mir auf jeden Fall wertvolle Denkanstöße und Blickwinkel geliefert haben.
Habe mich gestern noch nach geeigneter Literatur/ Tutorials umgesehen und werde meine Bemühungen fortsetzen.

Nun ja, werdet wohl noch öfters mal was von mir hören, auch wenn ich es im Moment noch vorziehe in erster Linie zu lesen...