2011-02-23 65 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个班。

就像你说的替代方法是做一些类似于有字典的东西,它有自己的一套缺点(首先不是强类型的)。

如果不知道更多关于构架的建议(每个报表是否都有自己的类来显示/检索报表?),我们很难提出其他的选择方案吗?如果是这样的话,那么也许可以重构属性,而不是使用属性来识别过滤器参数)。

总之 - 如果你没有替代品,那么它不能是坏的设计! :-)