가치 객체

Value object

컴퓨터 과학에서 가치 개체는 동일성이 정체성에 기초하지 않는 단순한 실체를 나타내는 작은 개체로, 즉 두 가치 개체가 동일한 가질같으며, 반드시 동일한 개체일 필요는 없다.[1][2]

가치 객체의 예로는 금액이나 날짜 범위를 나타내는 객체가 있다.

작을수록 동일한 실체를 나타내는 동일한 가치 객체의 여러 복사본을 가질 수 있다. 즉, 단일 인스턴스에 의존하고 그것에 대한 참조를 사용하는 것보다 새로운 객체를 만드는 것이 더 간단한 경우가 많다.[2]

가치 객체는 불변의 것이어야 한다:[3] 이것은 창출된 두 가치 객체가 동등하게 유지되어야 한다는 암묵적 계약에 필요하다.클라이언트 코드가 값 개체를 유효하지 않은 상태로 만들거나 인스턴스화 후 버기 동작을 도입할 수 없기 때문에 값 개체가 불변하는 것도 유용하다.[4]

가치 객체는 DDD의 구성 요소 안에 있다.

실행

다양한 객체 지향 프로그래밍 언어의 뉘앙스 때문에, 각각 가치 객체를 구현하고 사용하는 방법과 패턴을 가지고 있다.

C#

C#에서 클래스참조 유형인 반면 구조체(C 언어로 구조체에서 파생된 개념)는 값 유형이다.[5]따라서 클래스 정의에서 파생된 인스턴스는 하나의 객체인 반면, 구조 정의에서 파생된 인스턴스는 가치 객체라고 한다(정확하게 말하면 속성을 읽기[6] 전용으로 선언하는 가치 객체를 나타내기 위해 구조체가 불변으로 만들어질 수 있다).

C# 클래스에 값 객체 특성을 추가하려면 다음 절차를 수행할 수 있다.

  1. 비즈니스 논리를 사용하여 개체를 비교하도록 메소드를 재정의하십시오.
  2. 운영자가 의 기본 동작을 오버로드함==그리고!=를 이용하다Equals방법
  3. 메소드를 재정의하고 동일한 동등성을 가진 객체에 대해 해시가 동일한지 확인하십시오.
  4. 속성 세터를 제거하고 생성자를 통해 멤버 값만 전달하여 클래스를 불변으로[7] 만드십시오.[8]

C++

C++에서 값 객체는 할당 연산자과부하를 가하고 필드(시뮬레이터의 이니셜라이저 리스트에 의해 한 번 평가됨)와 클래스의 방법에 적절한 항상성 제약조건을 사용하여 빌드할 수 있다.

그러나 필드 자체가 constituter로 선언된 경우("getter" accessor"만 노출하면서 비정규 필드를 사용하는 것이 아니라), 그러한 값 객체를 다른 값 객체로 완전히 덮어쓸 수는 없을 것이다().object1 = object2).

자바

자바는 C#, C++와 달리 언어 수준의 사용자 지정 값 유형에 대한 지원이 없다.모든 사용자 정의 유형은 참조 유형이므로, 사용자 정의 값 유형에 대한 지원을 확장하는 것이 고려되고 있지만,[9] ID 및 참조 의미 체계를 가지고 있다.[10]

따라서 Java 프로그래머들은 불변의 객체를 만들어 가치 객체를 에뮬레이트하는데,[11] 객체의 상태가 변하지 않는다면 참조를 전달하는 것은 의미론적으로 가치 객체를 복사하는 것과 동일하기 때문이다.

클래스는 모든 속성을 공백 결승으로 선언하고 [12]모든 속성을 불변 유형으로 선언하여 불변으로 만들 수 있다(예:이러한 규칙에 따라 선언된 문자열, 정수 또는 기타 유형), 어레이 목록 또는 날짜와 같은 변경 불가능한 유형이 아님.그들은 또한 참조보다는 값을 비교하기 위해 등가 및 해시코드를 정의해야 한다.

"VALJO"(VALue Java Object)라는 용어는 정확하게 정의된 불변의 가치 객체에 필요한 보다 엄격한 규칙 집합을 참조하기 위해 만들어졌다.[13]

Java 14 이후 가치 객체를 데이터 레코드로[14] 사용할 수 있음

예.

공중의 계급 스트리트 어드레스 {     공중의 스트리트 어드레스(끈을 매다 거리, 끈을 매다 도회)     {         거리 = 거리;         도시 = 도회;     }      공중의 최종의 끈을 매다 거리 { 얻다; }     공중의 최종의 끈을 매다 도시 { 얻다; } } 

참고 항목

참조

  1. ^ Fowler, Martin (2003). "Value Object". Catalog of Patterns of Enterprise Application Architecture. Martin Fowler (martinfowler.com). Retrieved 17 July 2011.
  2. ^ a b "Value Object". Portland Pattern Repository's Wiki. Cunningham & Cunningham, Inc. (c2.com). Retrieved 6 September 2012.
  3. ^ "Value Object Should be Immutable". Portland Pattern Repository's Wiki. Cunningham & Cunningham, Inc. (c2.com). Retrieved 6 September 2012.
  4. ^ Burns, Sam. "The Value of a Value Object". sam-burns.co.uk.
  5. ^ "Classes and Structs (C# Programming Guide)". Microsoft Developer Network (msdn.microsoft.com). 2012. Retrieved 5 September 2012.
  6. ^ "Creating an immutable value object in C# - Part III - Using a struct". Luca Bolognese's WebLog. 2012. Retrieved 7 September 2012.
  7. ^ Koirala, Shivprasad. "Immutable objects in C# - CodeProject". www.codeproject.com. Retrieved 2017-12-26.
  8. ^ koirala, Shivprasad. "Value Object Design Pattern in C#". www.codeproject.com. Retrieved 2017-12-26.
  9. ^ "Java Language Specification, chapter 4. Types, Values, and Variables". Retrieved 7 October 2015.
  10. ^ "JEP 169: Value Objects". Retrieved 7 October 2015.
  11. ^ "Immutable objects". Collected Java Practices. 2012. Retrieved 5 September 2012.
  12. ^ 따라서 건설업자만 배정할 수 있다.
  13. ^ "VALJOs - Value Java Objects". Retrieved 19 October 2014.
  14. ^ "Records Come to Java". Retrieved 13 April 2021.