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

标签 perl oop moose

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

举个简单的例子,假设我有一个用户对象。用户有名字。

package User;
use Mouse;    

has "name" => (
   is        => "rw",
   isa       => "Str|Undef",
);  

然后我有一个用户缓存对象,它获取所有用户的列表(来自 LDAP 服务器)。可以说这是用户缓存和用户之间的“has-a”关系。

package UserCache;
use Mouse;    

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

我将此用户列表作为用户对象数组存储在用户缓存的访问器中。

 my $cache = UserCache->new();

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

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

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

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

最佳答案

您实际上不必自己编写 UserCache 类。相反,请使用 CHI在要用于查找的键下缓存要缓存的用户。如果你愿意,你可以包装你的缓存类以从特定的缓存实现中抽象出来。

另外,你有这个:

push @{ $cache->users }, $user;

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

$cache->save_user( $user );

对于 Moose 对象,您会得到 Moose::Meta::Attribute::Native::Trait::Array ;对于鼠标,您会得到 MouseX::NativeTraits::ArrayRef .

关于perl - 在作为另一个对象的访问器的对象列表中搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40086810/

相关文章:

perl - 在 perl 中将唯一的正则表达式输出记录到数组时出现问题

string - 如何使用 Unicode::Normalize 创建最兼容的 windows-1252 编码字符串?

perl - 文件中最常用的字符串

php - 多重继承和多态有什么区别?

perl - 正确的 Perl OO 继承

php - 从静态方法中创建类实例

oop - ABAP 对象中的 `ADD-CORRESPONDING` 相当于什么?

perl - 驼鹿触发调用者

perl - 除了Catalyst之外,是否还有任何其他现代(Moose/PSGI)Web框架?

perl - Moose 中的单例角色