我是一名 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/