我有一组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课程中,我们并没有真正的虚拟行为(只有额外的字段)。
在这种情况下你支持或反对贬低,为什么?
答案 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与否,我都赞成采用三种网络方法。