2013-05-19 69 views
0

我不太確定標題是否適合我想要放在桌子上的這個問題。模塊化設計和模塊間參考

我打算創建一個Web MVC框架作爲我的畢業論文,並在之前與我的顧問試圖定義一些成就的對話中,他讓我相信我應該在這個項目中選擇一個模塊化設計。

我已經開發了一些東西,停下來分析它有多少模塊化,我不能真正做到這一點,因爲我不知道「模塊化」的真正意義。

有些事情對我來說不是很清楚,比如說,僅僅引用另一個模塊就會炸燬我係統的模塊性?

比方說,我有一個數據庫訪問模塊,它可以選擇使用緩存模塊來存儲複雜查詢的結果。正如任何人都可以看到的,我至少會對緩存模塊有一個命名依賴關係。

在我的「模塊化設計」概念中,我可以分別分配每個組件,並使其與其他人開發的其他組件交互。在這種情況下,我表明,如果有人想使用我的數據庫訪問模塊,他們也必須採用緩存,即使他不會使用它,僅僅是爲了引用/命名的目的。

所以,我想知道這是否真的是模塊化設計呢。

我想出了一種替代方案,就像單獨創建每個組件,甚至不知道其功能並非絕對需要的其他組件的存在。爲了擴展功能,我可以創建一些基於裝飾器和適配器的結構。

要澄清的東西一點點,這裏是一個例子(PHP):

之前

interface Cache { 
    public function isValid(); 
    public function setValue(); 
    public function getValue(); 
} 

interface CacheManager { 
    public function get($name); 
    public function put($name, $value); 
} 

// Some concrete implementations... 

interface DbAccessInterface { 
    public doComplexOperation(); 
} 

class DbAccess implements DbAccessInterface { 
    private $cacheManager; 

    public function __construct(..., CacheManager $cacheManager = null) { 
     // ... 
     $this->cacheManager = $cacheManager; 
    } 

    public function doComplexOperation() { 
     if ($this->cacheManager !== null) { 
      // return from cache if valid 
     } 
     // complex operation 
    } 
} 

interface Cache { 
    public function isValid(); 
    public function setValue(); 
    public function getValue(); 
} 

interface CacheManager { 
    public function get($name); 
    public function put($name, $value); 
} 

// Some concrete implementations... 

interface DbAccessInterface { 
    public function doComplexOperation(); 
} 

class DbAccess implements DbAccessInterface { 
    public function __construct(...) { 
     // ... 
    } 

    public function doComplexQuery() { 
     // complex operation 
    } 
} 

// And now the integration module 

class CachedDbAcess implements DbAccessInterface { 
    private $dbAccess; 
    private $cacheManager; 

    public function __construct(DbAccessInterface $dbAccess, CacheManager $cacheManager) { 
     $this->dbAccess = $dbAccess; 
     $this->cacheManager = $cacheManager; 
    } 

    public function doComplexOperation() { 
     $cache = $this->cacheManager->get("Foo") 
     if($cache->isValid()) { 
      return $cache->getValue(); 
     } 
     // Do complex operation... 
    } 
} 

現在我的問題是: 這是最好的解?我應該爲所有沒有作爲要求的模塊一起工作,但可以更有效地做到這一點?

任何人都會以不同的方式做到這一點?

我還有一些更多的問題涉及到這個,但我不知道這是否是一個可接受的問題stackoverflow。

P.S.:英語不是我的第一語言,也許某些部分可以得到一點點迷惑

+0

mvc框架畢業論文?聽起來不錯。 和設計模式:谷歌建立一個插件系統,它幾乎是相同的(抽象類獲得工廠實施)。 –

+0

我想過插件,但不太確定是否是相同的東西。插件是爲了擴展系統的功能,在我的情況下,它將成爲系統的一部分。 –

+0

您可以根據需要評分一些插件。我認爲它是作爲抽象類的實現,比如db-interface和sqlite-plugin或者帶標準插件的mysql-plugin作爲普通接口。 –

回答

1

某些資源(不是理論):

+0

不錯......我會仔細研究一下......謝謝...... 任何其他建議也歡迎。我有2個月的時間來決定一系列的工作,並回到我的adivsor更具體的東西,在這個時候,我會挖掘我可以得到的一切... –

+0

祝你好運!很難得到一個具體的起點,我希望它有一點幫助。 –

1

我想出了是一樣的東西單獨創建每個組件的選擇,無一不甚至不知道有關存在不是其功能所需的其他部件

如果你自己提出這個想法,這很好。聲明本身是模塊化編程的關鍵。

插件體系結構在擴展性方面是最好的,但是imho很難維護,尤其是在應用程序內部。取決於插件體系結構的複雜性,它可以通過添加插件邏輯等使代碼更復雜。

因此,對於內部模塊化設計,我選擇基於N層的接口架構。基本上,在這些層中的結構繼電器:

  1. 域/實體
  2. 接口[依靠1]
  3. 服務[依靠1和2]
  4. 存儲庫/ DAL 1和2 [依靠]
  5. 表示層[上1,2,3,4]

依靠不幸的是,我不認爲這是achieveable整齊的PHP項目,因爲它需要分開的項目/ DLL [R每層的推論。但是,遵循該體系結構可以幫助模塊化應用程序。

對於每個模塊,我們需要做基於接口的設計。它可以幫助增強代碼的模塊性,因爲您可以稍後更改實現,但仍然保持消費者相同。

我在這個stackoverflow問題上提供了一個類似於這個基於接口的設計的答案。

最後但並非最不重要的一點,如果你想讓你的應用程序模塊化到UI,你可以做Service Oriented Architecture。這只是使你的應用程序成爲一堆服務,然後讓UI來使用服務。這種設計可以幫助您將用戶界面與邏輯分開。您以後可以使用不同的UI,例如桌面應用程序,但仍然使用相同的邏輯。不幸的是,我沒有任何可靠的SOA來源。編號:

我誤解了這個問題。這是我關於模塊化框架的觀點。不幸的是,我對Zend不太瞭解,因此我將在C#中給出示例:

  • 它由模塊組成,從最小模塊到較大模塊。 C#中的示例是,您可以在應用程序中使用Windows Form(較大),也可以使用Graphic(較小)類在屏幕中繪製自定義形狀。
  • 它是可擴展的或可替換的,無需更改基類。在C#中,您可以將FormLoad事件(可擴展)分配給Form類,繼承FormList類(可擴展)或重寫窗體繪製方法以創建自定義窗口圖形(可替換)。
  • (可選)它很容易使用。在正常的DI接口設計中,我們通常將較小的模塊插入較大的(高級別)模塊中。這將需要一個IOC容器。詳情請參閱我的question
  • 易於配置,不涉及任何神奇的邏輯,如Service Locator Pattern。在谷歌搜索Service Locator is an Anti Pattern

我對Zend瞭解不多,但我猜想Zend中的模塊化可以意味着它可以在不改變內核框架(替換代碼)的情況下進行擴展。

如果你說:

如果有人想用我的數據庫訪問模塊,他們將不得不採取緩存爲好,即使他不會使用它,只是引用/命名目的。

然後它不是模塊化的。它是集成的,意味着你的數據庫訪問模塊在沒有緩存的情況下將不能運行參照C#組件,它選擇提供List<T>BindingList<T>以提供不同的功能。在你的情況下,最好提供CachedDataAccessDataAccess

+0

感謝您的反饋。是的,我也回答了你指出的同一個問題=)。我在**接口的設計方面沒有任何問題**,在應用程序級別,我已經實現了一些真實案例,但是捕捉到我的是在較低級別(框架本身)執行此操作。我不明白爲什麼ZF2或Symfony2可以自稱**模塊化框架。我從來沒有認真對待過他們,但只是閱讀文檔可以看到大量的模塊引用。 –

+0

所以你說你會按照我提出的「解決方案」的方式來做。 –

+0

@HenriqueBarcelos是關於CachedDbAcess的嗎?如果是的話,那麼只有在你提供了DbAccess的情況下,才能處理大部分可能的緩存用例。 – Fendy

1

僅僅參考另一個模塊會激起我係統的模塊化嗎?

不一定。這是一個依賴。有依賴是完全正常的。如果沒有依賴關係,模塊不能互相交互(除非間接進行這種交互,因爲它隱藏了依賴關係並使代碼複雜化,所以一般來說這是不好的做法)。模塊化設計意味着管理依賴關係,而不是去除它們。

一個工具 - 正在使用接口。通過接口引用模塊產生所謂的軟依賴性。這種模塊可以接受任何接口的實現作爲依賴,因此它更獨立,因此更易於維護。

另一種工具 - 設計模塊(及其接口)只有單一的響應性。這也使得它們更加細化,獨立和可維護。

但是有一條線你不應該盲目地應用這些工具可能導致過於模塊化和過於普通的設計。使事物過於細化會使整個系統更加複雜。你不應該解決宇宙問題,製作所有開發人員都可以使用的通用模塊(除非它是你的目標)。首先你的系統應該解決你的域名任務,並且讓事情足夠通用,但不能超過這個。