Thread Vererbung von Subs ohne OO - Idee? (32 answers)
Opened by marky at 2011-03-25 14:12

topeg
 2011-03-28 17:47
#147002 #147002
User since
2006-07-10
2611 articles
BenutzerIn

user image
2011-03-27T09:08:35 marky
Hallo, Deine erste Aussage stimmt nicht, genau das ist ja der Vorteil auch von require, es wird eben nur einmal reingezogen, egal wie oft es im Code steht

In letzter zeit zu viel mit php gemacht. Wobei sich das PHP verhalten implementieren lässt ;-):
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

package my;
use Carp;

sub test{ croak 'UNIMPLEMENTED '.( caller(0) )[3]; }

package main;

for my $num (0..9)
{
  open(my $fh, '>', 'my.pm');
  print $fh <<EOC;
package my;

sub test{ $num }

1;
EOC
  close($fh);

  if(require 'my.pm')
  {
    print my::test()."\n";
    delete($INC{'my.pm'});
  }
}


2011-03-27T09:08:35 marky
"Note that the file will not be included twice under the same specified name."

Solange der Modulname noch in %INC steht.

2011-03-27T09:08:35 marky
Das Problem mit den Plugins ist klar - aber das ist doch grundsätzlich ein OO-Vererbung Problem, wenn Du Dich nicht an den In- und Output hälst, dann geht der ganze quatsch nicht mehr. Das ist aber normal, da muss man halt aufpassen und genau schauen, was die Funktion macht, die man ersetzt. Aber es gibt einfach keine andere Möglichkeit core-Funktionen zu ersetzen und den Code update-fähig zu halten.

Ich habe mir ja jetzt für die Modul-methode entschieden, dann muss man wenigstens im EXPORT genau festlegen, was man überschreiben will.

Aber ich gebe zu, dass das ein Problem ist, aber ein allgemeines, wenn man überschreiben von Methoden durch einfach vererbungserweiterung zulässt, was aber heute die normale Vorgehensweise darstellt.

Die andere Möglichkeit sind HOOKs, was auch viele machen, da kannst Du aber halt nur ein bestimmten stellen bestimmte Dinge tun, zb. einen Hook nach dem Login etc.

Ich sehe Plugins nicht als Mittel um die Funktionalitäten Umzustellen oder Updates zu ermöglichen. Ich sehe Plugins als Möglichkeit bestimmte Bereiche flexibel zu erweitern. Plugins agieren als Filter, oder bekommen gewisse Ressourcen zugewiesen, die sie unabhängig verwalten.
Es wird zu schnell zu unübersichtlich, wenn man zu viel erlaubt. Wenn man das ganze Programm ändern will soll man davon erben und die Änderungen durchführen. Ich sehe keinen Vorteil darin das über ein Plugin zu erledigen. Aber das ist Ansichtssache. :-)


2011-03-27T09:08:35 marky
In diesem ganzen Thema ist PHP leider extrem weit nach vorne gegangen, das es mir fast schon weh tut, wenn ich sehen muss, wie das hier umsetzen muss. Die haben jetzt richtig geniale Autoload-Funktionen und das OO-Thema ist echt gut umgesetzt, wenn sich die gängigen Design-Pattern anschaut und vergleicht, wie man das in beiden Sprachen jeweils umsetzt, dann ist teilweise wirklich nicht gut in Perl.

Dafür hat es aber ganz andere Probleme und ist beiweitem nicht so einfach einsetzbar wie es einem erzählt wird. Letzten Monat musste ich weite Teile eines PHP-Programms wegen inkopatibiläten zwischen PHP-Versionen umschreiben.
Threading ist noch so ein Thema. Nicht das Perl darin perfekt wäre, aber wenigstens ist es nutzbar. Oder der Garbage-Collector von PHP. Da hat sich zwar schon etwas getan, aber wirklich gut ist er noch lange nicht. Wenn man mit größeren Datenmengen Objektorientiert arbeitet dann bekommt man immer wieder merklichen Memoryleaks.

2011-03-27T09:08:35 marky
Was das grosse Problem ist, ist dass interface nur schwer umzusetzen sind. Normal programmierst Du so Plugins nur gegen ein interface, das interface schreibt vor, welche Subs dann Plugin haben muss und welche Variablen eine Sub haben muss mit Typ. Dadurch ist das nicht mehr so problematisch.

Es ist ein Sache der Betrachtungsweise. Es bleibt halt dir überlassen zu prüfen ob alles korrekt implementiert wurde. Da bieten sich Objekte, can und Analysen der Rückgabewerte an. Sicher andere Sprachen nehmen dir da einige Arbeit ab, aber dafür legen sie dir auch Grenzen auf. So kann es ganz praktisch sein, nicht genau zu bestimmen welchen Typ ein Rückgabewert hat. In anderen Sprachen muss man Casten oder Transferobjekte nutzen. Alles hat sein vor und Nachteile. Zudem finden sich auf Cpan Module, die typisierte Parameterübergaben Implementieren.

View full thread Vererbung von Subs ohne OO - Idee?