Виды предметов
Для целей нашего обсуждения давайте разделим наши объекты на три различных вида:
Это объекты, которые делают работу. Они переводят деньги с одного текущего счета на другой, выполняют заказы и все другие действия, которые мы ожидаем от программного обеспечения для бизнеса.
Объектные логические объекты обычно не требуют доступа (геттеры и сеттеры). Скорее, вы создаете объект, передавая ему зависимости через конструктор, а затем управляете объектом с помощью методов (скажите, не спрашивайте).
Объекты передачи данных находятся в чистом виде; они не содержат никакой бизнес-логики. У них всегда будут аксессуары. Они могут иметь или не иметь сеттеры, в зависимости от того, пишете ли вы их неизменным образом. Вы либо установите свои поля в конструкторе, и их значения не будут меняться в течение всего времени существования объекта, либо ваши методы доступа будут доступны для чтения / записи. На практике эти объекты обычно являются изменяемыми, поэтому пользователь может их редактировать.
Объекты View Model содержат отображаемое / редактируемое представление данных. Они могут содержать бизнес-логику, обычно ограниченную проверкой данных. Примером объекта View Model может быть InvoiceViewModel, содержащий объект Customer, объект заголовка Invoice и отдельные позиции Invoice. Объекты View Model всегда содержат методы доступа.
Таким образом, единственным видом объекта, который будет «чистым» в том смысле, что он не содержит полевых методов доступа, будет объект логики домена. Сериализация такого объекта сохраняет его текущее «вычислительное состояние», так что его можно извлечь позже для завершения обработки. Модели представлений и DTO можно свободно сериализовать, но на практике их данные обычно сохраняются в базе данных.
Сериализация, зависимости и связь
Несмотря на то, что сериализация создает зависимости, в том смысле, что вам необходимо десериализовать совместимый объект, это не обязательно означает, что вы должны изменить конфигурацию сериализации. Хорошие механизмы сериализации имеют общее назначение; им все равно, если вы измените имя свойства или члена, если оно все еще может отображать значения для членов. На практике это означает, что вы должны повторно сериализовать экземпляр объекта, чтобы представление сериализации (xml, json и т. Д.) Было совместимо с вашим новым объектом; не нужно вносить изменения в конфигурацию сериализатора.
Это правда, что объекты не должны интересоваться тем, как они сериализуются. Вы уже описали один способ, которым такие проблемы могут быть отделены от классов домена: отражение. Но сериализатор должен заботиться о том, как он сериализует и десериализует объекты; это, в конце концов, его функция. Способ, которым вы отделяете свои объекты от процесса сериализации, состоит в том, чтобы сделать сериализацию универсальной функцией, способной работать со всеми типами объектов.
Люди могут запутаться в том, что развязка должна происходить в обоих направлениях. Это не; это должно работать только в одном направлении. На практике вы никогда не сможете полностью отделиться; всегда есть некоторая связь. Цель слабой связи состоит в том, чтобы облегчить обслуживание кода, а не удалить все зависимости.