2014-04-17 59 views
0

我需要知道,如果這種做法對於使用模塊的精細與否:Perl的循環使用的模塊

MyApp.pm

package MyApp; 
use Moose; 
use MyApp::View; 
use MyApp::Config; 

sub view { 
    return MyApp::View->new; 
} 
sub config { 
    return MyApp::Config->new; 
} 

MyApp的/ View.pm

package MyApp::View; 
use Moose; 
extends qw(MyApp); 

sub render { 
} 

MyApp的/配置.pm

package MyApp::Config; 
use Moose; 
extends qw(MyApp); 

sub get { 
} 

App.cgi

#App.cgi 
use Moose; 
extends qw(MyApp); 
my $view = MyApp->view(); 
my $config = MyApp->config(); 
.... 

我很困惑,因爲我在MyApp中使用「使用MyApp :: View」,然後使用「extends qw(MyApp);」在Config模塊中。這被認爲是不好的循環?

關於這個想法我想在App.cgi的同一個實例中,將MyApp模塊中的所有方法和變量與View和Config模塊共享。

+0

如果你使用Moose,你不需要自己寫一個構造函數('sub new')。這是穆斯的目的。 – simbabque

+0

也有代碼中的拼寫錯誤。請將您的確切代碼複製到問題中,並確保它事先運行。你真的嘗試過嗎? – simbabque

+0

您不僅需要*在Moose代碼中編寫'sub new',這樣做是錯誤的。 – hobbs

回答

3

這是非常正常的,不是特別糟糕。唯一需要注意的是,在編譯和運行的程序包體MyApp::ViewMyApp::ConfigMyApp不會完全編譯,以及它的一些方法可能不存在,因爲MyApp無法繼續編譯之後才MyApp::ViewMyApp::Config負荷。在正常執行應用程序期間(在use MyApp完成之後),不存在這樣的問題。由於您在BEGIN塊或包體本身中沒有做任何有趣的事情,所以我沒有看到任何問題。

+0

根據你的調查,我做了一些關於自動加載模塊的搜索,我發現了一些像「使用autouse'鯉魚'=> qw(鯉魚呱呱);」可能會解決你害怕的東西。這會解決這個問題,並沒有問題嗎?如果是這樣,爲什麼我們不使用「autouse」總是延遲加載模塊直到真正需要或使用它? – daliaessam

+0

我在cpan上找到了模塊[稍後](http://search.cpan.org/~erwan/later-0.04/lib/later.pm),並且非常容易使用它,例如'稍後使用'MyApp :: Config';唯一的缺點是,它將子AUTOLOAD注入到包和調用者中。 – daliaessam