Észlelése Felülbírált Methods in Perl

szavazat
9

A múlt héten megharapta kétszer véletlenül kényszerítő módszerek alosztálya. Bár nem vagyok nagy rajongója az öröklés, akkor (ab) használja ezt a kérelmet a munka. Amit szeretnék tennie, hogy néhány deklaratív szintaxist, amely szerint az eljárás felülírva a szülő módszer. Valami ilyesmi:

use Attribute::Override;

use parent 'Some::Class';

sub foo : override { ... } # fails if it doesn't override
sub bar { ... }            # fails if it does override

Van egy pár kérdés itt. Először is, ha a módszer terhelési késik valahogy (pl módszerek betöltve keresztül autoload vagy más később telepített szimbólum táblázatot), akkor ez nem érzékeli ezeket a módszereket.

Séta a leszármazási fát is kap hasonlóan drága. Én ezt a Class :: Sniff , de ez nem igazán alkalmas futásra kódot. Tudtam járni a leszármazási fát, és egyszerűen egyezik, ahol egy meghatározott KÓD nyílás a megfelelő szimbólum táblát, és gyorsabb lenne, de ha az eljárás cache érvénytelenítik, amely megszakítaná ha én a cache az eredményeket.

Szóval van két kérdés: ez ésszerű megközelítés, és van egy horog, amely lehetővé teszi, hogy ellenőrizze, ha a módszer cache változott? (Keressen a 'cache' a perldoc perlobj).

Persze, ez nem törik gyártási kód, gondolok csak az, hogy nem, vagy figyelmeztet, amennyiben a TEST_HARNESS környezeti változó aktív (és explicit környezeti változót kényszeríteni, hogy inaktív, ha a termelés kód volt, hogy állítsa be a TEST_HARNESS környezeti változó valamilyen okból).

A kérdést 08/03/2009 15:37
a forrás felhasználó
Más nyelveken...                            


1 válasz

szavazat
6

Az egyik módja annak, hogy ezt érvényesíteni:

package Base;
...
sub new {
    my $class = shift;
    ...
    check_overrides( $class );
    ...
}

sub check_overrides {
    my $class = shift;
    for my $method ( @unoverridable ) {
        die "horribly" if __PACKAGE__->can( $method ) != $class->can( $method );
    }
}

Memoization a check_overrides hasznos lehet.

Ha vannak olyan esetek, ahol szeretné kivételek, van egy alternatív módszer nevét, és az alap osztály hívás, hogy:

package Base;
...
my @unoverridable = 'DESTROY';
sub destroy {}
sub DESTROY {
    my $self = shift;
    # do essential stuff
    ...
    $self->destroy();
}
Válaszolt 08/03/2009 19:38
a forrás felhasználó

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more