convenzioni per i metodi di amicizia in Perl

3

Perl non supporta una relazione di amicizia tra oggetti, né supporta metodi privati o protetti. Di solito ciò che viene fatto per i metodi privati è il prefisso del nome con un carattere di sottolineatura. Occasionalmente ho metodi che penso come metodi amici. Significa che mi aspetto che vengano utilizzati da un oggetto specifico o da un oggetto con una specifica responsabilità, ma non sono sicuro se dovrei rendere pubblico quel metodo (ovvero foo ) o privato ( _foo ) o se c'è una convenzione migliore? c'è una convenzione per i metodi di amicizia?

    
posta xenoterracide 12.09.2012 - 22:21
fonte

3 risposte

1

Non sono a conoscenza di alcuna convenzione o best practice per i metodi di amicizia utilizzati dalla comunità Perl. Se hai sentito la necessità di designare un prefisso per questi metodi, non vedo alcun problema reale, ma non vedo alcun vantaggio in esso. Personalmente lo renderei un metodo "pubblico", senza il carattere di sottolineatura e senza alcun prefisso aggiuntivo.

    
risposta data 13.09.2012 - 00:20
fonte
4

Perl non applica, di per sé, metodi o attributi privati, no. In effetti, Larry Wall era una volta citato come detto:

Perl doesn't have an infatuation with enforced privacy. It would prefer that you stayed out of its living room because you weren't invited, not because it has a shotgun.

Se utilizzi Moose (e se non lo sei, sei veramente veramente dovrebbe), puoi mettere il tuo metodo, che chiamerò foo , in un ruolo , ad esempio Fooable , che può essere composto in più di una classe, consentendo così a foo di essere un metodo in qualsiasi classe che does il ruolo Fooable .

Se si desidera una vera privacy, tuttavia, sembra che MooseX::Privacy Non ho esperienza nell'usarlo.

    
risposta data 13.09.2012 - 00:33
fonte
0

Se vuoi davvero avere la semantica Friend puoi fare qualcosa del genere:

package A;

use Data::Dumper;

sub _friend
{
   die "you are no friend of mine" unless caller(0)->isa(__PACKAGE__);
   my $self = shift;
   "friend";
}

package B;

use base 'A';

sub new
{
   bless {}, shift;
}

sub test_friend
{
shift->_friend;
}

package main;

$bob = new B;

print $bob->test_friend, "\n";

print $bob->_friend, "\n";

Ho chiamato il metodo con un carattere di sottolineatura in modo che Test :: Pod non si lamenterà che non è documentato.

    
risposta data 29.09.2012 - 17:38
fonte

Leggi altre domande sui tag