首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >软件架构设计:类的数量

软件架构设计:类的数量
EN

Stack Overflow用户
提问于 2011-02-23 11:50:11
回答 3查看 404关注 0票数 2

我会尝试更清楚地解释我的问题,因为标题有点模糊。我有一个基类,它有一些属性。让我们这样说:

代码语言:javascript
复制
public class BaseClas
{
    public int Property1 { get; set; }
    public bool Property2 { get; set; }
    ..............................
}

我有大约70个从基类继承的类,这些类中的大多数只添加了一个或两个字段,例如:

代码语言:javascript
复制
public class DerivedClas1 : BaseClass
{
    public bool PropertyNew1 { get; set; }
}

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

我的问题是,我有70个类,每个类都只有一个bool、int或datetime等类型的新字段。我的问题是:以某种方式组合这些类是一个好的架构设计吗?如果是这样,我应该如何组合它们呢?我可以使用某种Dictionary<string,object>,但这不是一个好主意。有什么建议吗?

(我使用的是.Net 2.0)

编辑:这些类用于筛选报表查询,purposes.Base类定义基本筛选器,每个类定义特定于报表的筛选器。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-23 12:02:00

这完全取决于您的架构。我能想到在核心框架中至少有一个类有几十个,可能是几百个派生类,其中许多派生类只添加一个或两个字段,而许多派生类甚至不添加字段,只有一个子类,以便为自己的特定于应用程序的抽象提供一个更好的名称或基类。这个类的名称是什么?System.Exception

另一个例子可能是System.Web.Mvc.Controller,尽管它比System.Exception更具伸缩性(我特意省略了System.Object和System.ValueType )。

你没有提供任何真实的例子,所以答案是,是的,它可以是合适的,但也可能不是。如果你试图做一个通用的数据输入,其中你有“经理”和“雇员”,它们是从"Person“派生的,而”Person“又派生自"DataObject",这可能是合适的,但我会考虑其他方法,例如,去掉"DataObject”,拥有多个提供数据库操作的专业服务,但同样,这取决于整体情况。

编辑:你刚刚澄清了它是用来过滤的。在这种情况下,您不能使用只定义筛选器类型的系统吗?

代码语言:javascript
复制
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.0CLR上的.net 3.5吗?

票数 4
EN

Stack Overflow用户

发布于 2011-02-23 12:04:54

不知道你的问题的确切性质。这不是你是否需要70个类的问题,更多的是对手头问题的准确描述,良好的设计和可维护性的问题。泛型有帮助吗?

代码语言:javascript
复制
public class BaseClass
{
/* some basic properties go here*/
}

public class BaseClass<T>:BaseClass
{

T SomeSpecificProperty {get;private set;}
}

因此,当您需要一个“特定”类时,您将拥有

代码语言:javascript
复制
var myObj = new BaseClass<Bool>();

如果你想“装饰”你的类,你也应该研究一下Decorator pattern。看看DoFactory Example

我的2分,希望能有所帮助

票数 1
EN

Stack Overflow用户

发布于 2011-02-23 12:07:52

您所描述的内容对我来说听起来很好--您的每个报告都有一个描述特定于该报告的筛选器的类,因此如果您有70个报告,那么您将有70个类。

就像您所说的,另一种选择是使用字典,这有它自己的缺点(首先它不是强类型的)。

在不了解体系结构的情况下建议其他替代方案是很棘手的(每个报告都有自己的类来显示/检索报告吗?如果是这样的话,也许你可以重构,这样属性就在那个类上,使用属性来识别过滤器参数)。

简而言之-如果你没有其他选择,那么它不可能是糟糕的设计!:-)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5086808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档