Da sprichst Du viele wichtige Punkte an!
Zu einigen kann ich auch etwas sagen:
2022-01-26T12:31:46
hlubenowGibt ja mehrere solcher Ansätze, wie z.B. "Moose".
Ja.
Moose war für mich ein "Game Changer". Ich war da erst skeptisch, hab's dann mal für ein paar Komponenten ausprobiert... und festgestellt, dass bei denen die Weiterentwicklung viel einfacher ist. Das wichtigste ist, dass vieles, was man im "traditionellen" Perl-OO ausprogrammieren muss, bei Moose als Deklaration hingeschrieben wird, dadurch sieht das aufgeräumter aus.
2022-01-26T12:31:46
hlubenowIch denke, in den Core sollte es erst, wenn man sich wirklich sicher sein kann, daß es auch das Richtige ist. Nicht, daß es eine Verschlimmbesserung wird. Die anderen Ansätze sind ja in Modulen. Das wäre zum Ausprobieren wohl erstmal besser. Und dann sehen, wie es in der Community so ankommt.
Das findet ja seit geraumer Zeit statt!
Object::Pad ist das Modul zum Ausprobieren. In den Diskussionen zu den Links, die GwenDragon geschickt hat, den Fehlermeldungen zu dem CPAN-Modul, im IRC unter #cor und gelegentlich auf reddit und anderen Foren sammelt der Autor Feedback ein. Die letzten großräumigen Änderungen kamen nach einem
epischen Kommentar von Damian Conway im perl.org Blog, und inzwischen ist es als RFC bei den Perl 5 Porters eingereicht.
2022-01-26T12:31:46
hlubenowWichtig wäre halt, daß die Dinge dadurch nicht komplizierter und langsamer werden, so daß man das Gefühl hat, daß die alte Perl-OOP immer noch schneller und direkter ist. Dann wird die nämlich weiterhin bevorzugt.
Es wird definitiv schneller als Moose und nicht langsamer als traditionelles OO. "Im Core" heißt ja: In C implementiert. Die anderen OO-Systeme werden noch lange am Leben bleiben, weil sie jede Menge Magie dazugebastelt haben, immer wohl wissend, dass das alles "nur" Hashes und Unterprogramme sind. Diese Magie wird anfangs bei Cor fehlen.
2022-01-26T12:31:46
hlubenow[...] Was mich stört, sind die vielen "$self->{beispiel}", die man schreiben muß. Da ist das Pendant "self.beispiel" in Python doch sehr viel einfacher zu schreiben, und es macht die Programme auch angenehmer zu lesen.
In Cor schreibt man einfach
$beispiel, weil solche Objektattribute als
field $beispiel; deklariert werden.
2022-01-26T12:31:46
hlubenowDas Zweite ist der AoA-Mechanismus mit Referenzen, der schon sehr gewöhnungsbedürftig ist. "$self" selbst ist ja eine "Referenz auf einen anonymen Hash". Da muß man erstmal begreifen, was das überhaupt ist und wie man damit umgeht. Das ist wohl das eigentliche Problem. Wenn man schon in den Core eingreifen würde, dann sollte man das wohl grundsätzlich überarbeiten, damit auch solche Verrenkungen wie
for $i (@{$self->{beispiel}}) {
print "$i\n";
}
nicht mehr nötig wären.
In Cor wäre das:
field @beispiel;
for $i (@beispiel) {
print "$i\n";
}
Womit wir bei einem wesentlichen Unterschied zu traditionellem OO und Moose wären: Objektattribute können auch Arrays und Hashes sein.
2022-01-26T12:31:46
hlubenowAber wahrscheinlich geht das nicht, denn dafür ist Perl eben Perl.
Doch, das geht eben schon, wenn es "im Core" ist! Eine der großen Leistungen von Moose ist, dass es "Pure Perl" ist und auf prähistorischen Perl-Versionen läuft. Cor ist da anders und wird nur mit entsprechend aktueller Perl-Version laufen.
2022-01-26T12:31:46
hlubenowAnsonsten, ob da nun "class" statt "package" steht, und "method" statt "sub", wäre (obwohl's schon schöner ist) nicht so wichtig, wenn die anderen Probleme nicht gelöst werden können.
Diese neuen Schlüsselwörter sind es, die
field etc. möglich machen. Innerhalb eines
class Beispiel { ... } oder
method beispiel { ... } gelten Syntax-Regeln, die in "Pure Perl" gar nicht zu schreiben sind!
Das ist ein weiterer Unterschied zu Moose: Die "Schlüsselwörter" von Moose sind gar keine. Das sind Perl-Unterprogramme, die Moose exportiert. Deswegen kann
has in einer Moose-Deklaration
has beispiel => ( is => 'ro' ); auch nur das, was ein Perl Unterprogramm kann. Das wird recht geschickt mit den "fat commas"
=> versteckt, aber tatsächlich ist es ein Aufruf
Moose::has ('beispiel','is','ro');. Ein Array als Attribut kann bei Moose deswegen nicht so geschrieben werden:
has @beispiel würde die ersten Elemente des Array
@beispiel an
has übergeben und ziemlich zufällige Ergebnisse produzieren.
2022-01-26T12:31:46
hlubenowIn Python sind diese Punkte seit langem alle sehr gut gelöst, da steht dann nur:
for i in self.beispiel:
print i
Das ist praktisch optimal, aber dafür ist Python insgesamt sehr dogmatisch, und die Community leider auch. Perl ist - bisher - offener, freier, und das schätze ich. Heute mehr denn je.
Eben - dieses Beispiel wäre in Cor auch noch kürzer:
field @beispiel;
print @beispiel;