Види предметів
Для нашої дискусії давайте розділимо наші об’єкти на три різні види:
Це ті об’єкти, які отримують роботу. Вони переміщують гроші з одного чекового рахунку на інший, виконують замовлення та всі інші дії, які ми очікуємо здійснити.
Логічні об'єкти домену зазвичай не потребують аксесуарів (геттерів і сетерів). Швидше, ви створюєте об'єкт, передаючи йому залежності через конструктор, а потім маніпулюєте об'єктом методами (скажіть, не запитуйте).
Об'єкти передачі даних у чистому стані; вони не містять жодної логіки бізнесу. Вони завжди матимуть аксесуари. Вони можуть мати, а можуть і не мати сеттерів, залежно від того, пишете ви їх незмінно чи ні . Ви або встановите свої поля в конструкторі, і їх значення не змінюватимуться протягом життя об’єкта, або ваші аксесуари будуть прочитані / записані. На практиці ці об'єкти, як правило, можна змінювати, щоб користувач міг їх редагувати.
Об'єкти View Model містять представлення даних, що можна відображати / редагувати. Вони можуть містити ділову логіку, як правило, обмежену перевірку даних. Прикладом об’єкта «Перегляд моделі» може бути InvoiceViewModel, що містить об’єкт «Клієнт», об’єкт заголовка рахунків-фактур та рядки-позиції рахунків-фактур. Об'єкти View Model завжди містять аксесуари.
Таким чином, єдиним видом об'єкта, який буде "чистим", в тому сенсі, що він не містить польових аксесуарів, буде об'єкт "Логіка домену". Серіалізація такого об'єкта зберігає його поточний "обчислювальний стан", щоб його можна було пізніше отримати для завершення обробки. Моделі перегляду та DTO можна вільно серіалізувати, але на практиці їх дані зазвичай зберігаються в базі даних.
Серіалізація, залежності та зв'язок
Хоча це правда, що серіалізація створює залежності, в тому сенсі, що вам доведеться десеріалізувати до сумісного об'єкта, це не обов'язково випливає, що вам потрібно змінити конфігурацію серіалізації. Хороші механізми серіалізації мають загальне призначення; їм все одно, якщо ви зміните ім'я власності чи члена, доки він все ще може відображати значення для членів. На практиці це означає лише, що ви повинні повторно серіалізувати примірник об'єкта, щоб зробити представлення серіалізації (xml, json та інше) сумісним з вашим новим об'єктом; не потрібно змінювати конфігурацію серіалізатора.
Це правда, що об'єкти не повинні стосуватися того, як вони серіалізуються. Ви вже описали один із способів, як подібні проблеми можна від'єднати від класів доменів: рефлексія. Але серіалізатор повинен дбати про те, як він серіалізує та десеріалізує об'єкти; це, зрештою, його функція. Те, як ви відключаєте об'єкти від процесу серіалізації, - це зробити серіалізацію функцією загального призначення , здатною працювати для всіх типів об'єктів.
Одне з тих, що людей плутають, - це те, що розв'язка має відбуватися в обох напрямках. Це не; воно має працювати лише в одному напрямку. На практиці ніколи не можна повністю роз'єднатись; завжди є якась муфта. Мета розшарування зв'язку - полегшити технічне обслуговування коду, а не усунути всі залежності.