Даункаут на уроках POCO - PullRequest
       42

Даункаут на уроках POCO

0 голосов
/ 16 марта 2012

У меня есть группа классов 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. Вызывающая сторона использует возвращаемое значение для обновления пользовательского интерфейса (WPF) на основе фактического типа путем уменьшения и проверки типа (одна сетка для продажи и одна для покупки). Кто-то предложил использовать три веб-метода, каждый из которых возвращает определенный тип.

Я понимаю, что снижение в целом противоречит принципу проектирования, вводя if / else. Вместо этого мы должны использовать виртуальные функции. Но в классе POCO у нас на самом деле нет виртуального поведения (только дополнительные поля).

Вы за или против удрученного в этом случае, почему?

1 Ответ

1 голос
/ 16 марта 2012

ИМО это все о намерениях.Возврат только базового класса ничего не говорит, тем более, что вы возвращаете его только для сохранения некоторых нажатий клавиш.Как разработчик, что вы предпочитаете:

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

Какой подход вы хотели бы использовать, чтобы сделать код более понятным?В конце концов, проверка типа и обратное преобразование - это деталь реализации, и у вас, вероятно, есть такой метод

public void AssignReport(ReportBase report)
{
    //check, cast and dispatch to the suitable 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 или нет, я предпочтуподход веб-методов.

...