perl - 在作为另一个对象的访问者的对象列表中搜索

yul*_*vee 3 oop perl moose

我是Perl-OO初学者,我遇到了设计挑战.我希望你能给我一些提示,以获得一个优雅的解决方案.我在这里使用鼠标对象系统.

举个简单的例子,假设我有一个User-Object.用户有一个名字.

package User;
use Mouse;    

has "name" => (
   is        => "rw",
   isa       => "Str|Undef",
);  
Run Code Online (Sandbox Code Playgroud)

然后我有一个User-Cache-Object,它获取所有用户的列表(来自LDAP服务器).您可以说这是用户缓存和用户之间的"有一个"关系.

package UserCache;
use Mouse;    

has "users" => (
   is        => 'rw',
   isa       => 'ArrayRef|Undef',
   default   => sub { [] },
);  
Run Code Online (Sandbox Code Playgroud)

我将此用户列表存储为用户缓存的访问者中的用户对象数组.

 my $cache = UserCache->new();

 foreach my $entry ( $ldap->searchGetEntries() ) { 
      my $user = User->new();
      $user->name($entry->get_value('userdn'));
      push @{ $cache->users }, $user;
 }
Run Code Online (Sandbox Code Playgroud)

现在这就是我的问题所在.如果我想找到具有特定属性的用户对象(例如,名为John的用户),我必须遍历整个用户对象数组并查询每个对象的名称.当给出名称列表时,这会得到一个非常低效的过程.

foreach my $user ( @{ $cache->users } ) {
      if ( $user->name eq 'John' ) {
           #do something with John
      }...
} 
Run Code Online (Sandbox Code Playgroud)

有没有办法以某种方式存储对象列表在其他对象中,我可以有效地搜索?像$ cache-> get_users-> get_name('John')那样返回我需要的对象?

Sin*_*nür 5

你真的不必自己写UserCache课.而是使用CHI缓存要在要用于查找的键下缓存的用户.如果需要,可以将缓存类包装为从特定缓存实现中抽象出来.

另外,你有这个:

push @{ $cache->users }, $user;
Run Code Online (Sandbox Code Playgroud)

泄漏实现细节的地方.相反,您的UserCache对象需要类似于save_user方法的东西,因此它使用的代码不依赖于实现细节.

$cache->save_user( $user );
Run Code Online (Sandbox Code Playgroud)

对于Moose对象,你得到Moose :: Meta :: Attribute :: Native :: Trait :: Array ; 对于Mouse,你得到MouseX :: NativeTraits :: ArrayRef.