не делать. Если общедоступных переменных/параметров много, то можно их загнать в namespace или в структуры, согласно предметной области. Класс по своей сути скрывает реализацию и детали. Если вам надо менять внутренности класса, то используйте set/get как уже посоветовали. Для классов с атомарными данными-членами следует использовать struct, например, struct Point { float x, y; void Draw(Canvas &); } Изменение извне x или y не нарушает состояние Point как "точки". Контр-пример, это любой iostream или контейнер - там "кишки" скрыты в private/protected, а флаги открыты ios::binary и т.д.
Ничего страшного в extern нет. Без него не обойтись, если в проекте более 2 файлов. Другое дело, что каждый extern должен быть обоснован, "выстрадан" и тем более документирован!