Как лучше спроектировать в данном примере классы? Есть устройства контроллеры - Controllers, у них одинаковые наборы атрибутов. Но они могут быть разных производителей и в зависимости от производителей разные возможности и функции. Пока у меня класс
Controller: Id Name Address DeviceId - по этому ID можно будет достать техн характеристики данного типа устройства, напр производителя.
Этот класс я планирую посредством orm хранить в таблице Controllers.
Дальше я хочу поместить функции для работы с контроллерами, они должны быть сгруппированы по производителям.
В голове у меня создать по классу на производителя наследующих Controller. Например :
ControllerVendor1 : Controller setData()
ControllerVendor2 : Controller setData()
Хоть название функций одно и тоже, код будет отличатся.
Далее мне нужно, при получении из базы, получать контроллер нужного типа. Для этого я думаю в методе Controller.get() - проверять, по deviceId производителя и в зависимости от него создавать уже нужный контроллер и return его. return new ControllerVendor1(controller)
Насколько это нормальное решение, и как правильнее это сделать?
Язык C#;
в Device отображает возможности модели устройства.
Device: Id ModelName Vendor WorkModes
Пример из жизни: Допустим у нас есть два производителя контроллеров Vendor1 и Vendor2, мы купили 2 штуки первого и 1 штуку второго, назвали их ctr1, ctr2, ctr3.
Тогда Devices: { {id: 1, vendor: "Vendor1"}, {id: 2, vendor: "Vendor2"} }
Controllers { {id: 1, name: "ctr1", deviceId: 1}, { id: 2, name: "ctr2", deviceId: 1}, { id:3, name: "ctr3", deviceId: 2} }
P.S Device собираюсь хранить не в базе, а где то зашито в коде будет.

21 Авг 2019 в 07:02
505 +1
0
Ответы
1

В данном случае, для оптимальной организации классов, вам можно воспользоватсья паттерном проектирования "Фабрика" (Factory).

Создайте интерфейс IController с методами, общими для всех контроллеров, например, setData(). Затем создайте классы-наследники, реализующие этот интерфейс, например, ControllerVendor1 и ControllerVendor2, и определите в них уникальную логику для производителей.

Далее создайте класс фабрики ControllerFactory, в котором будет метод getControllerByVendor(string vendor), который будет возвращать объект нужного контроллера в зависимости от переданного производителя.

При загрузке контроллера из базы в методе Controller.get() вы можете использовать этот метод фабрики, чтобы вернуть нужный контроллер для управления устройством конкретного производителя.

Таким образом, у вас будут разделены классы устройств, фабрика для создания контроллеров, и классы контроллеров с уникальной логикой для каждого производителя. Это позволит вам легко добавлять новых производителей и контроллеры в будущем.

20 Апр 2024 в 13:09
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир