Геттеры и сеттеры, также известные как аксессоры, представляют собой способы доступа к закрытым свойствам объекта, не делая их общедоступными. Эти частные свойства в основном представляют личность или состояние самого объекта. Идентичность и состояние объекта должны оставаться скрытыми и неизменными.

Объектно-ориентированные или псевдо-ОО-языки в основном создавались из-за простоты, удобства сопровождения и понятности. В процессе разработки мы тратим большую часть времени на чтение, редактирование или рефакторинг кода. Вот почему эта парадигма существует и почему мы ее любим — чтобы сделать разработку намного проще.

ООП стоит на трех столпах: объекты, обмен сообщениями и инкапсуляция. Последнее упомянутое нарушается геттерами и сеттерами.

Нарушение инкапсуляции

Инкапсуляция означает, что мы скрываем информацию, которая не важна при решении конкретных задач. Мы просто не раскрываем внутренности, о которых никому не нужно знать. Эта мысль должна сделать окончательную программу более легкой для понимания, без бесполезных и разрушающих частей. Возьмем пример: если я вожу машину, должен ли я знать, как все устроено внутри нее, чтобы добраться из пункта А в пункт Б? Возможно нет. Мне просто нужен хороший интерфейс, чтобы знать, как им управлять. Что, если бы все, у кого есть водительские права, также знали бы каждую деталь об автомобиле? Это безумная идея, верно?
Объекты должны иметь какое-то полезное поведение, которое я могу предложить. Объект существует, потому что он знает что-то, чего не знаю я, и мне нужно попросить его сделать работу вместо меня. Вопрос в том, что скрывается и упрощается при написании геттеров и сеттеров? Они не помогают мне решить любую проблему. Они ничего не делают. Это просто методы без контекста.

Грязный, императивный и непонятный

Геттеры и сеттеры ведут к процедурному, императивному коду и мышлению. Они заставляют наш разум думать об объектах как о структуре данных. Мы говорим: «Эй, задайте это имя и не волнуйтесь, зачем оно мне нужно, просто ведите себя при некоторых обстоятельствах как структура данных». Что означает setName? Это просто общая императивная команда, как сказать, что мне нужно что-то переименовать. Не лучше ли было бы выразить намерение в той области, в которой мы работаем? Все бы поняли и не было бы путаницы.

Сделай сам

Геттеры обычно используются, потому что на месте A мне нужно значение из объекта X, а на месте A мне нужно что-то сделать со значением. Почему это не может сделать объект X напрямую, а данные нужно передавать куда-то еще? Мы делаем объект глупым, потому что он не в состоянии сделать это самостоятельно. Какой же бардак, когда мы допускаем, что в нашем приложении есть 50 подобных объектов. А что, если эти данные нужны для представления, спросите вы? Просто заставьте объект сделать само представление.

TDD

Если вы собираетесь писать приложение с использованием TDD, вы должны полностью отказаться от написания геттеров и сеттеров, потому что их бесполезно тестировать. Они просто передают значения внутрь и наружу без каких-либо изменений. Вам не нужно это тестировать. Если вам не нужно это проверять, не пишите это.

Резюме

Не используйте геттеры и сеттеры, потому что они нарушают инкапсуляцию и сокрытие данных. Это просто общие имена без контекста. Для общего имени всегда есть более выразительная метка. Объекты, состоящие из геттеров и сеттеров, — это просто структуры данных без полезного поведения. Геттеры и сеттеры — это процедурно-императивный подход, как притвориться ООП. То, что нельзя протестировать или что тестировать бесполезно, не стоит и писать.