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

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

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

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

Войти

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

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

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

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