2009-10-10 4 views
0

У меня есть класс, который возвращает три свойства. Первое свойство зависит от некоторого параметра, второе зависит от первого свойства, а третье - от второго свойства.Как создать мой класс

Каков наилучший способ реализации этого типа класса, существует ли соответствующий шаблон дизайна для этого? Ниже я вставил две версии моего кода, которые работают, и я задаюсь вопросом, кто из них лучше (или я слишком усложняю ситуацию)?

Первый один:

class Initializer 
{ 
    private string lastCode; 
    private int lastPackage; 
    private int lastBox; 

    public Initializer(int machineNumber) 
    { 
     lastCode = GetLastCodeFromDatabase(machineNumber); 
     lastPackage = GetLastPackageByLastCode(lastCode); 
     lastBox = GetLastBoxByLastPackage(lastPackage); 
    } 

    public string LastCode 
    { 
     get { return lastCode; } 
    } 

    public int LastPackage 
    { 
     get { return lastPackage; } 
    } 

    public int LastBox 
    { 
     get { return lastBox; } 
    } 

    private string GetLastCodeFromDatabase(int machineNumber) 
    { 
     using (InitializerTableAdapter adapterGetLastCode = new InitializerTableAdapter()) 
     { 
      return Convert.ToString(adapterGetLastCode.GetLastCodeByMachineNumber(machineNumber)); 
     } 
    } 

    private int GetLastPackageByLastCode(string lastCode) 
    { 
     using (InitializerTableAdapter adapterGetLastPackage = new InitializerTableAdapter()) 
     { 
      return Convert.ToInt32(adapterGetLastPackage.GetLastPackageByLastCode(lastCode)); 
     } 
    } 

    private int GetLastBoxByLastPackage(int lastPackage) 
    { 
     using (InitializerTableAdapter adapterGetLastPackage = new InitializerTableAdapter()) 
     { 
      return Convert.ToInt32(adapterGetLastPackage.GetLastBoxByPackageNumber(lastPackage)); 
     } 
    } 
} 

Второе:

class Initializer 
{ 
    public static string LastCode(int machineNumber) 
    { 
     return GetLastCodeFromDatabase(machineNumber); 
    } 

    public static int LastPackage(string lastCode) 
    { 
     return GetLastPackageByLastCode(lastCode); 
    } 

    public static int LastBox(int lastPackage) 
    { 
     return GetLastBoxByLastPackage(lastPackage); 
    } 

    private static string GetLastCodeFromDatabase(int machineNumber) 
    { 
     using (InitializerTableAdapter adapterGetLastCode = new InitializerTableAdapter()) 
     { 
      return Convert.ToString(adapterGetLastCode.GetLastCodeByMachineNumber(machineNumber)); 
     } 
    } 

    private static int GetLastPackageByLastCode(string lastCode) 
    { 
     using (InitializerTableAdapter adapterGetLastPackage = new InitializerTableAdapter()) 
     { 
      return Convert.ToInt32(adapterGetLastPackage.GetLastPackageByLastCode(lastCode)); 
     } 
    } 

    private static int GetLastBoxByLastPackage(int lastPackage) 
    { 
     using (InitializerTableAdapter adapterGetLastPackage = new InitializerTableAdapter()) 
     { 
      return Convert.ToInt32(adapterGetLastPackage.GetLastBoxByPackageNumber(lastPackage)); 
     } 
    } 
} 

ответ

2

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

Если ваш первый пример - тот, который лучше подходит для данных, вам лучше использовать простой объект, который ничего не знает о том, как он хранится, и ORM для сопоставления его с базой данных и из базы данных. Предположительно, у вас будет другой код, который использует этот объект. Если вы пишете этот код, ожидающий этого класса, запрашивая базу данных в конструкторе и т. Д., Это будет трудно проверить и трудно использовать повторно.

Если второе является лучшим совпадением, вы должны изучить инъекцию зависимостей, чтобы вы могли вводить другой источник данных для тестирования (или когда вы переходите из базы данных SQL в локальную базу данных и т. Д.).

1

Зависит, если вы хотите, чтобы инициализировать все переменные вперед, или выполнить его только в случае необходимости. Я думаю, что лучший способ сделать это полностью зависит от того, как вы ожидаете использовать класс. Если вы будете использовать свойства много, и значение не изменится, возможно, выполните инициализацию (ваш первый вариант) или выполните Lazy Loading.

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

Lazy Loading действительно хороший компромисс между двумя идеями, но может использоваться только в том случае, если значения не меняются. Когда вы Lazy Load, если никто не использует свойства, вам не нужно оплачивать выполнение инициализации переменных.

+0

С помощью этого класса я настроил GUI моего приложения при запуске, поэтому он будет запускаться только один раз, и мне нужно сразу получить все свойства. – sventevit

1

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

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

+0

Что значит «плоский обзор моей модели домена»? Я новичок в разработке шаблонов, поэтому задаю такие вопросы ... – sventevit

+0

Кевин идет немного подробнее. У вас должно быть два класса: пакет и коробка. Пакет имеет IList для хранения своих ящиков. O/R-Mapper, такой как NHibernate/Entity Framework, должен заботиться о сохранении ваших классов. Затем вы использовали бы методы памяти для определения последнего окна.С плоской точки зрения я имею в виду, что у вас есть только очень конкретное представление о некоторых свойствах ваших объектов (пакетов, ящиков), и вы легко столкнетесь с проблемами, когда вам понадобится дополнительная информация. Другое дело: вы должны абстрагировать свой уровень доступа к данным, чтобы проверить свой код;) –

Смежные вопросы