Библиотеки Arduino: объявляете ли вы переменные публичными?
Почему я никогда не видел, чтобы библиотека Arduino выставляла некоторые из своих внутренних переменных как публичные в заголовочном файле? Я вижу только функции, объявленные как публичные, в то время как каждая переменная объявлена как частная.
Предыстория: Я хочу написать свою первую библиотеку Arduino. И я подумал о том, чтобы сделать некоторые переменные этой библиотеки общедоступными, чтобы мне не пришлось вызывать функцию позже, когда я импортирую библиотеку.
Например, я хочу:
#include MyLibrary
...
MyLibrary instance();
instance.avariable = 12345;
вместо:
#include MyLibrary
...
MyLibrary instance();
instance.setVariable(12345);
@Henry, 👍2
2 ответа
Лучший ответ:
Классы используются для сокрытия сложности определенной задачи. Пользователь класса не должен беспокоиться о том, как именно работает библиотека внутри, а должен беспокоиться только о том, как ее следует использовать. Во многих случаях прямая запись в переменную-член может быть не только удобной, но и вредной, если установлено неправильное значение. Если вместо этого вы используете функцию для установки переменной, автор может добавить код, чтобы предотвратить фактическую запись неправильных значений в переменную. Также может быть задействована какая-то другая логика, которая не срабатывает, если вы пишете напрямую в переменную. Поэтому — для простоты использования — пользователи могут захотеть, чтобы за это отвечала библиотека, а не они сами.
Если вы пишете библиотеку, вы продумали, как ее следует использовать. Скрытие других способов — это распространенный способ провести пользователя через использование. Способы использования, которые не соответствуют цели библиотеки, можно скрыть, чтобы сделать правильный способ более понятным. Производитель пилы не дает пользователю инструкций, как использовать неправильную сторону лезвия, потому что это не поможет вам при пилении.
Это не означает, что вы вообще не должны делать переменные публичными, но только если это имеет смысл. Например: если вы определяете класс, который просто представляет точку в системе координат без привязок к другому коду, то совершенно нормально сделать координаты публичными. Но если вы определили класс так, чтобы точка отображалась непосредственно на дисплее, вы можете захотеть изменить положение на дисплее, когда одна из координат изменяется. В этом случае вы можете использовать функцию set для запуска обновления дисплея, когда для переменной было задано новое значение.
Экосистема Arduino в основном предназначена для новичков. Это часто означает, что люди с очень небольшими знаниями будут использовать ее и часто будут пробовать случайные вещи, чтобы заставить все работать. (и как только они найдут что-то работающее, они научат этому следующего парня, у которого возникнет та же проблема).
Запрет на то, что может легко нарушить инварианты библиотеки с самого начала, уменьшает объем поддержки, которую вам необходимо оказать людям, которые непреднамеренно нарушают библиотеку, случайным образом изменяя какую-либо переменную.
- Используйте ISR внутри библиотеки более элегантно
- Как объявить указатель на библиотеку arduino neopixels, чтобы настроить его в функции настройки с помощью динамических переменных?
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- Ошибка: "недопустимое использование нестатической функции-члена" при вызове функции из моего собственного класса-метода
- Массив динамического размера в качестве члена класса
- Какие Arduino поддерживают ATOMIC_BLOCK?
- Как перебрать объекты или передать объект функции?
- C++ Undefined reference to 'Class:Function()'