OOP Übungen

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.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Hallo,

habe interessehalber mal nach OOP Übungen gesucht und man kommt meistens auf eine UNI Seite, in der sehr schwierige Aufgaben behandelt werden.

Gibt es eine Seite, mit der man OOP lernen kann oder würdet Ihr sogar so nett sein und mir Vorschläge geben?

Danke!
BlackJack

@Gary123456: Das Problem ist wahrscheinlich das OOP erst ab einer gewissen Komplexität wirklich etwas bringt, und es damit kaum sinvolle *einfache* Anwendungsbeispiele gibt, die nicht ziemlich an den Haaren herbeigezogen aussehen.

Wobei ich jetzt zwischen der grundlegenden Verwendung von Klassen zum Zusammenfassen von Daten und dazugehörigen Funktionen unterscheiden würde, und dem Verwenden von allen Möglichkeiten die man bei OOP normalerweise so zur Verfügung hat, wie Vererbung, statische Methoden und Klassenmethoden, und die ganzen Entwurfsmuster, und davon dann wiederum nur diejenigen die bei dynamischen Programmiersprachen Sinn machen.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Naja es gibt ja schon solche Textaufgaben, womit man da eine Klasse bauen kann. Wie kann ich denn sonst eine Klasse zu programmieren üben? :D
BlackJack

@Gary123456: Es gibt einen Unterschied zwischen den Quelltext für eine Klasse und die ganzen OOP-Konstrukte zu schreiben und das tatsächlich sinnvoll einzusetzen. Dafür braucht man in der Regel ein komplexeres Problem, etwas was deutlich umfangreicher ist als die üblichen Übungsaufgaben. Eher schon ein kleines bis mittelgrosses Projekt.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Aber wie soll man sonst OOP üben? Nur mit Hilfe großer Projekte? :)
BlackJack

@Gary123456: IMHO Ja. Mit Klassen kann man ja schon bei kleinen Projekten anfangen. Die anderen Sachen ergeben sich dann. Wenn man zum Beispiel mehrere Klassen mit der gleichen Schnittstelle hat und merkt, dass man Code für eine Methode in mehreren dieser Klassen wiederholt, ist es Zeit den gemeinsamen Code in eine Basisklasse heraus zu ziehen. Bevor man so eine Situation nicht hat, dass man etwas in mehreren Klassen wiederverwenden kann, macht es wenig Sinn Vererbung zu praktizieren, denn genau das ist die Aufgabe von Vererbung.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@BlackJack: Definiere "groß" :D Imho kann man sich Prinzipien auch bei kleineren Beispielen klar machen - man schießt dann zwar ggf. mit Kanonen auf Spatzen und betreibt Over Engineering, aber beim Erlernen ist das doch häufiger der Fall.

Zugegebener Maßen ist Vererbung tatsächlich ein eher schlechtes Beispiel, aber es gilt ja eh "favour composition over inheritance" :mrgreen:

Wichtig ist doch nur, dass es ein Projekt ist, bei dem man wirklich gleichartige Objekte und einige "Klassen" von Objekten in engem Zusammenhang modellieren kann. Da fallen einem sofort Sachen wie kleine RPG-Spielchen ein, oder durchaus auch Dinge wie eine Notiz- / Taskverwaltung, das Adressbuch o.ä.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
xeike
User
Beiträge: 83
Registriert: Donnerstag 28. Februar 2013, 09:58

Gary123456 hat geschrieben:Gibt es eine Seite, mit der man OOP lernen kann oder würdet Ihr sogar so nett sein und mir Vorschläge geben?
Wie wäre es mit einem Programm, das dich an Geburtstage erinnert? Die Personen (Name, Geburtsdatum, ...) kannst du in eine Klasse packen. Die Klasse "Familie" enthält dann zusätzlich die Anschrift, erbt aber sonst von Personen. Die Klasse "Personen" kann man für Tiere gebrauchen, also sollte man sie vielleicht lieber "Lebewesen" nennen.

Xe
Benutzeravatar
pillmuncher
User
Beiträge: 1530
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

xeike hat geschrieben:Personen (Name, Geburtsdatum, ...) kannst du in eine Klasse packen. Die Klasse "Familie" enthält dann zusätzlich die Anschrift, erbt aber sonst von Personen.
Probieren wir das mal aus:

Code: Alles auswählen

class Person:
    def __init__(self, fist_name, last_name, birthday):
        self.first_name = first_name
        self.last_name = last_name
        self.birthday = birthday

class Family(Person):
    def __init__(self, fist_name, last_name, birthday, address):
        Person.__init__(self, fist_name, last_name, birthday):
        self.address = address

f = Family('John', 'Doe', '12.12.1980', 'Irgendeinestr. 7, 12345 Irgendwohausen')
Jetzt haben wir eine Familie, die John Doe heißt und am 12.12.1980 geboren wurde. Hältst du das wirklich für ein gelungenes Design? Ich nicht. Eine Familie besteht zwar aus Personen, aber sie ist keine Person. Folglich sollte sie auch nicht von Person erben.
In specifications, Murphy's Law supersedes Ohm's.
xeike
User
Beiträge: 83
Registriert: Donnerstag 28. Februar 2013, 09:58

Hi!

Das was ich meinte ist, dass man Familienangehörigen eine Postkarte schreibt und sie anruft, Bekannte auf FB beglückwünscht, und so weiter. Erweitern liesse sich das noch um "Paare", die einen Hochzeitstag haben (quasi Geburtstag des Paares :wink: ) und den man ebenfalls beglückwünschen möchte.

Selbstverständlich ist das keine super-Profi-Anwendung. Aber zum Üben reicht es allemal aus. Und darum gehts ja hier.

Xe
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@xeike: Ein Familie ist eine Person? :shock:
Eine Familie ist doch eher eine Persongruppe, die weitere spezielle Rollen der Akteure kennt, was eher z.B. einem PersonSet mit generischen Rollen und einer Ableitung Family hiervon mit den Rollen Vater, Mutter, Kind etc. entspricht.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

@xeike: Bei "Ein Familienangehoeriger ist eine Person" kann ich dir noch folgen und zustimmen, aber bei "Ein Paar ist eine Person" hoerts auf. Ein Paar hat nunmal keinen Namen, keine Adresse oder sonstige Kontaktdaten: Das haben nur die Personen, die das Paar ausmachen. Dass man den Geburtstag hier umdefinieren muss, ist doch ein Wink mit dem Zaunpfahl, dass es nicht funktioniert ;)

@jerch: Du bist ja ganz schoen altmodisch :O Was ist mit gleichgeschlechtlichen Familien?
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@cofi: Jab, da bin ich wohl in die pc-Falle getappt. Auch eine Großfamilie wäre damit nicht abbildbar. Zum Glück hab ich "z.B." geschrieben ;)

@OP:
Allein die Diskussion um eine so vermeintlich einfache Beziehung wie Personen zu Familien zeigt, dass OOP nicht einfach so "geübt" werden kann. Vielmehr musst Du Dich fragen, welche Aspekte Dir wichtig sind und einer Repräsentation in der Funktionalität bedürfen. So ist @xeikes Modell-Vereinfachung durchaus legitim, solange es nur um bestimmte Funktionalität geht. Allerdings würde ich dann andere Klassennamen suchen, um diesem Umstand gerecht zu werden.
Was Du durchaus üben kannst und auch solltest, ist die syntaktische Umsetzung in einer Sprache, also in Python - Wie baue ich Klassen, wie nutze ich Exemplare davon usw. Mit Nutzen der Strukturen fällt Dir das Erarbeiten der paradigmatischen Konzepte dahinter sehr viel einfacher.
Benutzeravatar
kbr
User
Beiträge: 1506
Registriert: Mittwoch 15. Oktober 2008, 09:27

@xeike: Für den Entwurf objektorientierter Strukturen mag Dir folgendes helfen: es wird unterschieden zwischen inheritance (ist ein) und composition (hat ein). Mit Person und Familie als Objekte kannst Du Dir die sinnvolle Anwendung von inheritance und composition leicht vor Augen führen:
Eine Person ist eine Familie ergibt ebensowenig Sinn, wie eine Familie ist eine Person. Aber eine Familie hat Personen, das ist schon eher der Fall. Du könntest daher im Objekt Familie eine Liste von Personen-Objekten verwalten - composition wäre hier also angesagt.
xeike
User
Beiträge: 83
Registriert: Donnerstag 28. Februar 2013, 09:58

Ihr haltet euch definitv zu lange an "Familie" auf und übertragt es nicht nach "Familienangehöriger".

Ich bin nicht der OP, der um ein Übungsbeispiel gebeten hat. Dass eine Familie aus Familienangehörigen besteht (was damit nicht unbedingt vollständig sein muss) ist so dermaßen trivial, dass ich mich über die entsprechenden Beiträge wundere.

Wie es im konkreten umzusetzen ist, dass Personen, Familien(angehörige), Paare, Firmen, Hunde und Katzen Geburtstag oder Jubiläum oder so haben können, habe ich offen gelassen.

Konstruktiv wären Übungsbeispiele zum Thema "Polymophie", was hier noch nicht genannt wurde. Dann hätten wir für den OP die drei Grundpfeiler von OOP zusammen.

Xe
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

xeike hat geschrieben:Ihr haltet euch definitv zu lange an "Familie" auf und übertragt es nicht nach "Familienangehöriger".

Ich bin nicht der OP, der um ein Übungsbeispiel gebeten hat. Dass eine Familie aus Familienangehörigen besteht (was damit nicht unbedingt vollständig sein muss) ist so dermaßen trivial, dass ich mich über die entsprechenden Beiträge wundere.
Präzision bedeutet sehr viel bei der Softwareentwicklung und wenn man schon in der Entwurfsphase verwirrende Begrifflichkeiten verwendet, dann ist die Gefahr sehr groß, dass das ganz Projekt im Chaos endet oder noch mal weit zurückgedreht werden muss.

Familie ist hier einfach semantisch falsch und wenn mehrere erfahrene Entwickler darüber stolpern, dann sollte man das als Wink mit einem ganzen Gartenzaun sehen.
xeike
User
Beiträge: 83
Registriert: Donnerstag 28. Februar 2013, 09:58

/me hat geschrieben:Familie ist hier einfach semantisch falsch und wenn mehrere erfahrene Entwickler darüber stolpern, dann sollte man das als Wink mit einem ganzen Gartenzaun sehen.
Es liegt nicht an der Semantik, sondern an der Interpretation. Mit

Code: Alles auswählen

class Person
class Personen
class Familie(Personen)
kann ich das in meinem ersten Posting genannte sehr gut abbilden.

Ach ja: "Familie" ist auch wieder nur eine semantische Interpretation eines realen Sachverhaltes. Ich könnte auch Pruzzel von Brabbel ableiten. Um es deutlicher zu sagen: "Familie" bedeutet hier schlicht und ergreifend einen Ausschnitt bezogen auf Name, Anschrift und Geburtsdatum im Kontext eines Übungsbeispiels.

Xe
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

xeike hat geschrieben:"Familie" bedeutet hier schlicht und ergreifend einen Ausschnitt bezogen auf Name, Anschrift und Geburtsdatum im Kontext eines Übungsbeispiels.
Da passt dann wirklich viel rein - Name: Rathaus, Anschrift: Am Markt 1, Geburtsdatum: 01.01.1671 ;)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

jerch hat geschrieben:
xeike hat geschrieben:"Familie" bedeutet hier schlicht und ergreifend einen Ausschnitt bezogen auf Name, Anschrift und Geburtsdatum im Kontext eines Übungsbeispiels.
Da passt dann wirklich viel rein - Name: Rathaus, Anschrift: Am Markt 1, Geburtsdatum: 01.01.1671 ;)
Das ist dann halt eine Stadt und die Stadtfamilie sind die Buerger :roll:
mcdwerner
User
Beiträge: 113
Registriert: Donnerstag 7. Juli 2011, 14:27

... um nochmal zurück zur Ausgangsfrage zu kommen, ich würde hier noch Frameworks in die Runde werfen, bei denen man gezwungen ist mit Klassen zu arbeiten und die gut dokumentiert sind, z.B.: Django https://www.djangoproject.com/

Ich habe damit 2 kleine Projekte im Heimnetzwerk realisiert und irgendwann kam dann der Punkt an dem ich mich fragte: "Woher zum T... hat das Model <blah> jetzt diese Methode???" edit: "Woher zum T... hat das VON MIR SELBST GESCHRIEBENE Model <blah> jetzt diese Methode???"

Wenn schon mit Kanonen auf Spatzen schiessen, dann will ich die Spatzen aber auch braten und essen können (bzw. dann will ich auch was davon haben ;-)
Antworten