Mam do pracy z dużą bazą danych, która zawiera cele pomiarowe oraz obszary ostrzeżeń/błędów dla wartości pomiarowych.

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

Pomiary te są przypisane do specyfikacji:

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; }
    // ...
}

Tak więc za każdym razem, gdy użytkownik dokonuje pomiaru, system zbiera informacje z różnych tabel bazy danych, składa obiekt specyfikacji i zbiera wartości pomiaru. W niektórych przypadkach specyfikacja musi zostać zmieniona:

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

Jak na razie wszystko wygląda dobrze, ale zdarza się też, że użytkownik musi przechowywać wyniki testów w bazie danych i nie wiem, jak najlepiej rozwiązać ten problem.

Moim początkowym rozwiązaniem była zmiana klasy pomiaru i bazy danych w następujący sposób:

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


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

Ale nie wydaje się to właściwe, ponieważ w rzeczywistości użytkownik przechowuje wynik testu, a nie specyfikację. Szukam lepszego sposobu na zrobienie tego.

Aby wyjaśnić: chcę oddzielić wyniki testów od specyfikacji przy możliwie najmniejszym stopniu dodatkowej złożoności.

Typowy scenariusz kodu ze zmianami, o których wspomniałem:

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

Jest to proste i dość proste, ale nie ma wyraźnego oddzielenia wyników testu od samej specyfikacji.

2
xsl 8 marzec 2012, 19:54

2 odpowiedzi

Najlepsza odpowiedź

Nie widzę problemu z twoim projektem (choć nie podałeś prawie żadnych szczegółów).

Myślę, że użycie nazwy „specyfikacja” mogło nabrać cię na myśl, że służy ona do przechowywania specyfikacji.

Jeśli potrzebujesz oddzielić specyfikacje od wyników na poziomie typu (a zachęcam Cię, abyś tego nie robił, chyba że jest to konieczne), stwórz klasę bazową ze wszystkimi wspólnymi elementami (którymi może być wszystko) i dziedzicz po niej dla specyfikacji i wynik i użyj neutralnej nazwy.

Jeśli nie musisz rozdzielać te dwie koncepcje, wybierz bardziej neutralną nazwę niż „specyfikacja” i gotowe.

1
Marcin 8 marzec 2012, 20:10

Myślę, że przeciążasz klasę Measurement<T>. Używasz go, aby zawrzeć zarówno swoje ograniczenia, jak i wyniki testów. Możesz podzielić to na dwie oddzielne klasy. Jak to brzmi?

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; }
    ...
}

Pozwala to oddzielić dane specyfikacji od danych testowych, a wiele wystąpień testu może odnosić się do tej samej specyfikacji.

0
Raymond Saltrelli 8 marzec 2012, 20:29