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

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

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

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

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

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

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

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

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

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

Принцип инверсии зависимости

Принцип инверсии зависимости (Dependency Inversion Principle; DIP) утверждает, что наиболее гибкими получаются системы, в которых зависимости в исходном коде направлены на абстракции, а не на конкретные реализации.

Ну вот и все. Для более гибкой системы вам необходимо направлять зависимости на абстракции. пример с классами что выше.

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

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

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

Итого

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

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

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

Почта для связи: info@engcore.ru

ТГ канал здесь

Ответить