我是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')那样返回我需要的对象?
你真的不必自己写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.