Codesys. Объектно-ориентированное программирование на ПЛК. Часть 7. Принцип разделения интерфейсов и принцип инверсии зависимости. — АСУ ТП: сообщество инженеров

Codesys. Объектно-ориентированное программирование на ПЛК. Часть 7. Принцип разделения интерфейсов и принцип инверсии зависимости.

Коротко о статье

Статья завершает разбор принципов SOLID для ПЛК: рассматриваются принцип разделения интерфейсов и принцип инверсии зависимости на примере клапанов в Codesys. Показано, как дробление интерфейсов и зависимость от абстракций снижают связность компонентов.

Главное
  • Интерфейс с большим числом методов создаёт зависимость от неиспользуемых методов.
  • Пример: интерфейс Valve с методами Открыть, Закрыть и Заблокировать реализуют VLV1 и VLV2WithoutBlock.
  • VLV2WithoutBlock не использует метод Block, поэтому интерфейс делится.
  • Зависимость от конкретного VLV2WithoutBlock не позволяет применять другие объекты.
  • Указание интерфейса OpenCloser в зависимостях даёт работу с обоими клапанами через методы Open и Close.
  • Для POU Program в Codesys сохраняется зависимость от конкретных реализаций для запуска.
Термины и технологии
  • Codesys
  • SOLID
  • принцип разделения интерфейсов
  • принцип инверсии зависимости
  • Valve
  • VLV1
  • VLV2WithoutBlock
  • OpenCloser
  • POU Program

Кому полезно: Инженерам АСУ ТП, программирующим ПЛК на Codesys с применением ООП

По теме на сайте

Первоисточник: blog.engcore.ru

Выжимка составлена редакцией сайта с помощью ИИ по тексту статьи.

Настало время для разбора двух последних принципов дизайна, которые использует объектно-ориентированное программирование. принцип разделения интерфейсов, который нам позволяет иметь более гибкие классы и принцип инверсии зависимости, который позволяет избежать жесткого связывания компонентов. Они также работают и для ПЛК, в том числе в среде Codesys.

А теперь как в бразильских сериалах. В предыдущих сериях:

  • Объектно-ориентированное программирование на ПЛК
  • Классы и интерфейсы, методы и свойства
  • Наследование, композиция, агрегация
  • Принцип единственной ответственности
  • Принцип открытости/закрытости
  • Принцип подстановки Барбары Лисков

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

Принцип разделения интерфейсов

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

Рассмотрим на примере клапанов…

Имеет интерфейс Valve, который содержит три метода — Открыть, Закрыть и Заблокировать. Этот интерфейс будут реализовывать два объекта. Первый — VLV1 — пользуется всеми методами, а вот VLV2WithoutBlock — реализует весь интерфейс, но метод Block не используется, но болтается балластом. Так что мы будем делить интерфейс.

Имеет интерфейс Valve, который содержит три метода — Открыть, Закрыть и Заблокировать. Этот интерфейс будут реализовывать два объекта. Первый — VLV1 — пользуется всеми методами, а вот VLV2WithoutBlock — реализует весь интерфейс, но метод Block не используется, но болтается балластом. Так что мы будем делить интерфейс.

Допустим у нас есть какой-то объект, который в своей логике имеет зависимость, но мы зависим от конкретного объекта VLV2WithoutBlock, то мы не можем использовать в работе другие объекты.

Но стоит указать в зависимостях интерфейс OpenCloser, то мы в объекте сможем использовать оба варианта клапанов, так как они оба реализуют данный интерфейс и имеют методы Open и Close c одинаковой сигнатурой.

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

Итого

В конченом итоге есть краткие описание с небольшими примерами основных принципов дизайна классов, они же SOLID, есть описанные основы ООП, расписаны различные формы зависимостей и работа с ними.

Стоит понимать, что строго следовать всем принципам невозможно, а иногда и вредно. Разработка в соответствии со всеми принципами, да и в целом в объектно-ориентированной парадигме значительно дольше, чем простое процедурное программирование и дает профит на долгих дистанциях.

Источник: https://blog.engcore.ru/2022/04/01/codesys-oop-isp-dip/

🔗 Codesys. Объектно-ориентированное программирование на ПЛК. Часть 7. Принцип разделения интерфейсов и принцип инверсии зависимости.

Оставьте комментарий

Войти

Зарегистрироваться

Сбросить пароль

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

Прокрутить вверх