关于POCO课程的沮丧

时间:2012-03-16 05:29:34

标签: c# polymorphism poco downcast

我有一组POCO课程:

class ReportBase
{
    public string Name { get; set; }
    public int CustomerID { get; set; }
}

class PurchaseReport : ReportBase
{
    public int NumberOfPurchases { get; set; }
    public double TotalPurchases { get; set; }
    public bool IsVip { get; set; }
}

class SaleReport : ReportBase
{
    public int NumberOfSales { get; set; }
    public double TotalSales { get; set; }
}

我有一个Web方法来返回ReportBase。调用者使用返回值根据实际类型通过向下转换和检查类型来更新UI(WPF)(一个网格用于销售,一个用于购买)。有人建议使用三种Web方法,每种方法都返回特定类型。

据我所知,通过引入if / else,downcast一般违反设计原则。相反,我们应该使用虚函数。但是在POCO课程中,我们并没有真正的虚拟行为(只有额外的字段)。

在这种情况下你支持或反对贬低,为什么?

1 个答案:

答案 0 :(得分:1)

IMO一切都与意图有关。只返回基类没有说什么,特别是当你返回它只是为了节省一些击键。作为开发人员你更喜欢什么?

ReportBase GetReport() // if type==x downcast.
//or
PurchaseReport GetPurchaseReport()
SaleReport GetSalesReport()

您希望使用哪种方法来使代码更易于维护?检查类型和向下转换毕竟是一个实现细节,你可能有这样的方法

public void AssignReport(ReportBase report)
{
    //check, cast and dispatch to the suitable UI
}

这有什么问题?它缺乏透明度,这种方法应该始终知道哪些UI元素需要哪些报告。每次添加/删除元素时,都必须修改此方法。

我认为这是非常明确和可维护的

salesGrid.DataSource=repository.GetSalesReport();
purchaseGrid.DataSource=repository.GetPurchaseReport();

比这个

var report=repository.GetReport();
AssignReport(report); //all UI elements have their data assigned here or only 2 grids?

所以我认为,无论POCO与否,我都赞成采用三种网络方法。