ООП - объектно-ориентированое программирование

Общие принципы, проектирование, модуляризация, темплейты и шаблоны
Аватара пользователя
mzu2006

Professionalism Tutorials Black
doctor
doctor
Сообщения: 2456
Зарегистрирован: 16 авг 2008, 02:12
Награды: 3
Версия LabVIEW: 7.1 10 11 12
Откуда: St-Petersburg (RU), Phila, Boston, Washington DC
Контактная информация:

Re: ООП - объектно-ориентированое программирование

Сообщение mzu2006 »

Дополнение:
В Profile->show buffer allocations - увидел новый для себя пункт - "dynamic dispatch temporaries" - вроде-бы показывает (возможное) выделение памяти под временные копии класса в тех случаях, о которых мы говорили в последних 4-х постах (т.е. когда у класса родителя не модифицируется, а у классов-потомков модифицируется)
Аватара пользователя
mzu2006

Professionalism Tutorials Black
doctor
doctor
Сообщения: 2456
Зарегистрирован: 16 авг 2008, 02:12
Награды: 3
Версия LabVIEW: 7.1 10 11 12
Откуда: St-Petersburg (RU), Phila, Boston, Washington DC
Контактная информация:

Re: ООП - объектно-ориентированое программирование

Сообщение mzu2006 »

Недавно пришлось воспользоваться ООП. Хочу поделиться простым примером. Видимо, описан уже много раз, но на нашем форуме ещё не встречал.

Задача: Разработать управление определённым контроллером. Имеется подробное описание.
Сопутствующая проблема: контроллер доступен только ограниченное время в день (пару часов), в остальное время с этим контроллером работаю другие люди.
Идея решения: логику разрабатываем с использованием (самописного) эмулятора контроллера на локальной машине.
Потом переносим проект на удалённую машину в отведённый слот времени.

Как это реализовать? Можно с помощью VI сервера. С контроллером можно выполнять ограниченное число (около 15) операций.
При старте открывается 15 указателей на одноимённые :vi: из папки либо эмулятора либо драйвера контроллера. Они заводятся
в виде массива/кластера в shift register основного цикла. При необходимости вызова метода - делается Call by Reference Node.
Альтернатива - 1 указатель на :vi: - селектор. Долго, некрасиво, завязано на пути к VI.

А с помощью ООП создаётся простая иерархия классов. Один базовый, и два производных от него - эмулятор и реальный класс.
У всех один и тот же набор методов из шаблона dynamic dispatch. в shift register заведён базовый класс. И всё :wink:
Helga
user
user
Сообщения: 89
Зарегистрирован: 14 мар 2010, 10:14
Версия LabVIEW: 9
Контактная информация:

Re: ООП - объектно-ориентированое программирование

Сообщение Helga »

Делаю сейчас проект и он неприлично разрастается, хочется переделать на ОПП. Задача - создание измерительного стенда, типичная задача для LabVIEW. Есть - тестируемый объект, несколько приборов и несколько типов измерений. Понятно, завожу класс тест. объекта, классы приборов, классы для каждого вида измерений. Что понять не могу, как при ОПП, я буду хранить и накапливать данные измерений? Не схватываю. Инициализировала объект и храню его в Shift Register? Или можно как в С++, определил объект как объект класса и меняешь параметры и не думаешь как они сохраняются. Данных измерений не очень много и они строго определены. Сейчас храняться в виде структуры и в цикле прикреплены к Shift Register. Но этих Shift Register-ов тоже уже много и структуры разрастаются. Хочется привести все в порядок. Но если все переделать на классы и заводить кучу объектов и их придется хранить в Shift Register, то лучше не станет. Вопрос: могу ли я инициализировать переменную, как переменную типа моего класса, а потом просто вызывать ее методы и свойства? Дайте пример, плиз.
Аватара пользователя
mzu2006

Professionalism Tutorials Black
doctor
doctor
Сообщения: 2456
Зарегистрирован: 16 авг 2008, 02:12
Награды: 3
Версия LabVIEW: 7.1 10 11 12
Откуда: St-Petersburg (RU), Phila, Boston, Washington DC
Контактная информация:

Re: ООП - объектно-ориентированое программирование

Сообщение mzu2006 »

Хранить придется всё-равно в shift register или в LV2Globals. Только теперь в каждом shift register сидит элемент класса (объект).
Возможно, уместен объект-аггрегатор. Или какой-то ещё из шаблонов дизайна.
Helga
user
user
Сообщения: 89
Зарегистрирован: 14 мар 2010, 10:14
Версия LabVIEW: 9
Контактная информация:

Re: ООП - объектно-ориентированое программирование

Сообщение Helga »

Попробовала переделать свое приложение на ООП. Что сразу не понравилось - если в подпрограмму передаю ссылку на экземпляр класса, то подпрограмму уже просто так не отладишь отдельно. Это также как указатели на объекты передавать. Со структурами удобнее работать, в них сохранил значения и отлаживай по частям программу.
Аватара пользователя
mzu2006

Professionalism Tutorials Black
doctor
doctor
Сообщения: 2456
Зарегистрирован: 16 авг 2008, 02:12
Награды: 3
Версия LabVIEW: 7.1 10 11 12
Откуда: St-Petersburg (RU), Phila, Boston, Washington DC
Контактная информация:

Re: ООП - объектно-ориентированое программирование

Сообщение mzu2006 »

Я бы выделил части, требующие отладки (навороченная математика,например) в отдельные SubVI, вызываемые из методов класса. Сами SubVI я бы сделал членами класса с private аттрибутом. Таким образом получится инкапсуляция отдельно, функциональность - отдельно.
Helga
user
user
Сообщения: 89
Зарегистрирован: 14 мар 2010, 10:14
Версия LabVIEW: 9
Контактная информация:

Re: ООП - объектно-ориентированое программирование

Сообщение Helga »

Создаем класс "прибор", например. Он у нас имеет параметр порт VISA. Дальше пишем метод "читать с прибора". Ну и как вы будете этот метод отлаживать? А если надо порядка 30 запросов проверить. Естественно, придется делать временные переменные для отладки. Или пару лишних файлов.
Я попыталась сделать классы "тестируемый образец", несколько классов "измерение". Для начала.
Мне надо результаты измерений и параметры образца сохранить в базе данных. До создания класса БД я не добралась, но попыталась в подпрограмму передать параметры "образца". Ну и все.
У меня большое приложение и я его пишу на компьютере без приборов, а потом отлаживаю на установке, когда она свободна, и мне важно максимально все проверить без приборов по частям. Обычно на установке запоминаешь все переменные по умолчанию, а потом с ними и работаешь. Что-то с классами так не получилось.
Пока получается, что надо оставить весь написанный код и надстроить над ним различные классы. Где тут преимущество, пока не видно. Может новый проект изначально попробую как ООП-проект спроектировать.
Аватара пользователя
mzu2006

Professionalism Tutorials Black
doctor
doctor
Сообщения: 2456
Зарегистрирован: 16 авг 2008, 02:12
Награды: 3
Версия LabVIEW: 7.1 10 11 12
Откуда: St-Petersburg (RU), Phila, Boston, Washington DC
Контактная информация:

Re: ООП - объектно-ориентированое программирование

Сообщение mzu2006 »

Helga писал(а):У меня большое приложение и я его пишу на компьютере без приборов, а потом отлаживаю на установке, когда она свободна, и мне важно максимально все проверить без приборов по частям.
Воспользуйтесь методом, описанным выше: http://labviewportal.org/viewtopic.php?p=17721#p17721
Helga писал(а):Ну и как вы будете этот метод отлаживать?
Отлаживать я буду так. Метод читать с прибора будет иметь 2 реализации: в классе-наследнике "реальный прибор" и в классе наследнике "симулируемый прибор".
Реальный метод я отлажу с реальным прибором. Симулиремый - будет частью симулятора прибора, и будет отлажен вместе с симулятором.
Helga
user
user
Сообщения: 89
Зарегистрирован: 14 мар 2010, 10:14
Версия LabVIEW: 9
Контактная информация:

Re: ООП - объектно-ориентированое программирование

Сообщение Helga »

Labview-программирование это обычно короткие проекты 3-6 месяцев. Когда вы успеваете еще симуляции писать. Как представлю симулировать все мои приборы, страшно делается. Отдельный проект получиться. Тут бы за полгода сами приборы изучить! А потом, отдел разработок. И тестируемый объект еще не доделан и методы его тестирования не слишком определены. Все очень динамично, поэтому и Labview.
Хотя можно наверное просто пустые методы вставлять вместо коммуникации с приборами, чтобы ошибки не выдавались. Можно тогда хоть кнопки отладить - включать выключать.
А как еще отлаживаете программы для работы с приборами в ситуации недоступности этих приборов? Это же часто случается! Я обычно данные сохраняю в переменных. Если картинки обрабатывать надо, то картинки наснимаю, а потом позже... А вот руку робота навигировать с микронной точностью? Как будете симулировать? Тут уж - и микроконтроллеры и видеокамеры. Приборов не много будет, ну может быть дистанции только. Как спланировать такое приложение в рамках ООП?
Аватара пользователя
mzu2006

Professionalism Tutorials Black
doctor
doctor
Сообщения: 2456
Зарегистрирован: 16 авг 2008, 02:12
Награды: 3
Версия LabVIEW: 7.1 10 11 12
Откуда: St-Petersburg (RU), Phila, Boston, Washington DC
Контактная информация:

Re: ООП - объектно-ориентированое программирование

Сообщение mzu2006 »

Helga писал(а):Labview-программирование это обычно короткие проекты 3-6 месяцев.
спасибо за интересную информацию о том, как устроено :labview: - программирование у Вас.
Helga писал(а):Тут бы за полгода сами приборы изучить!
Я обычно стараюсь как-то формализовать результат изучения новых приборов. Лучший способ формализации - в коде - реализация симулятора. Симулятор, естественно
не должен быть детальным и многофункциональным. И, естественно, должен позволять разделить отладку интерфейса и общей логики работы от отладки прибора.
Helga писал(а):А как еще отлаживаете программы для работы с приборами в ситуации недоступности этих приборов?
Я уже написал одним постом выше. Какие-то данные в самом простейшем симуляторе можно сохранить и в значениях по умолчанию индикаторах на лицевой панели.
Helga писал(а):А вот руку робота навигировать с микронной точностью? Как будете симулировать?
Напишите ТЗ, обсудим ...
Helga писал(а):И тестируемый объект еще не доделан и методы его тестирования не слишком определены. Все очень динамично, поэтому и Labview.
А ТЗ отсутствует? Или у вас экстремальное программирование? Или речь идёт об университетской лабе? Расскажите.
Helga
user
user
Сообщения: 89
Зарегистрирован: 14 мар 2010, 10:14
Версия LabVIEW: 9
Контактная информация:

Re: ООП - объектно-ориентированое программирование

Сообщение Helga »

экстремальное программирование
- хорошее определение! Примерно так и есть. ТЗ кроме тебя самой никто не напишет и всем надо быстрей быстрей. Обычно ТЗ хочется писать уже после. Отдел разработок, сегодня одно хотят мерить, завтра другое. Потом планы есть, а реально ли реализовать вопрос.
Но вот проект "Робот", назовем его так, как раз такой где возможно написание ТЗ. Чем и пытаюсь начать заниматься - читаю, изучаю вопрос и пр. В сводное время естественно. Оцениваю целесообразность использования ООП в новом проекте.
С технической стороны пока еще не все технологические процессы проверены. Клей у них еще растекается сильно.
Физически задача такая: параллелепипед со сквозными отверстиями, размеры порядка 5 мм х 8 х 3. Отверстий - 4, 8 или 16, круглые, расположены близко к друг другу, диаметр 0,8 мм, около. На отверстия с двух сторон надо клеить фильтры - кубики, с двух сторон напыление, размер 1мм. Клей отверждается в атмосфере азота при УФ. Сейчас делается в ручную, фирма хочет автоматизировать. Ну и как бы первая попытка автоматизации. При удаче будут и другие процессы автоматизироваться.
Всем железом занимается молодой парень, сделал месяц назад диплом мастера на этом. Энтузиазм у него большой. Робот фирмы EPSON. Механически он уже все движения робота разработал. Использует ВИЖЕН. Отдельные части как бы готовы. Из этого всего надо сделать программу для производства. Кнопку нажал и N-деталей изготовятся. Информацию из БД и в БД и пр. Ну и все надо проверить, точность поднять. Программировать придется все по новой.
Igor_G
assistant
assistant
Сообщения: 126
Зарегистрирован: 06 ноя 2011, 14:10
Версия LabVIEW: 2012-2016
Контактная информация:

Re: ООП - объектно-ориентированое программирование

Сообщение Igor_G »

Конкретно по драйверам и ООП:
записываешь все свойства и функции прибора и начинаешь их программировать. Но не надо забывать, что на данный момент, LabVIEW поддерживает OOP by Value, а не OOP by Reference. Это очень затрудняет использование классов в параллельных процессах.
Это еще в ЛВ 2011 тоже актуально?
Igor_G
assistant
assistant
Сообщения: 126
Зарегистрирован: 06 ноя 2011, 14:10
Версия LabVIEW: 2012-2016
Контактная информация:

Re: ООП - объектно-ориентированое программирование

Сообщение Igor_G »

Я использовал в проекте 7 независимых друг от друга классов, т.е. наследование не использовал. Буду использовать в последующих проектах.
Как лучше реализовать наследование в ЛВ? Примерчик бы простенький ;о) для новичков.
Аватара пользователя
mzu2006

Professionalism Tutorials Black
doctor
doctor
Сообщения: 2456
Зарегистрирован: 16 авг 2008, 02:12
Награды: 3
Версия LabVIEW: 7.1 10 11 12
Откуда: St-Petersburg (RU), Phila, Boston, Washington DC
Контактная информация:

Re: ООП - объектно-ориентированое программирование

Сообщение mzu2006 »

Igor_G писал(а):Конкретно по драйверам и ООП:записываешь все свойства и функции прибора и начинаешь их программировать. Но не надо забывать, что на данный момент, LabVIEW поддерживает OOP by Value, а не OOP by Reference. Это очень затрудняет использование классов в параллельных процессах.Это еще в ЛВ 2011 тоже актуально?
все версии :labview: - by value. Такова природа dataflow. В параллельных процессах можно использовать (среди множества прочих механизмов) одноэлементные очереди или DVR.
GOOP реализует ООП by reference, но с тех пор как в :labview: появилось LVOOP, я не видел новых релизов GOOP и связанного инструментария.
Igor_G писал(а):Как лучше реализовать наследование в ЛВ?
В смысле как создать класс B, наследующий от класса A? Зайдя в properties класса B, и установив inheritance.
Как лучше использовать наследование в Вашем проекте? Зайдите сюда: http://labviewportal.org/viewtopic.php?f=23&t=3010, прочитайте раздел must read + примеры приходящие с :labview:
Igor_G
assistant
assistant
Сообщения: 126
Зарегистрирован: 06 ноя 2011, 14:10
Версия LabVIEW: 2012-2016
Контактная информация:

Re: ООП - объектно-ориентированое программирование

Сообщение Igor_G »

Eugen Graf писал(а): Мы на немецком форуме чуть не передрались обсуждая LVOOP.
Где? Не нашел. Хотелось бы почитать.
Думаю сделать следующий проект на основе LVOOP.
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Модели программирования»