Прежде всего, «свойства» могут относиться к разным вещам на разных языках. Например, в Java вы имеете в виду переменные экземпляра, тогда как в C # есть различие между ними.
Я собираюсь предположить, что вы имеете в виду переменные экземпляра, поскольку вы упоминаете геттеры / сеттеры.
Причина, о которой упоминали другие, - Инкапсуляция. А что нас покупает Encapsulation?
Гибкость
Когда что-то должно измениться (и обычно это происходит), у нас гораздо меньше шансов сломать сборку, правильно инкапсулируя свойства.
Например, мы можем принять решение о внесении изменений, например:
int getFoo()
{
return foo;
}
int getFoo()
{
return bar + baz;
}
Если бы мы не инкапсулировали 'foo' для начала, у нас было бы гораздо больше кода, который нужно изменить. (чем эта строка)
Еще одна причина для инкапсуляции свойства заключается в том, чтобы предоставить способ пуленепробиваемости нашего кода:
void setFoo(int val)
{
if(foo < 0)
throw MyException(); // or silently ignore
foo = val;
}
Это также удобно, поскольку мы можем установить точку останова в мутаторе, чтобы мы могли прерывать ее всякий раз, когда что-то пытается изменить наши данные.
Если бы наша собственность была публичной, то мы бы не смогли ничего сделать!