2011-02-23 66 views
2

我會嘗試更清楚地解釋我的問題,因爲標題有點模糊。我有基類,有一些屬性。比方說,像這樣:軟件架構設計:類的數量

public class BaseClas 
{ 
    public int Property1 { get; set; } 
    public bool Property2 { get; set; } 
    .............................. 
} 

而且我有大約70類,從基類繼承,大多數類只需添加一個或兩個字段,例如:

public class DerivedClas1 : BaseClass 
{ 
    public bool PropertyNew1 { get; set; } 
} 

public class DerivedClas2: BaseClass 
{ 
    public bool PropertyNew2 { get; set; } 
} 

我的問題是我有70個類,其中每個只有一個新類型的布爾型或int或日期時間等字段等我的問題是:這是一個很好的架構設計,以結合這些類以某種方式?如果是的話,我應該如何結合他們?我可以使用某種Dictionary<string,object>,但這不是一個好主意。有什麼建議麼?

(我使用.NET 2.0)

編輯:這些類用於過濾查詢報告purposes.Base類定義基礎過濾器和每個類定義了特定的報告過濾器。

+1

你爲什麼需要70個班?額外的字段代表什麼?他們如何使用? – 2011-02-23 03:53:16

+1

@lodan,我想你應該提供3-4個其他類的例子以及除了你的基類以外的「增加」的屬性,所以我們可以知道後代的變化和種類。 「加」。此外,爲什麼你有這些後裔,這就是你如何使用它們不僅有助於幫助,而且確定設計應該是什麼。 – 2011-02-23 03:55:02

+0

我認爲我們需要了解您認爲70個班級是最佳解決方案的環境。如果所有這些類別都代表完全不同的東西,那麼70個類別可能是要走的路,但不知道他們如何使用它很難說。 – 2011-02-23 04:01:45

回答

4

這一切都取決於你的建築。我可以考慮核心框架中至少有一個類有幾十個,可能有數百個派生類,其中許多隻添加一個或兩個字段,許多甚至沒有這樣做,只有子類才能提供更好的名稱或基本類爲它自己的應用程序特定的抽象。這個班的名字? System.Exception

另一個例子可能是System.Web.Mvc.Controller,雖然它比System.Exception更加擴展(我故意省略了System.Object和System.ValueType)。

你不提供任何實際的例子,所以答案是,是的,它可以是適當的,但也許不是。如果您正在嘗試執行通用數據輸入,而您的「經理」和「員工」是從「Person」派生而來的,而「Person」又是從「DataObject」派生的,這可能是適當的,但我會考慮其他方式。擺脫「數據對象」並擁有多個專門提供數據庫操作的服務,但同樣依賴於整個圖片。

編輯:你剛纔澄清了它的過濾。在這種情況下,您不能使用只定義過濾器類型的系統嗎?

public abstract class Filter { 

} 

public class OrFilter : Filter { 
    public string Clause1 {get; set;} 
    public string Clause2 {get; set;} 
} 

public class ItemMustExistFilter : Filter { 
    public string ItemName {get; set;} 
} 

public class Report { 
    // For the sake of the example, I know that public setters on Lists are not 
    // best practice 
    public IList<Filter> Filters {get;set;} 
} 

這樣的話,你只需要過濾器本身具體的類,並且每個報告都有了這些東西的列表。結合使用泛型(請參閱ram的答案),你應該有一個漂亮的「輕量級」系統。恥辱你在.net 2,否則Dynamic LINQ將是有用的。當然,你不能使用仍然在2.0 CLR上運行的.net 3.5。

1

不知道問題的確切性質。這不是一個問題,你是否需要70個班,更多的是準確描述問題的問題,良好的設計和可維護性。泛型是否有幫助?

public class BaseClass 
{ 
/* some basic properties go here*/ 
} 

public class BaseClass<T>:BaseClass 
{ 

T SomeSpecificProperty {get;private set;} 
} 

所以,當你需要一個「特殊」類,你將有

var myObj = new BaseClass<Bool>(); 

你也應該看看Decorator pattern如果你想「裝飾」你的類。看看DoFactory Example

我的2美分,希望它有助於

0

你所描述聽起來不錯,給我 - 你的每一個報告中有具體介紹了該報告,因此,如果你有過濾器類70份報告,你將有70個班。

就像你說的替代方法是做一些類似於有字典的東西,它有自己的一套缺點(首先不是強類型的)。

如果不知道更多關於構架的建議(每個報表是否都有自己的類來顯示/檢索報表?),我們很難提出其他的選擇方案嗎?如果是這樣的話,那麼也許可以重構屬性,而不是使用屬性來識別過濾器參數)。

總之 - 如果你沒有替代品,那麼它不能是壞的設計! :-)