我有一个旧的非常大的Perl Tk GUI应用程序,我正在将它重构到Tkx。我想把界面分成几个包,这样我就可以以模块化的方式构建应用程序UI。另外,我希望保持视图与模型的分离,使用一个控制器来提供两者之间的接口。
在我看来,设计它的唯一方法是使用两个巨大的全局变量,一个包含模型($MODEL),另一个包含对分散在许多包中的小部件($UI)的引用。然后,控制器使用如下所示的一系列命令连接这两个接口:
$UI->{'entry_widget'}->configure(-variable=>\$MODEL->{'entry_value'});
$UI->{'button_widget'}->configure(-command=>sub {$MODEL->{'entry_value'} = "New Value"} );我的问题是:有没有更好的方法来设计应用程序,避免使用这两个大的全局变量($UI和$MODEL)?任何建议都将非常受欢迎。
发布于 2011-11-22 11:13:51
我认为包方法是一种使某些东西全局可用的方法,但不是全局变量。所以像这样的东西,会起作用的:
package MVC;
use strict;
use warnings;
use Scalar::Util qw<refaddr>;
my %MVCs;
sub _domain {
my ( $domain_name, $ref, $value ) = @_;
my $r = \$MVCs{ $key }{ $domain_name };
return unless $$r or ref( $value );
if ( ref $value ) {
$$r = $value;
}
return $$r;
}
sub model { shift; return _domain( 'model', @_ ); }
sub controller { shift; return _domain( 'controller', @_ ); }
sub view { shift; return _domain( 'view', @_ ); }因此,在包之外,您只需调用以下代码:
my $controller = MVC->controller( $self ); 获取与对象相关联的控制器。
您甚至可以在访问器中加入一些导出逻辑,例如:
unless ( $ref->can( $domain_name )) {
not strict 'refs';
*{ ref( $ref ) . "::$domain_name" }
= sub { _domain( $domain_name, $ref ) }
;
}所以你可以简单地这样做:
$self->view->view_method( @args );https://stackoverflow.com/questions/8221210
复制相似问题