Programmierparadigmen, OOP-Verwirrung

Alles, was nicht direkt mit Python-Problemen zu tun hat. Dies ist auch der perfekte Platz für Jobangebote.
joost
gelöscht
Beiträge: 134
Registriert: Sonntag 29. April 2007, 13:28

Programmierparadigmen, OOP-Verwirrung

Beitragvon joost » Freitag 11. Mai 2007, 11:09

zurückgezogen
Zuletzt geändert von joost am Freitag 11. Mai 2007, 18:52, insgesamt 1-mal geändert.
Never use idle.pyw, if you need sys.stdin
kbrust
User
Beiträge: 11
Registriert: Montag 9. Oktober 2006, 11:53
Kontaktdaten:

Beitragvon kbrust » Freitag 11. Mai 2007, 11:39

joost hat geschrieben:
Ja, da hast du in jedem Fall recht. Das Lemming-Phänomen tritt leider in sehr vielen Bereichen auf. Selbst ein Linux ist davon nicht sicher. Mein Bauchgefühl sagt mir aber, daß der Anteil bei einem Tool für Programmierer per Definition relativ gering sein sollte.

Das ist leider nicht so - ganz und gar nicht. Dafür gibt es viele Gründe. Für einen davon sieht man hier im Forum massenhaft Beispiele: Die Leute lesen einfach nicht (eine hoher Anteil der Fragen hier wäre durch einen Blick ins Tutorial oder die Referenz erledigt). Und da sie nicht lesen, nutzen sie oft nur einen kleinen Teil der Features der jeweiligen Software - von den anderen erfahren sie nie. Ich war mal Praktikant in einem größeren VB-Projekt (Hunderte von src-Dateien, Zeilenzahl irgendwo zwischen 30.000 und 100.000). Dort wurde nicht einmal der collection-Typ von VB eingesetzt, geschweige denn Klassen (die es auch in VB durchaus gibt). Und die Beurteilung des wenigen, was eingesetzt wird, hängt dann eventuell nur an irgendwelchen Kleinigkeiten, die auch in schlechter Software ja mal besser als woanders implementiert sein können.

Dass immer noch C und nicht durchgängig C++ programmiert wird (und C++ dadurch natürlich stark verbessert wäre), ist für mich auch ein Lemming-Effekt (OOP ist seit spätestens seit ungefähr 1995 ein Muss, und die großen C-Projekte wie gtk, tcl/TK u.s.w. bauen Objektorientierung in C nach) - und daran kann man sehen, wie sehr Programmierer dem unterliegen.


Hmmm. Wenn ich genauer darüber nachdenke, hast du auf jeden Fall recht, vorallem bei dem VB-Beispiel (Die Tatsache allein, das es noch so viele VB-Projekte in Bereichen gibt, wo die Sprache die denkbar schlechteste Wahl ist, unterstreicht das ganze sogar :D ).

Bei OOP wäre ich aber vorsichtiger, da hier ein grosser Teil darauf zurückzuführen ist, das es recht harter Tobak ist, falls man davor die imperative Programmierung verinnerlicht hatte. Der Umstieg kann da einige Probleme bereiten, sofern man nicht ein entsprechendes Talent in die Wiege gelegt bekommen hat.
joost
gelöscht
Beiträge: 134
Registriert: Sonntag 29. April 2007, 13:28

Beitragvon joost » Freitag 11. Mai 2007, 12:17

zurückgezogen
Zuletzt geändert von joost am Freitag 11. Mai 2007, 18:52, insgesamt 1-mal geändert.
Never use idle.pyw, if you need sys.stdin
joost
gelöscht
Beiträge: 134
Registriert: Sonntag 29. April 2007, 13:28

Beitragvon joost » Freitag 11. Mai 2007, 12:19

zurückgezogen
Zuletzt geändert von joost am Freitag 11. Mai 2007, 18:55, insgesamt 1-mal geändert.
Never use idle.pyw, if you need sys.stdin
joost
gelöscht
Beiträge: 134
Registriert: Sonntag 29. April 2007, 13:28

Beitragvon joost » Freitag 11. Mai 2007, 12:23

zurückgezogen
Zuletzt geändert von joost am Freitag 11. Mai 2007, 18:55, insgesamt 1-mal geändert.
Never use idle.pyw, if you need sys.stdin
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Beitragvon birkenfeld » Freitag 11. Mai 2007, 12:28

*seufz* Man kann Posts auch editieren...

Fassen wir also zusammen: main() in eine Klasse packen zu müssen, ist für dich Unsinn. Deshalb magst du auch "if __name__ == '__main__'" nicht, weil das eben gerade nicht in einer Klasse steht? Kommt mir spanisch vor.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Freitag 11. Mai 2007, 12:32

joost hat geschrieben:main() als Klasse ist daher ein Unding.

Hallo joost!

Auf was antwortest du hier? Wer verwendet schon ``main()`` als Klasse? ``main()`` soll eine Funktion sein, die aufgerufen wird, wenn das Modul nicht importiert, sondern direkt von der Kommandozeile aus aufgerufen wird.

Dass man dafür den Namen ``main`` verwendet, hat historische Gründe. C, C++, Visual Basic, ... Bei diesen Sprachen und vielen anderen ist eine Funktion/Methode mit dem Namen ``main`` der Einstiegspunkt.

Ich halte dieses Konstrukt für gar nicht mal so schlecht.

Code: Alles auswählen

def main():
    pass

if __name__ == "__main__":
    main()

Damit steuere ich das Verhalten des Moduls. Wenn es importiert wird, dann wird ``main()`` nicht ausgeführt. Wird das Modul direkt gestartet, dann wird ``main()`` ausgeführt.
Noch dazu hat man auch nach dem Importieren des Moduls immer noch die Wahl, vom importierenden Modul aus ``main()`` aufzurufen. Was unter Umständen ja auch nicht so schlecht sein muss.

mfg
Gerold
:-)

PS: Was hat das mit diesem Thema zu tun?
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Freitag 11. Mai 2007, 12:44

joost hat geschrieben:Der Code im pygtk-Tutorial z.B. läuft deshalb unter Windows gar nicht

Falls du diesen Code hier meinst: http://pygtk.org/pygtk2tutorial/ch-Gett ... HelloWorld

Der läuft bei mir ohne Probleme. Vom WingIDE aus aufgerufen, sowie direkt per Doppelklick gestartet.

Aber du hast recht, ``gtk.main()`` hat in der Klasse ``HelloWorld`` nichts zu suchen.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
joost
gelöscht
Beiträge: 134
Registriert: Sonntag 29. April 2007, 13:28

Beitragvon joost » Freitag 11. Mai 2007, 12:48

zurückgezogen
Zuletzt geändert von joost am Freitag 11. Mai 2007, 18:55, insgesamt 5-mal geändert.
Never use idle.pyw, if you need sys.stdin
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Beitragvon birkenfeld » Freitag 11. Mai 2007, 12:51

Tut mir leid, aber ich habe keine Ahnung, was du eigentlich sagen willst.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
BlackJack

Beitragvon BlackJack » Freitag 11. Mai 2007, 12:55

@joost: OOP ist auf jeden Fall eine Abstraktionsebene höher als "normale" imperative Programmierung und damit auch etwas was man zusätzlich lernen muss und was vielleicht auch Probleme beim lernen macht, die man bis zu dem Punkt noch nicht hatte.

Ausserdem geht es nicht nur darum zu wissen was Klassen und Objekte sind, sondern man muss ein Programm damit auch sinnvoll entwerfen können. Mehr Möglichkeiten ein Programm zu strukturieren erfordern auch ein wenig mehr handwerkliches Geschick mit den zusätzlichen Werkzeugen umzugehen.

Das Argument mit den Klassenhierarchien kann man übrigens auch umkehren: Wer das "ordentlich" mit Java gelernt hat, braucht meistens eine kleine Eingewöhnungsphase bis er sich bei Python abgewöhnt hat alles in irgendwelche Hierarchien packen zu wollen, auch wenn das gar nicht notwendig ist.

Ansonsten schliesse ich mich birkenfeld an!?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Freitag 11. Mai 2007, 13:02

joost hat geschrieben:(und es gibt sicherlich ein paar Module, die man so als Plugin brauchbar machen kann) - ich finde aber unsinnig, das durchgängig zu verwenden.

Hallo joost!

Sagen wir es mal so: Es gibt bei mir kaum ein Modul ohne diesen Konstrukt:

Code: Alles auswählen

def main():
    pass

if __name__ == "__main__":
    main()

``main()`` wird bei mir ziemlich oft zum Testen herangezogen. Ich bevorzuge es, kleine Teile funktionsfähig zu programmieren und in einem Hauptprogramm zu einem funktionsfähigen Ganzen zusammenzusetzen. Damit das so hinhaut, muss ich schon während dem Programmieren sicher stellen, dass die Einzelteile funktionieren. Diese Tests sind bei mir meistens in der ``main()``-Funktion zu finden.

Ich spreche bei meiner Art zu programmieren immer von "Legotechnik spielen". Mit dem Unterschied, dass ich mir meine Bauteile selber, in Form von Modulen, Klassen, Funktionen, wxPython-Frames, wxPython-Dialogen und sonstigen wxPython-Widgets herstelle. Ich liebe programmieren. :mrgreen: Das ist wie den ganzen Tag mit Legotechnik zu spielen.

mfg
Gerold
:-)

PS: Jetzt habe ich es geschafft, in einem Offtopic-Thread Offtopic zu schreiben. :P
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
joost
gelöscht
Beiträge: 134
Registriert: Sonntag 29. April 2007, 13:28

Beitragvon joost » Freitag 11. Mai 2007, 13:33

zurückgezogen
Zuletzt geändert von joost am Freitag 11. Mai 2007, 18:56, insgesamt 1-mal geändert.
Never use idle.pyw, if you need sys.stdin
BlackJack

Beitragvon BlackJack » Freitag 11. Mai 2007, 13:51

Ich verstehe immer noch nicht worauf Du eigentlich hinaus willst. Also auf Python bezogen. Und vielleicht ziehst Du auch die Grenzen zu scharf bei Begriffen. Wo ist zum Beispiel der Unterschied zwischen Java, wo der Startcode in einer statischen Klasse steht und Python wo er in einem Modul steht, was man durchaus als statische Klasse oder Singleton ansehen und benutzen kann? Ich sehe da eigentlich nur syntaktische Unterschiede. Alles ist Objekt und irgendwo muss der Programmlauf nunmal anfangen.

Und wieso sollte es bei GUI-Programmen keine Klasse geben, die von einer "Application"-Klasse aus dem Toolkit abgeleitet ist und entsprechende Methoden und Funktionalität bereitstellt? Das es bei Klassen um Wiederverwendung geht heisst nicht, dass jede Klasse dazu gedacht sein muss wiederverwendet zu werden, es kann auch heissen, dass man bei einer nicht wiederverwendbaren Klasse, die sozusagen am Ende der "Nahrungskette" steht, etwas aus einer Basisklasse verwendet und diese erweitert. Eben um den Teil der diese *spezifische* Applikation ausmacht.

Edit: Ob man unbedingt Threads können muss? Also erstmal sehe ich noch nicht so ganz, dass jetzt alle Programme auf Threads umsteigen, weil Multicore-CPUs alleine nicht reichen ─ die Probleme müssen auch parallelisierbar sein. Und dann hoffe ich doch darauf, das sich einfachere und sichere APIs als Threads durchsetzen werden. Ich denke da an Actors/Coroutinen aus Io oder das Nebenläufigkeitsmodell von Erlang.
joost
gelöscht
Beiträge: 134
Registriert: Sonntag 29. April 2007, 13:28

Beitragvon joost » Freitag 11. Mai 2007, 14:00

zurückgezogen
Zuletzt geändert von joost am Freitag 11. Mai 2007, 18:56, insgesamt 1-mal geändert.
Never use idle.pyw, if you need sys.stdin

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder