Поднимаются темы про ООП, поэтому Up-ну эту тему пока она в тотал не ушла в никролог. Нашел время и разобрался с LVOOP. На будущее тем, кто не знает как подступиться и не знает с чего начать сделаю мануал. Готов всё обсудить, ответить на вопросы(хотя бы попробовать, это повысит мой скил в LVOOP), послушать остальных интересующихся.
Вы можете использовать 2 подхода для изучения:
1. Использовать обучающий материал от NI, по форумам темки почитывать или видюшки смотреть по LVOOP.
2. Использовать общепринятую литературу в мире программирования.
Я вам настоятельно рекомендую начинать со второго, а затем переходить к первому. Хотите понять объектно-ориентированную парадигму
программирования? Нужно будет уделить 2-4 недели для ежедневного чтива теории, просмотру лекций и анализу информации чтобы уяснить основы самой
парадигмы. Изучать ООП по кратким статьям от NI или тематическим книгам я бы советовал после полученной базы знаний из другой литературы. Меня позабавило то, как в книгах с темой LVOOP пытаются рассказать про ООП буквально на 2 страничках, а далее даётся галоп к примерам и вуаля - мы типа знаем ООП. Really? То же самое касается и официальных документов. На столько там сжатый материал, прям брррр. Аналогично и про паттерны проектирования. До сих пор блуждает где-то документ страничек на 8-10, в котором через призму LabVIEW даётся описанием паттернов, по страничке на каждый...наверно так. Ну правда, серьёзно? Это прям как "С++ за 21 день". Вам будет казаться, что вы понимаете, но по большому счету ничего вы толком не узнаете кроме общих фраз.
Часть 1. Вводная информация
Мэтт Вайсфельд «Объектно-ориентированное мышление» - это одна из тех книг, которая должна стать Вашим пособием в изучении объектно-ориентированной
парадигмы программирования. Книга не будет утомлять бесконечным программным кодом, основной упор сделан на рассмотрение понятий и
принципов ООП. Так же описаны возможные подходы к проектированию классов с заботой о будущем использовании. Важно: проектируя программу
объектно-ориентированным способом, вы можете получить как хорошие, так и плохие результаты с той же легкостью, как и при использовании любого
другого подхода. Пусть Вашу бдительность не притупляет ложное чувство безопасности, основанное лишь на том, что вы применяете самую современную
методологию проектирования. То, что в программе будут присутствовать классы – не означает, что перед Вами проработанный проект, а программа
выполнена в ООП-стиле, инфа сотка. Прочтите хотя бы 50% этой книги, а затем двигайтесь дальше к освоению реализации этой парадигмы в LabVIEW.
Часть 2. LabVIEW OOP
Надеюсь, что хотя бы 50% книги Вы прочли и четко представляете такие понятия как «класс», «объект», «метод», «атрибут», «инкапсуляция», «полиморфизм», «наследование», «абстракция», «композиция», «интерфейс».
Давайте рассмотрим, как в LabVIEW выглядят классы, методы и атрибуты:
Класс - это уникальный тип библиотеки, которая всегда содержит кластер с атрибутами объекта и методами.
Объект - это кластер, внутри которого содержаться атрибуты объекта.
Метод – это .vi, который описывает поведение объекта.
В качестве примера будем использовать абстрактный класс «Калькулятор». Создадим базовый класс и наполним его методами и атрибутами объекта. Как создать класс в LabVIEW: Создаём пустой проект -> ПКМ по MyComputer и выбираем как в приведенном ниже рисунке. После выбора Class будет предложено изменить имя класса.
После создания класс содержит одни файл Name_Class.ctl и пока всё. Откроем этот файл и посмотрим на содержимое:
- 2_Создание класса.png (1.32 КБ) 5797 просмотров
Видим пустой кластер с именем Cluster of class private data. В этом кластере необходимо описать атрибуты(поля) объекта класса. Внесем в кластер 3 поля: А, В, С . Два поля будут отвечать за входные числа для мат.операций, третье поле будет хранить результат.
- 3_Создание класса.png (2.93 КБ) 5797 просмотров
Создадим абстрактные методы для выполнения математических операций суммы, умножения, вычитания:
Остановим внимание на том, что предлагается на выбор:
VI, Virtual Folder, Property Definition Folder, VI from Dynamic Dispatch Template, VI from Static Dispatch Template, VI for Data Member Access, VI for Override, Control.
Наиболее интересными являются методы с динамической(VI from Dynamic Dispatch Template) и статической(VI from Static Dispatch Template) диспетчеризацией. Динамическая диспетчеризация методов – это механизм, позволяющий определить какой из переопределенных методов нужно вызвать, во время выполнения, а не во время компиляции. Статическая диспетчеризация не позволит нам выполнить перезапись дочерними классами, поэтому работа с таким методом равносильна работе с обычной subVI. Динамическая диспетчеризация вызывает некоторые накладные расходы на вызов метода и перезапись, в то время как статичные этого не требуют. Тем не менее, в подавляющем большинстве отдаётся предпочтение динамическим методам ввиду их гибкости. Про VI for Data Member Access будут пояснения ниже.
Абстрактный метод для сложения (для базового класса создаём методы как VI from Dynamic Dispatch).
Аналогичным образом создаём методы для умножения и вычитания.
В качестве калькулятора может выступать классический калькулятор, это могут быть счеты или счетные палочки. Операция сложения может быть общепринятой, типа 2+2 = 4, может быть логической, может быть по модулю 2 и т.д. В нашем примере опишем объект «классический калькулятор» и «логический калькулятор». Эти объекты обладают одинаковыми атрибутами и методами, однако реализация методов будет отличаться.
Создаём 2 класса, которые описывают конкретные объекты: ClassCalculator и ClassBoolCalc.
- 6_Создание класса.png (5.06 КБ) 5797 просмотров
Для каждого класса создадим пары методов: set и get как VI(про теорию использования геттеров и сеттеров почитайте либо в книге, либо в гугле). Хорошим тоном в ООП считается иметь пару таких методов для каждого атрибута объекта класса. С помощью этих методов будем задавать и получать значения полей. Метод set для каждого объекта будет закрытым. Это позволит нам защитить поля от изменения вне класса для определенного объекта. Метод get оставим открытым, это позволит нам получать значения полей(атрибутов). В LabVIEW предусмотрены VI for Data Member Access, они как раз выполняют роль геттров и сеттеров и настраиваются на чтение/запись при создании. Так же VI for Data Member Access можно привязать к property node для объекта класса.
- 7_Создание класса.png (9.5 КБ) 5797 просмотров
- 8_Создание класса.png (2.63 КБ) 5797 просмотров
Методы set и get:
Созданные классы будут наследоваться от базового класса. Для этого заходим в свойства класса и выбираем следующее:
После этого для каждого объекта класса создаём VI for Override и в диалоговом окне выбираем метод из базового класса(например метод для суммирования). После этого переопределяем реализацию метода так, как нам необходимо(можно удалить всё, оставив только входы и выходы и написать свой метод).Мы помним, что наследуем абстрактный метод, а реализацию метода определяем самостоятельно для каждого объекта класса. Тип VI for Override позволит на лету переопределять реализацию метода классов с общим родителем. Например, для классов ClassCalculator и ClassBoolCalc мы создали методы с следующей реализацией:
Доступ к методам открыт, поэтому если потребуется переопределить логику работы метода – достаточно указать объект нужного класса и всё поменяется автоматически.
С другой стороны, возникает резонный вопрос: а как можно использовать методы, которые принадлежат только классу конкретного объекта, а не наследуются из базового, ведь LabVIEW не поддерживает множественного наследования. Мы знаем, что класс - это шаблон, по которому создаются объекты. Чтобы вызвать метод какого-то класса, нужно создать объект этого класса, после чего обратиться к объекту для вызова его метода.
В классах ClassCalculator и ClassBoolCalc создадим еще по одному методу тип VI с именем main.vi. со следующей реализацией внутри:
Основная программ будет выглядеть следующим образом:
- 13_Создание класса.png (5.01 КБ) 5797 просмотров
Это программа, спроектированная по всем правилам ООП. Три класса, один базовый абстрактный и два для конкретных объектов. Данные и методы, которые обрабатывают эти данные – объединены в одном классе. Абстрактный метод «сложение» унаследован и переопределен внутри каждого класса(наследование и полиморфизм). Метод класса-родителя «сложение» может быть динамически переписан любым из классов детей.
Дерево проекта:
- 14_Создание класса.png (11.47 КБ) 5797 просмотров
Важно для себя понять, что ООП придумали для упрощения процесса сопровождения и дальнейшей разработки программного обеспечения. Извечный вопрос: где применять? Ответ:
1.В командной разработке, когда каждый программист фактически пилит свой кусок кода не нарушая общую структуру программы.
2.В проектах, которые имеют высокую степень схожести с дальнейшими проектами.
3. Удобно создавать шаблон приложения, с последующим динамическим переопределением методов класса под нужды конкретного приложения в дальнейшем.
Непривычно для меня это было делать именно в LabVIEW, но в целом суть одинаковая что в LVOOP, что в C++/Java. Конечно существует ряд отличий, но они скорее с точки зрения синтаксиса и фич, нежели философии в целом. Тем не менее я остаюсь при своём: мне сильно помогли знания, полученные из классических книг по ООП. Если бы я впервые решил освоить LVOOP по мануалам NI - то понимал бы дольше, а объем информации получил бы смешной. Чтобы спроектировать ООП-программу, нужно хорошо думать и предусматривать, чтобы как можно лучше применять абстракции. Иначе можно столкнуться с тем, что будет создан класс "всемогУн", а парадигма будет лишь на бумаге, а не в проекте.
Резюмирую: LVOOP - годно, использовать можно!