0

私は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; }
}

ReportBase を返す Web メソッドがあります。呼び出し元は、戻り値を使用して、型をダウンキャストしてチェックすることにより、実際の型に基づいて UI(WPF) を更新します (1 つのグリッドは販売用で、もう 1 つは購入用)。誰かが、3 つの Web メソッドを使用し、それぞれが特定の型を返すことを提案しました。

if/elseを導入することで、ダウンキャストは一般的に設計原則に反することがわかりました。代わりに、仮想関数を使用する必要があります。しかし、POCO クラスでは、実際には仮想動作はありません (追加のフィールドのみ)。

この場合、あなたはダウンキャストに賛成ですか反対ですか、なぜですか?

4

1 に答える 1

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であろうとなかろうと、私は3つのWebメソッドのアプローチを支持すると思います.

于 2012-03-16T12:52:29.960 に答える