Недавно я прочитал, что геттеры/сеттеры злы, и я должен сказать, что это имеет смысл, но когда я начал изучать ООП, одной из первых вещей, которые я узнал, было "Инкапсулировать ваши поля", поэтому я научился создавать класс, давая ему некоторые поля, создавать геттеры, сеттеры для них и создавать конструктор, где я инициализирую эти поля. И каждый раз, когда какой-то другой класс должен манипулировать этим объектом (или, например, отображать его), я передаю ему объект и манипулирую его с помощью getters/seters. Я вижу проблемы с этим подходом.
Но как это сделать правильно? Например, отображение/рендеринг объекта, который является классом данных, - пусть скажет Person, у которого есть имя и дата рождения. Должен ли класс иметь метод отображения объекта, в котором какой-либо Renderer будет передан в качестве аргумента? Разве это не противоречит принципу, что класс должен иметь только одну цель (в этом случае состояние хранилища), поэтому он не должен заботиться о представлении этого объекта.
Можете ли вы предложить некоторые хорошие ресурсы, где представлены лучшие практики в дизайне ООП? Я планирую начать проект в свободное время, и я хочу, чтобы это был мой учебный проект в правильном дизайне ООП.