Я думаю, что "информация" является неправильным. У объектов есть состояние и действия: «информация» - это просто еще одно имя слова «состояние», которое уже встроено в ООП.
Что вы на самом деле пытаетесь смоделировать здесь? Вам нужен объект, который представляет аппаратное обеспечение в программном обеспечении, чтобы другой код мог его использовать.
Это легко сказать, но, как вы узнали, в этом есть нечто большее. «Представление оборудования» удивительно широк. У объекта, который делает это, есть несколько проблем:
- Низкоуровневая связь с устройством, будь то связь через интерфейс USB, последовательный порт, TCP / IP или проприетарное соединение.
- Управляющий государством. Устройство включено? Готовы поговорить с программным обеспечением? Занятый?
- Обработка событий. Устройство генерирует данные: теперь нам нужно сгенерировать события для передачи другим интересующим их классам.
Некоторые устройства, такие как датчики, будут иметь меньше проблем, чем, скажем, многофункциональное устройство принтер / сканер / факс. Датчик, скорее всего, просто создает поток битов, в то время как сложное устройство может иметь сложные протоколы и взаимодействия.
В любом случае, возвращаясь к вашему конкретному вопросу, есть несколько способов сделать это в зависимости от ваших конкретных требований, а также сложности взаимодействия с оборудованием.
Вот пример того, как я бы разработал иерархию классов для датчика температуры:
ITemperaSource: интерфейс, представляющий все, что может генерировать данные о температуре: датчик, который может быть даже оберткой файла или жестко закодированными данными (например, фиктивное тестирование).
Acme4680Sensor: датчик ACME модель 4680 (отлично подходит для обнаружения, когда Roadrunner находится поблизости). Это может реализовать несколько интерфейсов: возможно, этот датчик обнаруживает как температуру, так и влажность. Этот объект содержит состояние программного уровня, такое как «датчик подключен?» и "что было последним чтением?"
Acme4680SensorComm: используется исключительно для связи с физическим устройством. Это не поддерживает много государства. Используется для отправки и получения сообщений. У него есть метод C # для каждого сообщения, которое понимает аппаратное обеспечение.
HardwareManager: используется для получения устройств. По сути, это фабрика, которая кэширует экземпляры: для каждого аппаратного устройства должен быть только один экземпляр объекта устройства. Он должен быть достаточно умен, чтобы знать, что если поток A запрашивает датчик температуры ACME, а поток B запрашивает датчик влажности ACME, это фактически один и тот же объект, и его следует возвращать в оба потока.
На верхнем уровне у вас будут интерфейсы для каждого типа оборудования. Они описывают действия, которые ваш код C # будет выполнять на устройствах, используя типы данных C # (не например, байтовые массивы, которые может использовать необработанный драйвер устройства).
На том же уровне у вас есть класс перечисления с одним экземпляром для каждого типа оборудования. Датчик температуры может быть одного типа, датчик влажности - другим.
На один уровень ниже это фактические классы, которые реализуют эти интерфейсы: они представляют одно устройство, подобное Acme4680Sensor I, описанному выше. Любой конкретный класс может реализовывать несколько интерфейсов, если устройство может выполнять несколько функций.
Каждый класс устройств имеет свой собственный класс связи (связи), который обрабатывает низкоуровневую задачу общения с оборудованием.
Вне аппаратного модуля единственный видимый уровень - это интерфейсы / перечисление плюс HardwareManager. Класс HardwareManager - это фабричная абстракция, которая обрабатывает создание экземпляров классов устройств, кэширование экземпляров (вы на самом деле не хотите, чтобы два класса устройств общались с одним и тем же аппаратным устройством) и т. Д. Класс, которому требуется датчик определенного типа, просит HardwareManager получить устройство для конкретного перечисления, которое оно затем выясняет, если оно уже было создано, если нет, как его создать и инициализировать, и т. д.
Цель здесь - отделить бизнес-логику от аппаратной логики низкого уровня. Когда вы пишете код, который выводит данные датчика на экран, этот код не должен заботиться о том, какой тип датчика у вас есть, если и только если существует эта развязка, которая концентрируется на этих аппаратных интерфейсах.
Примечание: существуют ассоциации между HardwareManager и каждым классом устройств, которые я не рисовал, потому что диаграмма превратилась бы в суп со стрелками.
Info
суффикс отличаетstatic
класс , содержащий вспомогательные методы от своего аналога с учетом состояния. Это не «лучшая практика» как таковая; Это просто способ, которым команда .NET придумала решение конкретной проблемы. Они могли бы так же легко придуматьFileUtility
иFile
, ноFile.DoSomething()
и ,FileInfo.FileName
кажется, лучше читать.