Пример использования принципов ООП при работе с Arduino

  Переглядів 2,641

HackerOK

HackerOK

День тому

Видео предлагает подход к программированию, который широко распространен, но часто забывается при изучении Arduino. Видео навеяно тем, что Arduino обычно изучается отдельно от C++, и проекты на Arduino популярны в школах, вузах и повседневной жизни. Однако, часто обучение Arduino отрывается от изучения программирования в целом, что приводит к проблемам на уровне понимания работы с платформой.
Автор демонстрирует пример работы со светодиодом, используя объектно-ориентированное программирование. Он объясняет, что в объектно-ориентированном программировании данные и методы их обработки должны быть отделены от остальной программы. В примере используется структура класса, которая описывает данные и методы работы со светодиодом.
Таймкоды:
0:00 Введение
0:53 Базовый пример
2:58 Обоснование проблемы
4:50 Предложение подхода
5:45 Формулировка задачи
7:00 Структура объекта
8:14 Перенос кода из основной программы в класс
9:11 Демонстрация работы с классом
10:11 Масштабирование
11:45 Заключение
13:37 Конечная завставка

КОМЕНТАРІ: 35
@pavku
@pavku Місяць тому
На фоне однотипных уроков с морганием - оригинально! Давай ещё! Формат отличный - коротко и по делу. Лучше много мелких видосов, чем один длинный.
@ybarichev
@ybarichev Місяць тому
Попробую)
@fpedotovvalentin
@fpedotovvalentin Місяць тому
того же эффекта можно добиться простым выносом в функцию логики мигания. Это называется структурное программирвоание. Мощь ООП же проявляется тогда, когда у тебя есть метод "помигайТремяСветодиодами", у которого есть задача мигать тремя светодиодами), и когда один светодиод мигает по дефолту, второй, например, использует какую-то библиотеку, третий, например, вообще не светодиод, а какой-то интерфейс для передачи по блютусу сигнала на удаленное устройство, которое уже мигает светодиодом)(зависит от фантации и требований), и это, например, зависит динамически (заранее неизвестно, где что находится), то, добавив разные объекты с методом tick для каждого типа устройства, можно не менять метод "помигайТремяСветодиодами" менять мигающие устройства. Без понимания этого, не будет понимания зачем нужно ООП и не будет понимания как правильно писать ООП и зачем вообще нужны эти инкапсуляции и полиморфизмы.
@ybarichev
@ybarichev Місяць тому
Согласен. Моя задача тут скорее показать, что такое существует и заинтересовать человека. Поэтому я и взял такой простой пример и намеренно отказался от рассмотрения других принципов(да и абстракцию конечно почти не раскрыл). А пугать сложными конструкциями... Можно конечно, но в том случае, если человек осознанно решил изучить тему, а тут другая задача. Уже упоминали тут просто пример с внесением светодиода как отдельной сущности, да и про вынесение в функцию тоже был комментарий. ООП это дивный чудный мир, но начинать с ним знакомится бывает страшно
@mharqke
@mharqke Місяць тому
это интересный подход, я даже не задумывался о нём, а теперь захотелось попробовать, спасибо за ролик обычно я функции выносил в другие файлы и абстракция чем-то похоже на это
@ybarichev
@ybarichev Місяць тому
На самом деле первую версию этого ролика я готовил к публикации 31 декабря, он был с совершенно другой подачей материала и при том, что текста там было больше, он должен был получиться вдвое короче. К чему я это... Там я как раз еще и приводи пример программирования через функции. В функциях использовались статические переменные и получалось очень и очень близко к ООП, там же я и хотел показать недостатки, все же статические переменные не всегда хорошо использовать, да и не все переменные можно такими сделать (сделать можно, но не нужно), да и путанница возникает, кучу параметров надо в функцию передавать итд. Так что подход рабочий и часто его можно встретить в проектах более опытных людей, но все же ООп лучше поддается масштабированию)
@vryaboshapko
@vryaboshapko Місяць тому
После Scala и Kotlin синтаксис классов в C++ смотрится просто чудовищно 🙈 Но видео, конечно, классное, и подход отличный. Без ООП любой скетч больше чем на ≈50 строк становится нечитаемым.
@ybarichev
@ybarichev Місяць тому
Рад, что понравилось) А синтаксис - дело привычки, я, например, к питоновским классам привыкнуть не могу и они у меня с трудом идут. А когда переходил с C# на C++ тоже не хватало некоторых моментов, но ничего, привык)
@homovespertilio
@homovespertilio Місяць тому
Смог. Есть возражение по неймингу. Blinker - отглагольное существительное - "мигатель", корректнее было бы Diod, А мигатель это то чем Diod должен быть расширен, чтобы получить метод мигать. Если Blinker заменить на Diod, возражений больше не будет. Второе возражение по неймингу, pinRed - понятно, что это пин, понятно что он красный. red - красный, не понятно кто. redDiod? Вопрос: а номер пина сразу в инициализатор можно передать? Кажется выделение константы для этого избыточно.
@ybarichev
@ybarichev Місяць тому
С неймингом согласен частично, тут подразумевается, что светодиод, поэтому pinRedDiod уже избыточно(я про конкретно эту задачу говорю), а так да, подход верный и я с ним полностью согласен. Опять же, если более грамотно подходить, надо было бы ввести дополнительный уровень абстракции светодиод, который можно включать и выключать, а к нему расширить вариантом с шимом, а уже от этого дела унаследовать блинкер, как именно мигатель. По поводу констант - конечно избыточно в такой мелой задаче))) Повторюсь, тут больше про подход, а не про конкретную реализацию
@homovespertilio
@homovespertilio Місяць тому
@@ybarichev так нейминг одна из сложнейших проблем, сложнее чем ваш пример :)
@ybarichev
@ybarichev Місяць тому
Согласен. Это отдельная большая тема)
@user-sj9xp5zs8e
@user-sj9xp5zs8e Місяць тому
Здравствуй, а какие возможности C++ (типа новых модулей из стандарта 20) вообще может поддерживать arduino?
@ybarichev
@ybarichev Місяць тому
С ходу так затрудняюсь ответить, но где то встречал информацию о лямбда-функциях и умных указателях, видел порт arduino stl, но сам не использовал никогда
@user-sj9xp5zs8e
@user-sj9xp5zs8e Місяць тому
Мне кажется, что мы ограниченны возможностью платы и компилятором@@ybarichev
@ybarichev
@ybarichev Місяць тому
Насколько я понимаю, именно проблемы скомпилировать нет, но памяти в atmeg'e для таких выкрутасов маловато. Да и потребности нет использовать мощные фишки из 20+ стандартов нет. Ардуино это скорее Учебная платформа, а реальные промышленные разработки создаются уже без использования wiring(arduino cpp), а скорее на чистом си
@dmitriibannikovasx
@dmitriibannikovasx Місяць тому
@@ybarichev Я как то работал на коммерческом проекте. Там использовался мк stm32f4 серии и писали прогу на плюсах. Чистый си очень сложно масштабировать, как по мне (там даже перегрузок функций нет вроде). Поэтому писать много кода и поддерживать его читаемым на чистом си очень сложно.
@ybarichev
@ybarichev Місяць тому
У меня маленький опыт работы с Си, поэтому ничего не могу сказать, но наверное да, масштабировать такой код тяжело(
@telap
@telap Місяць тому
Использовать int для хранения номера пина 💀
@bBlackDen
@bBlackDen Місяць тому
Поясните не шарящему что не так?
@ybarichev
@ybarichev Місяць тому
Ну криминала то тут нет) если бы я сам критиковал, то скорее за реализацию классов, да и за Метод init, вместо конструктора. А по поводу того, как хранить имена пинов тоже нет единого стандарта. Кто дефайнами, кто константами Именно такой вариант я взял, потому что Гайвер так пишет, а его уроки самые популярные. Поэтому, чтобы новичкам голову не забивать, решил так сделать
@telap
@telap Місяць тому
@@ybarichev Ну да
@telap
@telap Місяць тому
@@bBlackDen int занимает место. Лучше использовать #define pin 12 т к это не переменная. Компилятор просто заменяет pin на 12, а int это переменная и она занимает место
@ybarichev
@ybarichev Місяць тому
Пины от 0 до 13 для arduino Uno, а тип int позволяет хранить числа от - 32768 до 32767, так что для номера пина логичнее применять uint8_t, который от 0 до 255(и занимает меньше места в памяти)
@user-ti3qd5re5t
@user-ti3qd5re5t Місяць тому
единственный кто на реальном примере объснил ооп без вяких там "представе машину у ее есть колеса..." и т.д и т.п
@ybarichev
@ybarichev Місяць тому
Я ООП вообще не объяснял) Там очень много и долго можно изучить, моей задачей было показать, что такое вообще существует и побудить к самостоятельному изучению)
@user-ti3qd5re5t
@user-ti3qd5re5t Місяць тому
@@ybarichev да нет, ты как раз-таки и объяснил на примере, как его использовать.
@ybarichev
@ybarichev Місяць тому
Тут уже был комментарий, про то, что если бы то был полноценный урок по ООп, надо было бы продемонстрировать еще и остальные принципы(конкретно был пример про наследование). У меня есть еще идея, как раскрыть эту тему более подроно, но она требует намного больше сил и уложиться в 10 минут будет сложновато. Например, написать универсальный интерфейс для работы с цифровыми и аналоговыми датчиками температуры. Так как раз и базовый класс, и потомки, и полиморфизм, в общем полный ООП) В любом случае рад, что видео понравилось)
C++ Разработчик учит Python
28:01
Winderton
Переглядів 464 тис.
Зомби Апокалипсис  часть 1 🤯#shorts
00:29
Kitten has a slime in her diaper?! 🙀 #cat #kitten #cute
00:28
React JS фундаментальный курс от А до Я
3:01:08
Лучшая IDE для Python!
8:15
Хауди Хо™ - Просто о мире IT!
Переглядів 346 тис.
Самое простое объяснение парадокса Ферми
28:11
Задний двор Айлашкерского
Переглядів 112 тис.