2015-09-14 2 views
0

У меня есть базы данных, как объект, который выглядит как:получать только для чтения данных из объекта

static class Data 
{ 
    private Dictionary<String,Car> cars; 
} 

class Car 
{ 
    private string name; 
    private Dictionary<String,Part> parts; 
} 
class Part 
{ 
    private string name; 
    private double paramA; 
    private int paramB; 
    private string paramC; 
} 

Я использую эту базу данных в многоядерной программе в, так что я только читать из него. В настоящее время чтение осуществляется таким образом: в данных у меня есть:

public double get_paramA(string car,string part) 
{ 
    return cars[car].get_paramA(part); 
} 

и в машине у меня есть:

public double get_paramA(string part) 
{ 
    return Part[part].get_paramA(); 
} 

Это работает, но я волнуюсь о будущем, если есть необходимость добавьте больше параметров в Part: в текущей схеме он добавляет 3 функции к трем объектам.

Как изменить схему чтения, чтобы сделать код более удобочитаемым/поддерживаемым?

Извините, если это стандартный вопрос, я понятия не имею, что искать, чтобы найти ответ.

ответ

1

Я думаю, что лучший образец, который подходит для этого случая, - Singleton pattern.

В этом случае вы примените это к классу Data, поэтому он будет действовать как «объект базы данных», как вы правильно заявляете. Data класс никогда не будет меняться (он будет создан только один раз) и его ссылку на словарь.

Как вам это нужно, чтобы быть поточно (хотя вы только чтение, возможно, в будущем вам нужно будет изменить его) я буду основывать свою реализацию в this answer by Bohemian, где вещи лучше объяснить, чем здесь (извините, Я не очень хорошо синхронизирую хаха).

public class Data { 

    private Dictionary<String, Car> cars = new ...<String, Car>(); 

    private Data() {} 

    private static class Holder { 
     static final Data INSTANCE = new Data(); 
    } 

    public static Data getInstance() { 
     return Holder.INSTANCE; 
    } 

    public double get_paramA(string car,string part){ 
     return cars[car].get_paramA(part); 
    } 
} 

Обратите внимание, что если вам необходимо получить доступ к словарю или метода get_paramA() вы должны назвать его таким образом:

double part = Data.getInstance().get_paramA(car1, part1);

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

О последнем вопросе о добавлении нового парама, вы делаете это правильно, из-за парадигмы ООП каждый объект должен «выполнять свою работу», то есть возвращать и запрашивать необходимые методы других объектов (поэтому вы закончите с множеством «тупых» методов, которые возвращают частный параметр или вызовы того же метода другого объекта).

Я не очень хорошо знаю, что вы моделируете с этим классом Part, но по мне это звучит родовое, возможно, с использованием inheritance будет в порядке. Вы можете определить свой Part класс как Abstract Class, где вы определите общие методы для всех возможных объектов Part, которые у вас есть, а затем вы можете extend от этого класса и создать другие классы, такие как Whell или Chasis, где у них есть свои собственные переменные экземпляра.

Если вам нужна дополнительная информация, не стесняйтесь спрашивать снова и жаль, если я говорю что-то, что не совсем правильно.

Поздравления!