Вопрос о структуре классов библиотеки C # - PullRequest
0 голосов
/ 21 сентября 2011

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

У меня есть схема контроллера, с которой я могу общаться через последовательный порт, и я хотел бы написать для него библиотеку классов.Я подумал, что вызов метода (и гораздо более читаемый) намного проще, чем многократное жесткое кодирование длинных символьных строк.В любом случае, контроллер поставляется с предварительно запрограммированными ~ 100 функциями получения / установки, разделенными на три категории: Настройки датчика, Настройки вывода и Настройки среды.Эти функции используются для получения или установки настроек контроллера.Мне было интересно, какой была бы «лучшая» или «принятая» организация класса?

Все функции принадлежат одному контроллеру и используют один и тот же последовательный порт, поэтому я решил, что Controller будет классом верхнего уровня,В этом классе я установил экземпляр SerialPort и создал простой метод отправки / получения, используя экземпляр: string SendReceive(string commandString).

Поскольку я действительно не хочу иметь ~ 100 функций и свойств в одном классе, я попытался создать несколько вложенных классов (SensorSettings, OutputSettings и EnvironmentSettings) и поместить соответствующие функциивнутри них.Однако при попытке сборки я получил ошибку компиляции, в которой говорилось, что я пытался получить доступ к нестатическому методу более высокого уровня (SendReceive(string commandString)) из одного из вложенных классов.

Каждый из различныхМетоды имеют уникальную и переменную команду отправки / получения, поэтому я должен создать командную строку внутри метода, вызвать SendReceive и обработать возвращаемую команду.Есть ли способ сделать это?

Я хотел бы использовать свойства, чтобы пройти путь вниз, чтобы получить / установить различные настройки.Например ...

controllerInstance.SensorSettingsProperty.Units; // Units in use.

или ...

controllerInstance.OutputSettingsProperty.GetOutput(sensor1); // Get sensor 1 output.

... но все это требует использованиятот же последовательный порт и SendRecieve.

Мои извинения за ужасно длинный пост.Любая помощь с благодарностью.

Спасибо!

1 Ответ

0 голосов
/ 21 сентября 2011

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

Пример:

 public class GetSensorReadingCommand
 {
      public GetSensorReadingCommand(Sensor sensor, SerialController controller)
      {
          // Set up command
      }

      public int Execute()
      {
          // Call controller.SendReceive with whatever, get or send stuff
      }
 }

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

 SerialController controller = new SerialController(somePortNumber);
 GetSensorReadingCommand command = new GetSensorReadingCommand(Sensor.Sensor10, controller);
 int reading = command.Execute();

Для каждой команды, которую вы можете отправить, вы должны следовать такой схеме.Если это не известный номер датчика типа компиляции, вместо использования enum укажите целое число.

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

...