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

Beitragvon Goswin » Donnerstag 12. Februar 2009, 09:16

Rebecca hat geschrieben: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...

Ich schlage mich auch mit dem gleichen Buch herum. Leider sind die Begründungen der Entwurfsprinzipien alle auf Java zugeschnitten, und mein Java ist unzureichend, um das WESENTLICHE dieser Begründungen zu verstehen.

Das Buch ist offenbar nur für Java-Programmierer benutzerfreundlich, für andere ist es eine harte Nuss. In der Einführung heißt es auf Seite xxiv (für wen ist dieses Buch): "Sie müssen kein Java-Guru sein" und "Sie müssen keine fortgeschrittenen Java-Kenntnisse haben". Das trifft alles NICHT DEN KERN der Sache. In der Tat muss man anfangs keine fortgeschrittenen Java-Kenntnisse haben, ABER man muss den Willen und die Zeit haben, sich solche fortgeschrittenen Java-Kenntnisse anzueignen, sonst ist das Buch fast nutzlos.
Benutzeravatar
Goswin
User
Beiträge: 361
Registriert: Freitag 8. Dezember 2006, 11:47
Wohnort: Ulm-Böfingen

Virtuelle Schnittstellen

Beitragvon Goswin » Donnerstag 12. Februar 2009, 09:46

sma hat geschrieben: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.
Ja, ich denke, meine Schnittstellen werde ich voraussichtlich als docstrings implementieren.

sma hat geschrieben:Schnittstellen in Java sind außerdem wichtig, um Komponenten testbar zu halten. Sie lösen ein Problem, dass man in Python gar nicht hat.
Aber testen wird man die (konkreten) Python-Komponenten wohl auch müssen, oder?
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Re: Virtuelle Schnittstellen

Beitragvon Leonidas » Donnerstag 12. Februar 2009, 10:14

Goswin hat geschrieben:
sma hat geschrieben:Schnittstellen in Java sind außerdem wichtig, um Komponenten testbar zu halten. Sie lösen ein Problem, dass man in Python gar nicht hat.
Aber testen wird man die (konkreten) Python-Komponenten wohl auch müssen, oder?

Ja natürlich muss man die Komponenten noch testen, aber Python erzwingt keine Typkorrektheit und dadurch ist Mocking im Vergleich zu Java trivial. Ebenso die Möglichkeit dass man Klassen und Funktionen als Objekte direkt herumreicht, ohne sie instanziieren zu müssen oder in Instanzen von Dummyklassen verpacken zu müssen macht das testen von Python-Code auch ohne aufwendige Design-Patterns einfacher. Zudem gibt es keine privaten Attribute also kann man an einer zu testenden Klasse einige Attribute trivial durch Mock-Objekte ersetzen, durch simple Zuweisung.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
CerebrosuS
User
Beiträge: 5
Registriert: Dienstag 10. Februar 2009, 11:49

Senf bitteschön.

Beitragvon CerebrosuS » Donnerstag 12. Februar 2009, 16:07

Hi,

ich gebe auch einfach mal meinen Senf zu der ganzen Angelegenheit. Also ...

Ich programmiere selber auch Java und C++, Python jedoch erst seit kurzem. Das Problem was der Threadersteller erkannt hat, ist die dynamische Typisierung. Warum sollte ich ein abstraktes Objekt erstellen, wenn man es nicht mit der Typisierung ausnutzen kann. Da ich erst seit kurzem in Python involviert bin, bitte ich um Verständniss, sollte ich Halbwahrheiten verbreiten.

Wenn ich ein Objekt meine Vorstellung auf ein gestelltes Automatisierungsproblem abbilde und dadraus mein Programm erstelle spielen Typisierungen eine wichtige Rolle, schließlich bekomme ich syntaktische und semantische Probleme in der gewählten Sprache, wenn ich jene nicht ab und zu kontrolliere. Man sollte grundsätzlich auf Typisierungsmechanismen nciht verzichten. In Python ist das, wenn ich es bis jetzt rchtig überblickt habe mit "isinstance()" sehr gut lösbar. Wenn ich also festellen möchte welches Objekt in einer gegebenen Variable ist, um es dann effizient zu nutzen, bsp. die richtige Eigenschaft abzufragen, sollte ich eine Typisierungsprüfung vornehmen. ANsonsten ist dein Programm nicht weit davon entfernt sich selbständig zu machen. Und genau hier setzt Abstract wieder ein. In Python wird keine statische Typisierung geboten, also muss ich Objekte abfragen und diese Typisierung im gewissen Maße kontrollieren. Wie gesagt hier kommt das Abstrakte wieder rein. Denn arbeite ich nurnoch mit abstrakten Objekten, kann ich wunderbar den modularen Code erweitern und zugleich den alten Code belassen wie er ist. Was ja einer der Hintergründe für OOP ist.

Grüße
"Ich kann nicht allen Menschen helfen!" - Sprach der Engherzige und half keinem.
DasIch
User
Beiträge: 2423
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Re: Senf bitteschön.

Beitragvon DasIch » Donnerstag 12. Februar 2009, 16:19

@CerebrosuS Du hast Python absolut nicht verstanden. Typprüfung ist absolut unnötig und soweit als möglich zu vermeiden. Dadurch entstehen auch keine Probleme, im Gegenteil.
CerebrosuS
User
Beiträge: 5
Registriert: Dienstag 10. Februar 2009, 11:49

Beitragvon CerebrosuS » Donnerstag 12. Februar 2009, 16:29

@Dasich

Hm, ...

aber wenn ich doch bsp versuche auf eine Methode eines Objektes zuzugreifen, welche nciht existiert, bekomme ich eine AttributeError Exception.

Und wenn ich von einem Argument einer Funktiion erwarte das es vom Typ str ist und ich "Hallo" + var mache, bekomme ich für type(var) == int bsp. eine TypeError Exception richtig?

Die Funktion bricht unerwartet ab. Erklär mir doch bitte was ich falsch verstanden habe, damit ich drüber nachdenken kann. Vll. auch wie man es denn besser machen sollte, da ich leider nichts Anderes gelesen habe bis weilen.

Grüße
"Ich kann nicht allen Menschen helfen!" - Sprach der Engherzige und half keinem.
lunar

Beitragvon lunar » Donnerstag 12. Februar 2009, 16:38

CerebrosuS hat geschrieben:aber wenn ich doch bsp versuche auf eine Methode eines Objektes zuzugreifen, welche nciht existiert, bekomme ich eine AttributeError Exception.

Und wenn ich von einem Argument einer Funktiion erwarte das es vom Typ str ist und ich "Hallo" + var mache, bekomme ich für type(var) == int bsp. eine TypeError Exception richtig?

Wo genau liegt da jetzt der Nachteil? Oder anders gefragt: Wo liegt der Vorteil darin, mittels isinstance den Typ zu überprüfen, und die Ausnahme selbst zu werfen, wenn der Typtest fehlschlägt?

Im Übrigen ist es ja nicht so, dass du der erste Java-Programmierer wärst, der mit dynamischer Typisierung so seine Probleme hat ... die Antworten sind immer die gleichen geblieben => Google, Forumssuche
Zuletzt geändert von lunar am Donnerstag 12. Februar 2009, 16:39, insgesamt 1-mal geändert.
DasIch
User
Beiträge: 2423
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Beitragvon DasIch » Donnerstag 12. Februar 2009, 16:39

Natürlich tritt eine Exception auf aber dass ist selbstverständlich übergebe ich ein Objekt dass sich nicht so verhält wie dass erwartete Objekt.
CerebrosuS
User
Beiträge: 5
Registriert: Dienstag 10. Februar 2009, 11:49

Beitragvon CerebrosuS » Donnerstag 12. Februar 2009, 16:42

@lunar

Danke, ... das war die Frage die mich nachdenken ließ. Ich vergaß, dass ja für Alles eine Exception geworfen wird. Wie Ihr seht, bin ich noch sehr am Anfang und halte mich noch verdammt eng an Java und C/C++ *schäm*

Danke @ lunar und Dasich.

Ich werde direkt mal meinen Code umschreiben und auf effektiveres Exception Handling achten.

Grüße
"Ich kann nicht allen Menschen helfen!" - Sprach der Engherzige und half keinem.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Beitragvon Darii » Donnerstag 12. Februar 2009, 16:53

CerebrosuS hat geschrieben: Vll. auch wie man es denn besser machen sollte, da ich leider nichts Anderes gelesen habe bis weilen.
Der Funktion einen String und keine Zahl übergeben ;)

Worauf DasIch vermutlich hinauswill: Wenn man der Funktion ein Objekt falschen typs übergibt schmiert das ganze schon von alleine ab, da ist keinem mit einer Typprüfung geholfen. Anders sieht es natürlich aus, wenn man aus einer Typprüfung einen Vorteil ziehen könnte. Etwa weil man notfalls eine geeignete Typumwandlung machen kannst (bspw. int -> str) oder um eine aussagekräftigere Fehlermeldung zu werfen.
Nagila Hawa
User
Beiträge: 16
Registriert: Montag 9. Juni 2008, 18:20
Kontaktdaten:

Beitragvon Nagila Hawa » Donnerstag 12. Februar 2009, 20:36

Das Problem, wenn man von einer Sprache mit einem strengen und umfangreichen Typensystem kommt, ist einfach, dass man sich erstmal völlig nackt vorkommt, eines mächtigen Werkzeugs beraubt fühlt und stattdessen lernen muss, die Werkzeuge zu nutzen, die einem Python bietet.

Ich glaube erfahrene Python-Programmierer, die plötzlich mit einer Sprache wie Java oder Ada arbeiten müssen, werden sich auch erstmal gewaltig zurecht finden müssen, weil vieles anders gemacht wird. Und auch hier wird sich wohl als erstes über das Typensystem geärgert, bis man sich daran gewöhnt es richtig und sinnvoll einzusetzen.

Irgendwann reiße ich mich auch mal zusammen und schreibe etwas Größeres in Python, damit ich mich nicht mehr so nackt fühle. Die Prüfungswochen sind ja bald wieder vorbei. :)
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Beitragvon BlackVivi » Donnerstag 12. Februar 2009, 22:18

Nagila Hawa hat geschrieben:Ich glaube erfahrene Python-Programmierer, die plötzlich mit einer Sprache wie Java oder Ada arbeiten müssen, werden sich auch erstmal gewaltig zurecht finden müssen, weil vieles anders gemacht wird. Und auch hier wird sich wohl als erstes über das Typensystem geärgert, bis man sich daran gewöhnt es richtig und sinnvoll einzusetzen.
Man verflucht die Sprache unendlich. Man stellt sich bei jeder Aufgabenstellung vor: "In Python wär's ein 10-Zeiler, verdammt >_>"...

Wirklich böse, manchmal.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Freitag 13. Februar 2009, 01:44

Nagila Hawa hat geschrieben:Das Problem, wenn man von einer Sprache mit einem strengen und umfangreichen Typensystem kommt, ist einfach, dass man sich erstmal völlig nackt vorkommt, eines mächtigen Werkzeugs beraubt fühlt und stattdessen lernen muss, die Werkzeuge zu nutzen, die einem Python bietet.

Sprichst du von Javas Typsystem? Das "streng und umfangreich" zu nennen würde mir eher weniger in den Sinn kommen. Wenn man ein strenges Typsystem ansehen will dann könnte man Haskell nennen, wenn umfangreich dann Scala. Ich denke der durchschnittliche Java-Programmierer hätte auch damit zuerst mal Probleme obwohl alle genannten Sprachen statisch getypt sind. Es ist einfach anders.

Nagila Hawa hat geschrieben:Ich glaube erfahrene Python-Programmierer, die plötzlich mit einer Sprache wie Java oder Ada arbeiten müssen, werden sich auch erstmal gewaltig zurecht finden müssen, weil vieles anders gemacht wird. Und auch hier wird sich wohl als erstes über das Typensystem geärgert, bis man sich daran gewöhnt es richtig und sinnvoll einzusetzen.

Gerade bei Java habe ich öfters das Gefühl das das Typsystem einzig zu dem zweck erfunden wurde um Sachen die in Python einfach sind unter Unmengen von Klassen, Interfaces und Wrappern zu vergraben um irgendwelche Typsicherheit zu erreichen. Ich gebe aber zu dass ich tatsächlich eher ein dynamic-typing-Mensch bin, wenn ich Eingabedaten prüfen will kann ich das viel effektiver mit Preconditions und Postconditions und ggf. Multimethoden machen statt einfach nur naiv zu schauen ob die Typen passen. Generell finde ich es erstaunlich dass Pre&Postconditions sich bisher so wenig durchgesetzt haben, obwohl das Konzept gar nicht so übel ist.

Lustigerweise höre ich eigentlich nie von Haskell-Leuten dass das Typsystem ihnen im Weg steht. Obwohl es viel mehr im Vordergrund steht als in Java.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Beitragvon mkesper » Freitag 13. Februar 2009, 09:04

Leonidas hat geschrieben:Generell finde ich es erstaunlich dass Pre&Postconditions sich bisher so wenig durchgesetzt haben, obwohl das Konzept gar nicht so übel ist.

Hmm, habe ich noch nie gehört, hast du einen guten Link auf eine Beschreibung?
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Freitag 13. Februar 2009, 09:49

mkallas hat geschrieben:Hmm, habe ich noch nie gehört, hast du einen guten Link auf eine Beschreibung?

Da ist eigentlich nicht viel dabei und wenn man so nachdenkt kann man sowas auch trivial selbst erfinden. Hier ein Link der das beschreibt. Der Überbegriff ist Design by Contract, wobei ich von der Nützlichkeit der Invarianten nicht überzeugt bin.

In Python lassen sich die Conditions mit Dekoratoren recht einfach implementieren.
My god, it's full of CARs! | Leonidasvoice vs Modvoice

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder