Предоставляя аксессуар (методы setter/getter или используя свойства на поддерживающих их языках, например C#), разработчик может определить более стабильный контракт между классом и его пользователями. Вместо прямого доступа к полю, фактически просматривая или записывая местоположение памяти, пользователь вынужден вызывать метод, который, в свою очередь, может инкапсулировать любую необходимую логику.
В свою очередь, при изменении внутреннего дизайна класса его контракт нужно менять реже. Следовательно, улучшается ремонтопригодность и стабильность кода.
Обратите внимание, что производительность не вызывает беспокойства, поскольку современные компиляторы JIT могут оптимизировать вызовы для тривиальных геттеров/сеттеров таким образом, что фактический вызов устраняется, а код эквивалентен прямому доступу к базовой ячейке памяти.
Edit:
Кроме того, сеттер и добытчик обычно могут иметь различную видимость (публичный/защищенный/частную), обеспечивающие дополнительное преимущество более-зернистый контроль для чтения/записи в течение заданного значения.
Следовательно, лучше всего избегать публичных полей, где это возможно, и использовать методы и свойства setter/getter.
«Держите других в управлении» - так, когда его только я и небольшой проект, круто. В противном случае, getter() setter() выполняет внутреннюю работу класса? Это консенсус? – jason
Нет, я специально упомянул вас «вы», и имейте в виду, что вы не сможете вспомнить, с какими полями вы должны или не должны «махать», даже если это небольшой проект, не говоря уже о том, что через несколько недель или даже дни пройдут. И последнее, но не менее важное - как общее правило - нет никакой разницы между лучшими практиками между тем, если вы пишете проект самостоятельно или если вы являетесь частью команды. –
@jason это не вопрос размера команды. Это вопрос чистой, поддерживаемой, стабильной базы кода. –