ruby vs python (is: Programmierung)
Thorsten Roggendorf
thorsten.roggendorf at uni-bielefeld.de
Tue Nov 9 11:56:25 CET 2004
> wie misst man die objektorientiertheit einer sprache?
Es gibt unterschiedliche Programmier-Sprachen-Paradigmen, z.B.
prozedurale Programmierung (Basic, C, fast alle klassischen Sprachen),
objektorientierte Programmierung (Smalltalk, Eiffel, Java) und
funktionale Programmierung (Haskell, Scheme). Es gibt auch andere
Einteilungen, siehe http://en.wikipedia.org/wiki/Programming_paradigm.
Einige Sprachen unterstützen mehrere Paradigmen: Mit C++ und Python kann
man sowohl objektorientiert als auch prozedural programmieren. Ruby ist
rein objektorientiert.
Das hat keinen Nachteil, da man auch mit Ruby Code schreiben kann, ohne
Objekte zu definieren (nicht aber ohne Objekte zu benutzen, da alles ein
Objekt ist). Für die meisten nicht-Kenner ist so ein Programm von Code
in prozeduralen Sprachen kaum zu unterscheiden.
Es hat aber den entscheidenden Vorteil, dass Ruby konsistenter ist als
Python, und das es bessere Möglichkeiten der Introspektion besitzt.
Konsistenz:
In Python benutzt man manchmal Objekt-Methoden und manchmal globale
Funktionen. Der Standard for-Loop sieht z.B. so aus:
for i in range():
print array[i]
range(...) ist ein Funktionsaufruf. Bei Ruby benutzt man immer
Iteratoren, die von den Objekten geliefert werden. Um durch ein Array zu
iterieren z.B.:
array.each {|element| print element}
Schleife von null bis 10 (einschließlich) in Ruby:
0.upto(10) {|i| print array[i]}
Wie gesagt, alles ist ein Objekt. 0 ist z.B. ein Objekt vom Typ Integer
...
> > sowie in vielen Details mehr überzeugt, aber das ist
> > Geschmackssache.
>
> du machst mich neugirig, was sind das für details?
Dadurch, dass alles ein Objekt ist und alle eine gemeinsame Basis-Klasse
haben, die bestimmte Methoden implementiert, kann man alles, was man so
als Argument in eine Methode reingereicht bekommt, bestimmte Fragen
stellen. Bei einer schwach typisierten Sprache (wie Ruby und Python) ist
das ein entscheidender Vorteil.
Bei den Iteratoren hast Du die Syntax schon gesehen, da werden
Code-Blöcke als Argument an Methoden übergeben. Das Konzept ist erstmal
harter Tobak wenn mans nicht kennt, aber es ist eigentlich schnell zu
verstehen und ist ausgesprochen mächtig. Auch die andere Seite, eine
Methode, die einen Block als Argument akzeptiert, ist einfach zu
implementieren.
Ich kann bereits definierte Klassen nochmal aufmachen und Methoden
hinzufügen. So kann man z.B. in einem kleinen Skrip seinen Arrays
Statistik beibringen, ist ganz einfach, brauch man keine Vererbung für.
Ruby unterstützt keine mehrfache Vererbung (wie bei Sprachen mit
gemeinsamer Basisklasse aller Objekte üblich), dafür aber eine extrem
einfache, mächtige und elegante Form des Mix-Ins. In "Modulen" kann ich
Sammlungen von Methoden definieren. Dabei kann ich auf Variablen der zu
erweiternden Klassen zugreifen (was vom Objektorientierten Standpunkt
aber keine gute Idee ist, aber Ruby lässt dem Programmierer allgemein
recht viel Freiheit, wenn er seinen Code partout kaputt-programmieren
will) - der jeweils gültige Namensbereich ist recht intuitiv und
nützlich gewählt.
In der zu erweiternden Klasse rufe ich include Module auf und habe dann
alle Methoden des Moduls.
Ruby unterstützt einige wichtige Patterns und "best praxis" von Haus
aus: z.B. Singleton und Unit-Testing.
Reguläre Ausdrücke sind tief in die Sprache integriert (Perl-Erbe, Ruby
wird oft als Perl-Nachfolger angesehen, sieht aber meist nicht so
kryptisch aus).
Die Standard-Bibliothek ist fabelhaft.
So, das waren eher keine Details sondern grundlegende Punkte. Details
sind ja die kleinen Dinge, über man sich so unterwegs freut. Das sind
aber meist Details der Implementierung von Bibliotheken, die man
benutzt. Doch diese Implementierungen hängen wiederum von der Syntax der
Sprache ab, daher hier die Fundamente.
Was ich an Python übrigens besser finde, ist die Kennzeichnung von
Blöcken durch Einrückung. Daran scheiden sich zwar die Geister, doch
wenn man bedenkt, dass Code i.d.R. mehr gelesen als geschrieben wird,
ist ein einheitliches Einrückungs-Muster viel wert.
Zum Abschluss sei gesagt, dass ich zwar mal in Python programmiert habe,
das meiste aber inzwischen vergessen habe, da ich für Fun-Projekte nur
noch Ruby benutze. Ach ja, das ist der wichtigste Punkt: Ruby macht mehr
Spaß, vielleicht muss man dafür das Paradigma der Objekt-Orientierung
aber tief verinnerlicht haben.
Gruß
Thorsten
More information about the Linux
mailing list