Ну, одна из причин, почему классы обычно содержат закрытые члены с общедоступными получателями / установщиками, заключается именно в том, что они могут проверять данные.
Если у вас есть Number, который может быть между 1 и 100, я бы определенно поместил что-то в установщик, который это проверяет, а затем, возможно, сгенерировал бы исключение, которое перехватывается кодом. Причина проста: если вы не делаете это в установщике, вы должны помнить, что ограничение от 1 до 100 каждый раз, когда вы устанавливаете его, что приводит к дублированию кода или, когда вы его забываете, приводит к недопустимому состоянию.
Что касается производительности, я с Кнутом здесь:
«Мы должны забыть о малой эффективности, скажем, в 97% случаев: преждевременная оптимизация - корень всего зла».