hotti: Übergabe/Vererbung von fertigem Objekt

Beitrag lesen

hi,

Warum es die Fehlersuche erschweren soll, musst du erklären.

Beispiel:

  
package MyClass;  
  
use strict;  
use warnings;  
use Carp;  
  
sub new{  
	my $class  = shift;  
	my $fh     = shift;  
	my $self = bless{}, $class;  
	return eval{  
		$self->{FH} = $fh or croak "Missing IO-File-Instance";  
		$self;  
	};  
}  
  
sub getFileContent{  
	my $self = shift;  
	my $filename = shift;  
	return eval{  
		$self->{FH}->open($filename, "r") or croak "IO-Err: $!";  
		read($self->{FH}, my $buffer, -s $self->{FH});  
		$self->{FH}->close;  
		$buffer;  
	};  
}  
  
package main;  
  
use strict;  
use warnings;  
use IO::File;  
use CGI;  
  
my $fh = IO::File->new;  
my $cgi = CGI->new;  
my $obj = MyClass->new($cgi) or die $@;  
# Übergebe das falsche Object in Zeile 38  
  
my $fileContent = $obj->getFileContent("d:/tmp/cookiefile") or die $@;;  
print $fileContent;  

Und jetzt schauen wir uns mal die Fehlermeldung an:

Undefined subroutine CGI::open <

Was sagt das dem Anwender? Gar nichts. Ok, ich könnte das Modul, den Konstruktor verbessern:

  
sub new{  
	my $class  = shift;  
	my $fh     = shift;  
	my $self = bless{}, $class;  
	return eval{  
		croak "The argument is not a 'IO::File'" if ref $fh ne 'IO::File';  
		$self->{FH} = $fh or croak "Missing IO-File-Instance";  
		$self;  
	};  
}

Und bekäme dann folgende FM:

The argument is not a 'IO::File' at pack.pl line 38 <

Da kann ich aber auch gleich selbst die Klasse IO::File in MyClass einbinden, das spart mir die Prüfung und dem Anwender der Klasse die extra notwendige Objekterstellung (mit einer eigenen Prüfung, ob die erfolgreich war).

Fertig:

  
package MyClass;  
  
use strict;  
use warnings;  
use IO::File;  
use Carp;  
  
sub new{  
	my $class  = shift;  
	my $self = bless{ FH => undef}, $class;  
	return eval{  
		$self->{FH} = IO::File->new or croak "Can' create FileHandle";  
		$self;  
	};  
}  
  
sub getFileContent{  
	my $self = shift;  
	my $filename = shift;  
	return eval{  
		$self->{FH}->open($filename, "r") or croak "IO-Err: $!";  
		read($self->{FH}, my $buffer, -s $self->{FH});  
		$self->{FH}->close;  
		$buffer;  
	};  
}  
  
package main; # AnwenderScript  
  
use strict;  
use warnings;  
  
my $obj = MyClass->new() or die $@;;  
  
my $fileContent = $obj->getFileContent("d:/tmp/cookiefile") or die $@;;  
print $fileContent;  

Hotti