Существует ли шаблон проектирования для отношения измерения / стоимости? - PullRequest
2 голосов
/ 08 марта 2012

Я должен работать с большой базой данных, которая содержит цели измерения, а также области предупреждения / ошибки для значений измерения.

public class Measurement<T>
{
    public T Target { get; set; }

    public float? UpperWarnLimit { get; set; }
    public float? LowerWarnLimit { get; set; }
    public float? UpperErrorLimit { get; set; }
    public float? LowerErrorLimit { get; set; }
}

Эти измерения относятся к спецификациям:

public class Specification
{
    public long Id { get; set; }
    public Measurement<float> Width { get; set; }
    public Measurement<float> Height { get; set; }
    public Measurement<int> AdditionalMeasurement { get; set; }
    // ...
}

Таким образом, всякий раз, когда пользователь выполняет измерение, система собирает информацию из различных таблиц базы данных, собирает объект спецификации и собирает значения измерений. В некоторых случаях спецификация должна быть изменена:

 public interface IDatabase
 {
     Specification GetSpecification(long id);
     void UpdateSpecification(Specification specification)
 }

Пока все выглядит хорошо, но есть также случай, когда пользователь должен сохранить результаты теста в базе данных, и я не уверен, как лучше всего решить эту проблему.

Первоначально я решил изменить класс измерений и базы данных следующим образом:

public class Measurement<T>
{
    public T Target { get; set; }
    public T Value { get; set; } // <-- New


public interface IDatabase
{
    void StoreTestResults(Specification specification) // <-- New

Но это не так, потому что на самом деле пользователь сохраняет результат теста, а не спецификацию. Я ищу лучший способ сделать это.

Чтобы прояснить это: Я хочу отделить результаты испытаний от спецификации с наименьшим количеством дополнительной сложности.

Типичный сценарий кода с упомянутыми мною изменениями:

 var s = GetSpecification(123);
 s.Height.Value = 4;
 if (s.Height.Value > s.Height.Target * s.Height.Target.UpperErrorLimit)
 {
    ...
 }
 StoreTestResults(s);

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

Ответы [ 2 ]

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

Я не вижу проблем с вашим дизайном (хотя вы почти ничего не сообщили).

Я думаю, что использование вами названия «спецификация» могло ввести вас в заблуждение, что оно предназначено для хранения спецификаций.

Если вам нужно отделить спецификации от результатов на уровне типа (и я настоятельно рекомендую вам не делать этого, если это не требуется), то создайте базовый класс со всеми общими элементами (которые могут быть всем) и наследуйте от него для спецификации и результата, и используйте нейтральное имя.

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

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

Я думаю, вы перегружаете класс Measurement<T>. Вы используете его для инкапсуляции ваших лимитов и результатов ваших тестов. Возможно, вы захотите разделить это на два отдельных класса. Как это звучит?

public class AcceptableRange<T>
{
    public T UpperWarnLimit { get; set; }
    public T LowerWarnLimit { get; set; }
    public T UpperErrorLimit { get; set; }
    public T LowerErrorLimit { get; set; }
    ...
}

public class Specification
{
    public long Id { get; set; }
    public AcceptableRange<float> Width { get; set; }
    public AcceptableRange<float> Height { get; set; }
    ...
}

public class Measurement<T>
{
    public T Value { get; set; }
    ...
}

public class Test
{
    public Specification Specification { get; set; }
    ...
}

public class TestResult
{
    public Test Test { get; set; }
    public Measurement<float> Width { get; set; }
    public Measurement<float> Height { get; set; }
    ...
}

Это позволяет отделить данные спецификации от тестовых данных, и несколько экземпляров теста могут ссылаться на одну и ту же спецификацию.

...