Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]8341[/thread]

Abstrakte Klassen und Interfaces in Perl (Seite 2)

Leser: 3


<< |< 1 2 3 >| >> 22 Einträge, 3 Seiten
Gast Gast
 2006-09-19 00:46
#69981 #69981
-- schnipp --
In der objektorientierten Programmierung (OOP) vereinbaren Schnittstellen (engl. Interface) gemeinsame Signaturen von Klassen. Das heißt, eine Schnittstelle vereinbart die Signatur einer Klasse, die diese Schnittstelle implementiert. Das Implementieren einer Schnittstelle stellt eine Art Vererbung dar.

Die Schnittstelle gibt an, welche Methoden vorhanden sind (bzw. vorhanden sein müssen) und wie sie zu verwenden sind.
(wikipedia)
-- schnapp --
Das hatte ich gemeint.

Es gibt ja das OO-Prinzip "Trennung der Schnittstelle von der Implementierung". Gut, die Befolgung dieses Prinzips liegt zum grossen Teil beim Entwickler selbst, mit Perl lässt sich das vielleicht hinbekommen, aber es ist keine Verpflichtung, es gibt keinen Mechanismus, der etwas strikter darauf achtet.
Ich denke, zu einer Schnittstelle gehoeren doch auch Signaturen etc. Ja, Java ist nicht Perl, ist mir klar und das ist ja auch gut so :)

Interessant wäre doch aber zum Beispiel die Möglichkeit, falsche Benutzungen von Methoden nicht erst zur Laufzeit mitzubekommen sondern schon mit perl -c. Finde ich.
Ronnie
 2006-09-19 08:09
#69982 #69982
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Tja, das setzt eine stark typisierte Sprache voraus - dann nimm halt eine!
sid burn
 2006-09-19 11:01
#69983 #69983
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Quote
... mitzubekommen sondern schon mit perl -c. Finde ich.

Oder Schreib dein kompletten Code immer in einem CHECK{} Block. ;)

----
EDIT:

Beziehungsweise kann man auch einfach eine Subroutine folgendermaßen definieren
Quote
sub default_color { die "Methode default_color muss definiert werden!" }


Im Konstruktor benutzt du nun diese Subroutine um dein hash zu füllen. Wurde die Subroutine nicht von der vererbten Klasse Überschrieben bricht dein Programm halt ab.

Oder du schreibst halt eine Subroutine _check_methods die dann die Methoden aufruft und ihre Rückgabewerte überprüft. Diese Methode kannst du dann ja im Konstruktor aufrufen.


Allerdings hält es niemanden davon ab _check_methods einfach zu überschreiben. Den ersten Fall würde ich machen. Den zweiten eher nicht. Ich persönlich sehe da auch zur Zeit (mit meinem bisherigen Wissen) kein Bedarf darin soetwas zu wollen.\n\n

<!--EDIT|sid burn|1158650646-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
renee
 2006-09-19 11:13
#69984 #69984
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ich hatte mal versucht, so etwas Wiki:nachzubilden. Es sind halt keine echten Interfaces und es ist eher hässlich.

Falsche Benutzung von Subroutinen kannst Du auch mit Perl 5 verhindern:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!perl
use strict;
use warnings;


sub test($);
sub hallo(\@$);

my @array = qw(3 2 1);
test('hallo','welt');
hallo(@array,'foo');

sub test($){
print join(" ",@_);
}

sub hallo(\@$){
print scalar(shift),' ',shift;
}
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Dubu
 2006-09-19 11:31
#69985 #69985
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=renee,19.09.2006, 09:13]Falsche Benutzung von Subroutinen kannst Du auch mit Perl 5 verhindern:[/quote]
Bei Funktionen ja, aber nicht bei Methoden.
Gast Gast
 2006-09-19 13:38
#69986 #69986
[quote=nepos,18.09.2006, 16:40]Sowie ich das Class::Trait sehe, ist das eher eine Nachbildung der Properties, die bei Windows-Programmierung oft genutzt werden. Sieht mir nicht so recht nach Interfaces aus.[/quote]
Trait sieht schonmal ganz gut aus, aber leider funktioniert das angegebene Beipiel nicht. Und das ist nur für einen Methodenalias, nicht mal für REQUIRE. Das Require-Beispiel mach überhaupt nichts weiter...

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package Loam;
use Class::Trait (
'TPrintable' => {
alias => { "strVal" => "stringValue" },
exclude => "stringValue",
}
);

sub stringValue { print 'done' }
1;

package main;
use strict;
use Loam();
1;


Hier kommt nur:

Attempt to alias method (strVal) that is not in trait (TPrintable) at Loam.pm line 3

Hat jemand ein einfaches, laufendes Beispiel für:

-Die Klasse "Loam" definiert, dass es die Methode "breath" geben muss, implementiert aber nix.

-Die Klasse "Human" erbt von Loam, enthält sonst aber nix.

-Die Klasse Human wird via "use" einegbunden und nirgends verwendet. Via Compiletime soll im günstigsten Fall gemeckert werden, dass die Methode "breath" definiert werden muss.

Irgendwer eine Idee?
renee
 2006-09-19 13:40
#69987 #69987
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
hast Du Dir mal den verlinkten Wiki-Artikel angeschaut?
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Gast Gast
 2006-09-19 14:00
#69988 #69988
Hmmm, schon mal nicht schlecht. Gibt es einen anderen Weg, an die definierten Methoden einer Klasse heranzukommen, außer über das Einlesen des Klassenquellcodes?
renee
 2006-09-19 14:06
#69989 #69989
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ja, schau Dir mal den Quellcode von CPAN:Devel::Cover, CPAN:Pod::Coverage und CPAN:Test::TestCoverage an...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Gast Gast
 2006-09-19 14:22
#69990 #69990
Ich bevorzuge Class::Inspector, wurde speziell für diese Zwecke
geschaffen.
<< |< 1 2 3 >| >> 22 Einträge, 3 Seiten



View all threads created 2006-09-18 15:28.