gerold hat geschrieben:
- Das ist kein Angriff auf BlackJack, sondern ein Aufzeigen meiner Gedanken zur Vielfältigkeit von Python und die Mischung von Denkweisen, die es beim Programmieren zulässt.
Hatte ich auch nicht als Angriff aufgefasst. Ich hoffe umgekehrt Du auch nicht.
- OO-Programmierung beginnt im Kopf und muss von Anfang bis Ende durchgezogen werden. Macht man das nicht, dann ist es nicht OO-Programmierung sondern prozedurale Programmierung mit Objekten.
- In der OO-Programmierung können/sollten auch Programme als Objekt angesehen werden. Nur so kann man ungestört in der OO-Denkweise bleiben.
Aber vieles ist einfach prozedualer Umgang mit Objekten. Das ist in vielen Fällen eine ganz natürliche herangehensweise.
Und man kann jedes Python-Programm als Objekt auffassen. Ich habe mich ja nicht daran gestossen, das Objekte benutzt wurden. Dann könnte man Python ja überhaupt nicht benutzen, weil im Gegensatz zu Java in Python eigentlich alles ein Objekt ist. Angefangen vom Integer über Funktionen und Klassen bis zu dem Programm selbst, was ja im Kontext eines Modul-Objekts abläuft. Und anstatt dieses Modul-Objekt mit seinem Namensraum zu benutzen, wurde unnötigerweise eine Klasse definiert, die nochmal einen eigenen Namensraum "aufmacht" aber im Modul ganz alleine dasteht.
- OO-Programmierung bedeutet oft, um einiges mehr Code schreiben zu müssen, erleichtert aber die Sicht auf die Dinge, da der Programmierer eingeschränkter/spezifischer denken kann. Es gelten immer die gleichen Überlegungen: In welche Objekte kann ich mein Problem und dessen Umwelt aufteilen und welche Eigenschaften bzw. Methoden brauche ich um diese Umwelt virtuell abzubilden um damit mein Problem zu lösen.
Das würde ich nicht unterschreiben. Ich muss nicht das Problem in Objekte aufteilen sondern nur zusammengehörige Daten und Funktionen darauf. Eben Quelltext, der mit Objekten hantiert. Der Code der das tut, darf aber ruhig prozedural sein. Das ist der Code in Methoden ja auch zwangsläufig.
Und wieder: In Python ist alles Objekt, also auch die angeblich prozeduale Funktion. Warum muss ich die dann in eine Klasse verpacken von der ich auch noch eine Instanz erzeugen muss um sie verwenden zu können. Der totale Overkill.
- Das Mischen von prozeduraler Programmierung und OO-Programmierung erschwert das Programmieren für die, die von Anfang an (nur) die OO-Programmierung kennen und sich an die oben aufgezeigte Denkweise gewöhnt haben.
Mit OO-Programmierung meinst Du jetzt aber speziell Java-OO bzw Sprachen die einen zwingen
Klassen zu verwenden. Weil das in Python, Ruby, Objective-C und C++ zum Beispiel anders aussieht. Einige davon, wie Python und Ruby, sind in gewissen Sinne sogar viel "objektorientierter" weil dort alles Objekt ist.
- Programmierer wie ich, die mit Prozeduraler-Programmierung aufgewachsen sind, werden ihre Programme wahrscheinlich bis an ihr Lebensende in einer Mischung aus prozeduraler und objektorientierter Programmierung schreiben.
Meiner Meinung nach auch die richtige Lösung, weil auch im "richtigen Leben" nicht alles ein Objekt ist und vor allem nicht alles mit Zwang sinnvoll in eine Objekthierarchie gezwängt werden kann/sollte.
Vielleicht ändere ich diese Meinung auch mal irgendwann -- handgeschriebenen Assembler-Quelltext in Pascal-Programme einzustreuen habe ich ja mittlerweile auch aufgegeben.
- Python erlaubt verschiedene Denkweisen und gefällt mir deshalb so gut. Diskussionen wie "Soll man lambda oder print abschaffen?" führen, meiner Meinung nach, dazu dass sich Python immer mehr solchen Sprachen wie C# oder Java angleicht und einfache Sachen immer schwieriger werden. Ich glaube kaum, dass es viele Python-Programmierer gibt, die statt print "Hallo Welt" lieber system.console.writeline("Hallo Welt") schreiben.
Naja, gerade die beiden genannten Diskussionen finde ich gar nicht so schlimm. ``lambda`` verspricht einfach mehr als es kann, wenn man weiss was es in anderen Sprachen wie Lisp, Scheme oder Haskell leistet und es geht nicht um die Abschaffung von ``print`` sondern Guido bereut nur, dass er es als Schlüsselwort in die Sprache aufgenommen hat und nicht als einfache eingebaute Funktion. Mit ``print('Hallo Welt')`` als Alternative könnte ich jedenfalls leben.
Mich stört zum Beispiel die Diskussion um `map()`, `filter()` und `reduce()`. Und die Decorator-Syntax ist schon ein wenig "Perl-ish".
