Как лучше спроектировать в данном примере классы? Есть устройства контроллеры - 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 собираюсь хранить не в базе, а где то зашито в коде будет.
В данном случае, для оптимальной организации классов, вам можно воспользоватсья паттерном проектирования "Фабрика" (Factory).
Создайте интерфейс IController с методами, общими для всех контроллеров, например, setData(). Затем создайте классы-наследники, реализующие этот интерфейс, например, ControllerVendor1 и ControllerVendor2, и определите в них уникальную логику для производителей.
Далее создайте класс фабрики ControllerFactory, в котором будет метод getControllerByVendor(string vendor), который будет возвращать объект нужного контроллера в зависимости от переданного производителя.
При загрузке контроллера из базы в методе Controller.get() вы можете использовать этот метод фабрики, чтобы вернуть нужный контроллер для управления устройством конкретного производителя.
Таким образом, у вас будут разделены классы устройств, фабрика для создания контроллеров, и классы контроллеров с уникальной логикой для каждого производителя. Это позволит вам легко добавлять новых производителей и контроллеры в будущем.
В данном случае, для оптимальной организации классов, вам можно воспользоватсья паттерном проектирования "Фабрика" (Factory).
Создайте интерфейс IController с методами, общими для всех контроллеров, например, setData(). Затем создайте классы-наследники, реализующие этот интерфейс, например, ControllerVendor1 и ControllerVendor2, и определите в них уникальную логику для производителей.
Далее создайте класс фабрики ControllerFactory, в котором будет метод getControllerByVendor(string vendor), который будет возвращать объект нужного контроллера в зависимости от переданного производителя.
При загрузке контроллера из базы в методе Controller.get() вы можете использовать этот метод фабрики, чтобы вернуть нужный контроллер для управления устройством конкретного производителя.
Таким образом, у вас будут разделены классы устройств, фабрика для создания контроллеров, и классы контроллеров с уникальной логикой для каждого производителя. Это позволит вам легко добавлять новых производителей и контроллеры в будущем.