OOP-Entwurfsprinzip auch für Python gültig?

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.
Benutzeravatar
Goswin
User
Beiträge: 361
Registriert: Freitag 8. Dezember 2006, 11:47
Wohnort: Ulm-Böfingen

Dienstag 27. Januar 2009, 09:00

Immer wieder werde ich in meiner Programmierarbeit hingewiesen auf das Entwurfsprinzip: "Programmiere auf eine Schnittstelle hin, und nicht auf eine konkrete Klasse". Nun sind aber die Kollegen, die mir das empfehlen, entweder Java-Programmierer oder C++-Programmierer; viele kennen überhaupt keine dynamisch typisierten Sprachen. Ich konnte bisher nie nachvollziehen, wieso ich meine Klassen von abstrakten Oberklassen ableiten soll, die überhaupt nichts tun ( "class Klassenname_Schnittstelle(object): pass" ).

Sind Schnittstellen dieser Art bei Python überhaupt sinnvoll? Wenn ja, warum?
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

Dienstag 27. Januar 2009, 09:39

ziemlich einfach
um einem objekt seine aktuelle eigenschaft zu entlocken sind schnittstellen
sehr sinnvoll

gib mir deine farfe ist eine schnittstelle

def getcolor():
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Dienstag 27. Januar 2009, 09:50

Den einzigen Sinn, den ich in so einer Klasse sehe, ist, dass man damit Variablen deklarieren kann, und die Funktionalitaet braucht man in Python ja nicht. Aber wenn man eine Variable mit der abstrakten Klasse deklariert hat, kann man in Java trotzdem nicht auf die Methoden der Objekte zugreifen, die in der abgeleiteten Klasse definiert werden, oder? Also doch nicht so ganz sinnvoll?

PS: Ich lese mich gerade durch "Head first Design Patterns" durch, und denke auch, dass man manche Dinge in Python anders loesen wuerde. Waere mal interessant, Meinungen anderer Leute dazu zu hoeren...
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 27. Januar 2009, 10:11

Goswin hat geschrieben:Immer wieder werde ich in meiner Programmierarbeit hingewiesen auf das Entwurfsprinzip: "Programmiere auf eine Schnittstelle hin, und nicht auf eine konkrete Klasse". Nun sind aber die Kollegen, die mir das empfehlen, entweder Java-Programmierer oder C++-Programmierer; viele kennen überhaupt keine dynamisch typisierten Sprachen.
Daher sind solche Tipps dann mit Skepsis zu begegnen, denn Konzepte (in meinen könnte man einiges davon auch als Defekte bezeichnen) aus Java in Python oder andere dynamische Sprachen zu übertragen ist oftmals keine gute Idee, da viele Dinge für die man in statischen Sprachen Lösungen bauen muss, sind in dynamischen Sprachen schon gelöst.

Als Beispiel könnte hier Copland herhalten, ein Dependency-Injection-Framework für Ruby dass von einem Java-Programmierer geschrieben wurde. Irgendwann wurde er dann darauf hingewiesen, dass man statt die ganze Konfiguration in YAML/XML zu machen, doch auch Ruby gehen würde. Daraufhin wurde Needle geschrieben. In seiner weiteren Programmierarbeit hat er dann irgendwann festgestellt, dass man für DI eigentlich gar kein Framework braucht.
Goswin hat geschrieben:Ich konnte bisher nie nachvollziehen, wieso ich meine Klassen von abstrakten Oberklassen ableiten soll, die überhaupt nichts tun ( "class Klassenname_Schnittstelle(object): pass" ).
Das kannst du dir unter Java ein wenig wie eine formalisierte Version von Duck Typing vorstellen, bei der die syntaktischen Schnittstellen festgelegt werden. Das klingt für Java-Programmierer wichtig, weil dort das Typsystem viel stärker auf Typen fokussiert ist statt auf Verhalten aber wie die Python-Erfahrung gezeigt hat, ist so etwas gar nicht mal so notwendig.

Gerade die Möglichkeit, eine Klasse als Objekt zu übergeben (also quasi First-Order-Classes) ohne sie zu instanziieren ist eine Fähigkeit, deren Sinn Java-Programmierer oft nicht sehen und stattdessen dicke Frameworks mit viel XML schreiben um selbiges zu erreichen.
Rebecca hat geschrieben:PS: Ich lese mich gerade durch "Head first Design Patterns" durch, und denke auch, dass man manche Dinge in Python anders loesen wuerde. Waere mal interessant, Meinungen anderer Leute dazu zu hoeren...
Ja, ganz recht. Wenn man sich das Gang of Four-Buch ansieht und diese ganzen in Java populären Patterns ansieht dann sind viele davon in Python so simpel, dass man so etwas ohne das Buch selbst erfinden kann, weil da einfach nichts dabei ist. Etwa das Factory-Pattern. Andere wie das Singleton/Borg-Pattern sind nicht unbedingt sinnvoll und wieder andere wie das Visitor-Pattern sind viel hübscher wenn man sie durch Multimethods ersetzt.
Benutzeravatar
Goswin
User
Beiträge: 361
Registriert: Freitag 8. Dezember 2006, 11:47
Wohnort: Ulm-Böfingen

Dienstag 27. Januar 2009, 15:14

@sea-life:
Es tut mir leid, aber ich verstehe NIX von deiner Antwort. Ich verstehe nicht einmal, ob sie ernst gemeint ist oder nicht. Und was eine "farfe" sein soll, schon garnicht.

Wie soll ich einem Objekt aus einer Unterklasse Eigenschaften "entlocken" können???
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Dienstag 27. Januar 2009, 15:27

Moin,
Goswin hat geschrieben:@sea-life:
Es tut mir leid, aber ich verstehe NIX von deiner Antwort. Ich verstehe nicht einmal, ob sie ernst gemeint ist oder nicht. Und was eine "farfe" sein soll, schon garnicht.
Ich antworte mal stellvertretend: War ein Tippfehler. Er meinte Farbe (getcolor).
Wie soll ich einem Objekt aus einer Unterklasse Eigenschaften "entlocken" können???
Indem man auf Attribute oder eben auf Methoden zugreift - wie getcolor().

Gruß,
Manuel
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Dienstag 27. Januar 2009, 15:49

Sieh dir mal die Abstract Base Classes an, das klingt auch enterprisy genug um Java Programmierer etwas zu beschäftigen ;)

- Jonas
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 27. Januar 2009, 18:34

veers hat geschrieben:Sieh dir mal die Abstract Base Classes an, das klingt auch enterprisy genug um Java Programmierer etwas zu beschäftigen ;)
Oh, dafür eignet sich auch gut PEAK. Wobei das ja noch irgendeinen Wert hat. Für Beschäftigungstherapie gibt es ja auch noch Spring Python :)
BlackJack

Dienstag 27. Januar 2009, 20:23

@Goswin: Wenn man in Java direkt gegen eine Klasse implementiert, kann man diese Klasse nicht einfach gegen eine andere Implementierung austauschen, ohne dass man den Code, der die Klasse verwendet, auch ändern muss. Wenn man gegen ein Interface programmiert, kann man ohne Änderungen im eigenen Code machen zu müssen, alle Klassen verwenden, die das Interface implementieren.

Das ist in Python aber gar kein Problem, weil da eben nicht der Typ geprüft wird, sondern nur das Verhalten der Klasse stimmen muss, gegen die man programmiert. Die Klassen lassen sich auch ohne Interface problemlos austauschen.
Panke
User
Beiträge: 185
Registriert: Sonntag 18. März 2007, 19:26

Dienstag 27. Januar 2009, 21:32

In C++ gibts dafür dann Templates.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 28. Januar 2009, 02:01

Für alle die es brauchen gibt es auch zope.interface und PyProtocols (was mit "Protocols" auch BlackJacks bevorzugten Oberbegriff von Typcheck/Verhaltenscheck benutzt).
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Mittwoch 28. Januar 2009, 10:11

Panke hat geschrieben:In C++ gibts dafür dann Templates.
Das ist dann aber wieder was anderes.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Mittwoch 28. Januar 2009, 10:32

Goswin, ich würde sagen, Schnittstellen sind gut, aber ein Konzept, dass sich nicht als Code in einem Programm wiederfinden muss. Daher würde ich in Python nicht ein Java-Interface als abstrakte Klasse realisieren. Das wäre nur Code-Ballast.

Schnittstellen in Java sind außerdem wichtig, um Komponenten testbar zu halten. Sie lösen ein Problem, dass man in Python gar nicht hat. Daher gibt es auch keinen Zwang, syntaktisch da etwas zu machen.

Stefan
Panke
User
Beiträge: 185
Registriert: Sonntag 18. März 2007, 19:26

Mittwoch 28. Januar 2009, 22:29

Darii hat geschrieben:
Panke hat geschrieben:In C++ gibts dafür dann Templates.
Das ist dann aber wieder was anderes.
Da bin ich anderer Meinung. Die Standardcontainer sind auch auf eine Schnittstelle hin programmiert: Das die Inhalte den Kopierkonstruktor und den Kleiner-gleich-Operator besitzen.

Ich wollte damit nämlich gerade dadrauf aufmerksam machen, dass 'Auf eine Schnittstelle hin programmieren' nicht zwangsläufig bedeutet ein Java Interface Gegenstück zu erfinden.
BlackJack

Donnerstag 29. Januar 2009, 07:50

@Panke: Templates sind etwas anderes als die STL-Container. Man kann mit Templates wesentlich mehr anstellen als generische Container zu implementieren.
Antworten