Генератор отчетов у которого (у отчета) есть конвертируемый показатель

236
13 мая 2017, 17:46

Есть в базе таблица с результатами тестов

Как и обычно по навигационным свойствам осуществляется доступ к другой информации, к такой как фамилия, имя, название теста и т.д.

При создании модели отчета для некоторых тестов необходимо значение поля Grade5 конвертировать в строковой эквивалент. Например:

2 => "Уровень ниже базового"

3 => "Базовый уровень"

или

2 => "Не зачет"

5 => "Зачет"

Для разных тестов по разному и необходимо обеспечить эту гибкость при создании фабрики отчетов.

Много поигравшийся с паттерном Стратегия и Фабричный метод в итоге я наколдовал вот это:

public abstract class ParticipReport
{
    public string Surname { get; set; }
    public string Name { get; set; }
}
public class ParticipReportWithGrade : ParticipReport
{
    public int Grade5 { get; set; }
}
public class ParticipReportWithLevel : ParticipReport
{
    public string Level { get; set; }
}
public interface IParticipReportMaker
{        
    ParticipReport Create(int id, Dictionary<int, string> dict = null);
}
public class ParticipReportMaker : IParticipReportMaker
{
    private MyDbConxtex _db = new MyDbConxtex();
    public ParticipReport Create(int id, Dictionary<int, string> dict = null)
    {
        var result = _db.TestResult.Find(x => x.Id);
        if (dict == null)
        {
            var gradeReport = new ParticipReportWithGrade();                
            gradeReport.Surname = result. ...Surname; //доступ к Surname по навигационным свойствам
            gradeReport.Name = result. ...Name;
            return gradeReport;
        }
        var levelReport = new ParticipReportWithLevel();
        levelReport.Surname = result. ...Surname;
        levelReport.Name = result. ...Name;            
        levelReport.Level = dict[result.Grade5];
        return levelReport;            
    }
}
class Program
{
    static void Main(string[] args)
    {
        var levels = new Dictionary<int, string>
        {
            { 2, "Ниже базового" },
            { 3, "Базовый" }
        };
        var maker = new ParticipReportMaker();
        var report = maker.Create(1, levels);
    }
}

Разбор полетов

Я в продакшен этот код еще не пустил, но думаю работать он будет.

Две вещи в этом коде мне не нравятся с ходу:

  1. Идет дублирование кода при инициализации полей Surname и Name в модели отчета.
  2. В клиентском коде каждый раз приходится передавать словарь levelsв метод maker.Create(). Хотелось бы как-то правильно инициализировать объект maker. Ведь за раз я будут обрабатывать только один тип тестов (с конвертацией или без конвертацией Grade5).

Вопрос

На сколько дела хороши в выше приведенном коде и правильно ли реализован полиморфизм если нет возможности менять структуру БД?

READ ALSO
Сравнение значения label и элементов listView

Сравнение значения label и элементов listView

Получаю имена нужных процессовВ label11 хранится имя процесса активного окна

223
Работа в одной форме с Grid и разными источниками List&lt;T&gt;

Работа в одной форме с Grid и разными источниками List<T>

День добрый! Есть форма с расположены на ней GridомКак правильнее организовать работу с одной формой и несколькими источниками List

219
Обновление данных в БД Mysql WPF

Обновление данных в БД Mysql WPF

Доброго времени сутокНеобходимо обновить Таблицу в Mysql, а вернее заменить одно значение в одной строке

221
Передача кода для размещения на сайте

Передача кода для размещения на сайте

Я создала проект C# aspnet web forms

260