2016-06-17 3 views
2

Я пишу класс оболочки для SDK устройства, чтобы упростить обработку большого проекта (например, не опечатки строк в getParameter(string parameter) и упрощение метода, вызывающего нашу цель). У устройства есть некоторые свойства, которые я могу получить и установить, но только в том случае, если устройство подключено (поэтому свойство зависит от поля device, не имеющего нуля и связанного), и я не могу обернуть вокруг себя, как обращаться с ним , Я читал, что исключение из геттеров может быть плохой идеей. Я могу сделать свойство nullable, но я подозреваю, что проблема скорее в дизайне.Свойство, зависящее от поля

class MyClass 
{ 
    private Device device; //SDK device 

    public string Name 
    { 
     get //set is pretty much the same 
     { 
      if (!device.IsConnected) 
       //return null and have nullable property? throw NotConnectedException? 
      return device.getParameter("Name"); 
     } 
    } 
} 

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

+0

Не уверен, что вы действительно хотите, но вы можете начать с того, что все устройства, зависящие от устройства, работают в одном классе и с обработкой исключений, после чего вы можете сделать свое устройство получения и настройки автономным - кто знает, может быть, вам нужно изменить устройство «на лету» в будущем – serup

+2

String по умолчанию имеет значение NULL. Если вы работаете только со строками, не отправляйте null. – lokusking

+0

Я боюсь, что есть еще несколько свойств, которые также являются ints, double и enums, но хорошее предложение для строковых, спасибо. @serup Вы имеете в виду как обертывание устройства, а также, чтобы моя обертка имела экземпляр devicewrap? – Mattias

ответ

1

Я бы извлек логику подключения к другому классу, чтобы вы могли легко изменить это в будущем, и чтобы вы не повторяли много писем с ошибками if (!device.IsConnected)....
Например, что делать, если теперь вы можете работать только с устройствами, которые подключены и имеют ErrorStatus = 0. Измените ли вы каждое условие в каждом свойстве?

Я хотел бы написать что-то вроде:

class DeviceWrapperFactory 
{ 
    public static DeviceWrapper Connect(Device device) 
    { 
     if (!_device.IsConnected) 
     { 
      // assume trying to reconnect here if possible 
      // like "if (!device.TryToConnect())" 
      throw new DeviceConnectionFailedException(); 
     } 

     return new DeviceWrapper(_device); 
    } 
} 

class DeviceWrapper 
{ 
    private Device device; 

    DeviceWrapper(Device device) 
    { 
     _device = device; 
    } 

    public string Name 
    { 
     get 
     { 
      return device.getParameter("Name"); 
     } 
    } 
} 

Таким образом, вы будете в состоянии сделать:

try 
{ 
    Console.WriteLine(DeviceWrapperFactory.Connect(usbDevice).Name); 
    // or 
    var usbDeviceWrapper = DeviceWrapperFactory.Connect(usbDevice); 
    Console.WriteLine(usbDeviceWrapper.Name); 
    Console.WriteLine(usbDeviceWrapper.AnotherProperty); 
} 
catch (DeviceConnectionFailedException dcfe) 
{ 
    // ... 
} 

Вы также можете создать устройства пул объектов вместо фабрики, или что-то еще вы хотите. Этот пример просто показывает идею.

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

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

+0

Блестящее объяснение и пример. Я попытаюсь реализовать его таким же образом. Благодаря! – Mattias