首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在使用MVC模型的Perl Tk (Tkx) GUI编程中避免全局变量

如何在使用MVC模型的Perl Tk (Tkx) GUI编程中避免全局变量
EN

Stack Overflow用户
提问于 2011-11-22 10:23:52
回答 1查看 507关注 0票数 3

我有一个旧的非常大的Perl Tk GUI应用程序,我正在将它重构到Tkx。我想把界面分成几个包,这样我就可以以模块化的方式构建应用程序UI。另外,我希望保持视图与模型的分离,使用一个控制器来提供两者之间的接口。

在我看来,设计它的唯一方法是使用两个巨大的全局变量,一个包含模型($MODEL),另一个包含对分散在许多包中的小部件($UI)的引用。然后,控制器使用如下所示的一系列命令连接这两个接口:

代码语言:javascript
复制
$UI->{'entry_widget'}->configure(-variable=>\$MODEL->{'entry_value'});
$UI->{'button_widget'}->configure(-command=>sub {$MODEL->{'entry_value'} = "New Value"} );

我的问题是:有没有更好的方法来设计应用程序,避免使用这两个大的全局变量($UI和$MODEL)?任何建议都将非常受欢迎。

EN

回答 1

Stack Overflow用户

发布于 2011-11-22 11:13:51

我认为包方法是一种使某些东西全局可用的方法,但不是全局变量。所以像这样的东西,会起作用的:

代码语言:javascript
复制
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', @_ ); }

因此,在包之外,您只需调用以下代码:

代码语言:javascript
复制
my $controller = MVC->controller( $self ); 

获取与对象相关联的控制器。

您甚至可以在访问器中加入一些导出逻辑,例如:

代码语言:javascript
复制
unless ( $ref->can( $domain_name )) { 
    not strict 'refs';
    *{ ref( $ref ) . "::$domain_name" } 
        = sub { _domain( $domain_name, $ref ) }
        ;
}

所以你可以简单地这样做:

代码语言:javascript
复制
$self->view->view_method( @args );
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8221210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档