Я знаю, что это своего рода вопрос веры, и его задавали много раз, но ответы, которые я нашел, были либо слишком общими, либо не применимыми к моему варианту использования, либо не удовлетворяли иным образом.
В настоящее время я создаю приложение, которое использует классы в качестве представления для таблиц базы данных. Эти классы не предлагают собственных методов, я написал класс анализатора для каждого из них, который работает со своими объектами и возвращает данные в нужном мне формате, что делает родительские классы не более чем хранилищами данных и создает хорошее различие между данными и логикой.
Похоже, что в ООП все согласны с тем, что вам всегда нужно использовать методы получения и установки вместо прямого доступа к атрибутам класса.
Аргумент, который я часто слышал, состоит в том, что использование методов получения и установки дает возможность расширить эти функции позже, но, по моему мнению, это идет вразрез с YAGNI и некоторыми другими концепциями, которые я сейчас не могу вспомнить, — что метод должен делать именно то, что вы ожидаете от его имени. Если бы я хотел сделать что-то большее, чем просто установить значение, я бы написал новый метод, а не вставил бы его в мой метод установки, так как этот, по определению, должен только устанавливать атрибуты. Так что я мог бы также пропустить установщик и просто получить доступ к атрибуту напрямую.
Еще одно — вы можете добавить валидацию в свои сеттеры, что я уже сделал в своем API, который обращается к этим классам. По моему мнению, вы должны не просто передавать значения и заставлять объект сообщать вам, в порядке ли ваше значение, но вместо этого сначала проверять эти значения, прежде чем передать их объекту.
Я понимаю назначение личных / защищенных атрибутов в «обычных» классах, но когда класс буквально является просто контейнером данных без каких-либо методов, действительно ли это нужно? Другими словами: есть ли явный недостаток использования открытых значений, когда методы установки для них (если бы они были частными) выглядели бы просто так? public function getAttr($attr) { $this->atrr = $attr; }
тем не мение?
Что вам нужно, это структура данных. Просто так получается, что на языке, который вы реализуете, вы должны использовать конструкцию класса. Не беспокойтесь об инкапсуляции в этом случае.
Если вы изучаете объектно-ориентированный анализ / дизайн / программирование, вы понимаете, что класс — это больше, чем просто контейнер для данных и методов. Это модель вещи или концепции, и если эта вещь или концепция обладает знаниями и поведением, то их необходимо заключить в капсулу.
В вашей конкретной ситуации вы моделируете структуру данных, поэтому вам не нужно ничего инкапсулировать.
Других решений пока нет …