Piszę prosty moduł Perla, który obsługuje informacje o dacie i godzinie. Poniżej znajduje się uproszczona wersja konstruktora i jedna z metod dostępu:
package Time;
# Constructor
sub new {
my $class = shift;
my %args = @_;
# Create an empty object
my $self = bless {};
# Get input arguments
my $second = exists $args{"second"} ? $args{"second"} : (localtime)[0];
# Use the accessor to validate and populate object data
$self->second($second);
return $self;
}
# Second accessor
sub second {
my $self = shift;
my $second = shift;
# Input validation
if (defined $second) {
if ($second =~ m{^d+$} && $second >= 0 && $second <= 59) {
$self->{"second"} = $second;
}
else {
die ""second" must be an integer between 0 and 59!";
}
}
return $self->{"second"};
}
Moje pytanie brzmi... Czy dopuszczalne jest używanie akcesorium w konstrukcji obiektu w Perlu?
Użycie akcesorium wewnątrz konstruktora sprawia, że nie potrzebuję całego kodu walidacyjnego w samym konstruktorze, ponieważ dane wejściowe są sprawdzane przez akcesor, ale czy ta zła praktyka?
Czy jest jakiś powód, dla którego nie chciałbym tego robić?
Odpowiedzi:
2 dla odpowiedzi № 1tak, Możesz to zrobić.
Ale z perspektywy OOP sensowne może być przeniesienie tego kodu do init
metoda, więc tylko konstruktor tworzy obiekt. Jest to zasadniczo zrobione po wywołaniu bless
.
sub new {
my $class = shift;
# Create an empty object
my $self = bless {};
# initialize the object
$self->init(@_);
return $self;
}
sub init {
my ($self, %args) = @_;
# Get input arguments
my $second = exists $args{"second"} ? $args{"second"} : (localtime)[0];
# Use the accessor to validate and populate object data
$self->second($second);
return;
}
Czy rozważałeś użycie? Łoś? Możesz także użyć Wpisz :: Tiny na ograniczenia typu, nawet jeśli chcesz się trzymać ręczny oop.