2009-10-01 54 views
4

當我想要應用DRY原則,即統一不同用例的多個Struts動作代碼(例如管理員角色和操作員角色)時,一個選項是使用一個抽象基類「BaseAction」,然後使用「AdminAction擴展BaseAction」和「OperatorAction擴展BaseAction」。我會爲抽象的NewBaseAction,UpdateBaseAction,DeleteBaseAction,ListBaseAction應用繼承。Struts動作和組合繼承

但有一個原則,說:「支持組成繼承」(http://www.artima.com/lejava/articles/designprinciples4.html)。有沒有辦法通過使用接口以乾淨的方式實現這個?

回答

2

聲明「贊成組合優於繼承」這是一般設計更好的線索。像Struts這樣的框架引入了自己的編程模型。所以你應該以堅持Struts最佳實踐的方式編寫Struts動作。

在你的情況下寫基類是不錯的。問題是如何設計動作類層次結構,例如考慮使用DispatchAction作爲您的基本操作類的一部分功能。它可以幫你避免創建許多不必要的類。

查找「Struts方式」DRY原理的用例。多個支柱的最佳實踐,你會發現在自由書Struts Survival Guide

+0

感謝您提供免費struts圖書的鏈接 – poseid 2009-10-06 13:23:44

0

補充說明:

考慮到「新」,「更新」往往是非常,非常類似的操作,而且往往是相同的動作,例如,使用單個case語句,而不是兩個支持兩個不同JSP的不同類。

2

「過度繼承利於組合物」的解決辦法是任一:

  1. 移動共享碼成由所有Action S IN問題使用單獨的,非Action類,或
  2. 動議不同代碼到一個單獨的,非Action類,並有一個Action可以使用任何這些行爲。

它一直以來我所做的Struts了幾年,但我認爲(2)你需要在struts-config.xml有點掛羊頭賣狗肉,配置幾個<action>相同的S Action類的,使用不同的參數,並具有Action能夠根據參數加載或選擇不同的行爲實現。這似乎有點不Strutsy,因爲它需要一些通常在struts-config.xml中的控制邏輯並將其隱藏在代碼中。

但取決於你的發展文化,可能實際上被認爲是一件好事。

構圖方法是否值得做取決於您需要共享哪些代碼以及嘗試從Struts樣板中分離代碼是否合理。

我上次使用的最後一個Struts應用程序,我們使用了繼承。可能是正確的做法,可能是我們只是不知道更好。