/ / Czy mogę użyć metod dostępu w konstruktorze? - perl, oop, konstruktor, akcesor

Czy mogę używać metod akcesorów w konstruktorze? - perl, oop, constructor, accessor

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 № 1

tak, 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.