gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:21:00 26 4
gpt4 key购买 nike

我有一个非常大的旧 Perl Tk GUI 应用程序,我正在将其重构为 Tkx。我想将界面分成几个包,这样我就可以以模块化的方式构建应用程序 UI。此外,我希望将 View 与模型分开,使用 Controller 在两者之​​间提供接口(interface)。

在我看来,设计它的唯一方法是使用两个巨大的全局变量,一个保存模型($MODEL),另一个保存对分布在许多包中的小部件($UI)的引用。然后, Controller 使用如下一系列命令连接两者:

$UI->{'entry_widget'}->configure(-variable=>\$MODEL->{'entry_value'});
$UI->{'button_widget'}->configure(-command=>sub {$MODEL->{'entry_value'} = "New Value"} );

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

最佳答案

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

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 ); 

获取与对象关联的 Controller 。

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

unless ( $ref->can( $domain_name )) { 
not strict 'refs';
*{ ref( $ref ) . "::$domain_name" }
= sub { _domain( $domain_name, $ref ) }
;
}

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

$self->view->view_method( @args );

关于perl - 如何使用 MVC 模型避免 Perl Tk (Tkx) GUI 编程中的全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8221210/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com