Я определенно согласен с вами, что иногда вы сталкиваетесь с этой проблемой.Я испытал это с сериализацией, которая похожа на ORM.В моем случае мне нужно было записать состояние объекта в (двоичный) файл.
В некоторых случаях может быть целесообразно создать интерфейс, через который можно записывать и читать внутреннее состояние.Таким образом, ваш персональный класс получит два мета: «сохранить» и «загрузить» (или «написать» и «прочитать», или что вы считаете подходящим).Этим методам передаются «IPropertyWriter» и «IPropertyReader» соответственно.(В моем случае я назвал их InStream и OutStream).
Person :: save (IPropertyWriter Writer) тогда будет делать
writer.writeProperty("name", this.name);
writer.writeProperty("age", this.age);
Вы можете утверждать, что вы все еще нарушаете Принцип единой ответственности, но я бы сказал, что никто другой не должен знать внутренности человека.(Особенно в моем случае с сериализацией мне пришлось хранить внутреннее состояние, которое частично не доступно через геттеры).Суть в том, что Person не связан ни с одним кодом базы данных.Ваш IPropertyWriter может быть чем угодно.Кроме того, ответственность за «знание своих собственных свойств» на самом деле не является новым свойством, а в любом случае присваивается каждому объекту.
Вы также можете задать вопрос, насколько вероятно, что Человек изменится.Если это маловероятно, я думаю, что friend
классы, как в C ++, являются хорошим способом, но если это может измениться, я бы предпочел, чтобы методы сериализации были в том месте, где объявлены свойства, так что вы не забудетеобновите зависимый код.