물건의 종류
논의의 목적으로, 우리의 객체를 세 가지 다른 종류로 나누겠습니다.
이것들은 작업을 수행하는 객체입니다. 그들은 하나의 당좌 계좌에서 다른 당좌 계좌로 돈을 옮기고, 주문을 이행하며, 비즈니스 소프트웨어가 취할 것으로 예상 되는 다른 모든 행동을 합니다.
도메인 논리 객체에는 일반적으로 접근 자 (getter 및 setter)가 필요하지 않습니다. 오히려 생성자를 통해 종속성을 전달하여 객체를 만든 다음 메서드를 통해 객체를 조작하십시오 (텔레, 요청하지 않음).
데이터 전송 객체는 순수한 상태입니다. 비즈니스 로직이 포함되어 있지 않습니다. 그들은 항상 접근자가 있습니다. 불변의 방식으로 글을 쓰는지 여부에 따라 세터가 있거나 없을 수 있습니다 . 생성자에서 필드를 설정하면 객체의 수명 동안 값이 변경되지 않거나 접근자가 읽기 / 쓰기가됩니다. 실제로 이러한 개체는 일반적으로 변경 가능하므로 사용자가 편집 할 수 있습니다.
뷰 모델 객체에는 표시 가능 / 편집 가능한 데이터 표현이 포함됩니다. 여기에는 일반적으로 데이터 유효성 검사에 국한된 비즈니스 로직이 포함될 수 있습니다. 뷰 모델 개체의 예로는 고객 개체, 송장 헤더 개체 및 송장 품목이 포함 된 InvoiceViewModel이 있습니다. 뷰 모델 객체에는 항상 접근자가 포함됩니다.
따라서 필드 접근자를 포함하지 않는다는 점에서 "순수"할 수있는 유일한 개체는 Domain Logic 개체입니다. 이러한 개체를 직렬화하면 현재 "계산 상태"가 저장되므로 나중에 검색하여 처리를 완료 할 수 있습니다. 뷰 모델과 DTO는 자유롭게 직렬화 할 수 있지만 실제로는 데이터가 데이터베이스에 저장됩니다.
직렬화, 종속성 및 커플 링
직렬화가 종속성을 생성하는 것은 사실이지만 호환 가능한 개체로 역 직렬화해야한다는 의미에서 직렬화 구성을 변경해야하는 것은 아닙니다. 좋은 직렬화 메커니즘은 일반적인 목적입니다. 값을 멤버에 매핑 할 수있는 한 속성이나 멤버의 이름을 변경해도 상관 없습니다. 실제로 이것은 직렬화 표현 (xml, json 등)이 새 객체와 호환 가능하도록 객체 인스턴스를 다시 직렬화해야 함을 의미합니다. 시리얼 라이저에 대한 구성 변경이 필요하지 않습니다.
객체가 직렬화되는 방식에 관심을 가져서는 안된다는 것은 사실입니다. 이러한 우려가 도메인 클래스에서 분리 될 수있는 한 가지 방법 인 이미 설명했습니다. 리플렉션. 그러나 serializer 는 개체를 serialize하고 deserialize하는 방법에 대해 염려 해야 합니다. 결국 그 기능입니다. 객체를 직렬화 프로세스에서 분리하는 방법은 직렬화를 범용 기능 으로 만들어 모든 객체 유형에서 작동 할 수 있도록하는 것입니다.
사람들이 혼란스러워하는 것 중 하나는 디커플링이 양방향으로 발생해야한다는 것입니다. 그렇지 않습니다. 한 방향으로 만 작동해야합니다 . 실제로는 완전히 분리 할 수 없습니다. 항상 몇 가지 커플 링이 있습니다. 느슨한 결합의 목표는 모든 종속성을 제거하지 않고 코드 유지 관리를보다 쉽게 만드는 것입니다.