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