Краткий ответ: никогда.
На самом деле, если вы используете объект для простого хранения данных, но сам объект не имеет логики, и вы никогда не собираетесь наследовать от этого объекта, тогда все в порядке, чтобы иметьпубличные поля.Иногда я делаю такие вещи в C ++:
struct A {
int a;
float b;
string c;
A():a(0),b(0.0) {}
A(int a_, float b_, string c_):a(a_),b(b_),c(c_) {}
};
Но, кроме инициализации конструкторов, это не что иное, как структура C.Если ваш класс делает что-то большее, чем это, вы никогда не должны использовать публичные (или даже защищенные) поля.
Что касается свойств, это зависит от того, какой язык вы используете.Например, в Delphi основное назначение свойств состоит в предоставлении открытых интерфейсов для полей и может предоставлять им методы получения / установки, в то же время синтаксически работая как переменная.