동일성으로 식별되는 객체
객체라는 말은 흔히 들어서 이해가 되지만 동일성이란 무슨 말일까 ?
사용자가 최초로 등록되고 난후 값들이 변경이 되어도 해당 사용자가 다른 사용자가 되는 일은 없다.
우리는 이러한 구별값을 각자마다 UUID
, Primary Key
로 식별하곤 한다.
앞서 얘기한것처럼 식별할 수 있는 값만 있으면 값들은 변동이 된다.
username
이 변경이 될 수도 있고 , age
가 변경 될 수도 있다.
이는 반드시 가변일 필요가 없으며, 필요에 따라 속성을 가변으로 만들 수 있는 객체일 뿐이다.
다만
class User
private string name;
public User(string name) {
if (name == null) throw new ArgumentNullException(nameof(name));
if (name.Legnth < 3) throw new ArgumentException("user 3글자")
this.name = name;
...
class user
private string name;
public User(string name) {
ChangeName(name);
}
public void ChangeName(string name) {
if (name == null) throw new ArgumentNullException(nameof(name));
if (name.Legnth < 3) throw new ArgumentException("user 3글자")
this.name = name;
}
setter
를 사용하기 보단, 이름을 변경하는 메서드를 생성해서 변경 하도록 하자
이는 쉽게 이해할 수 있을것 같다.
id = 1
name = jon
age = 32
id =2
name = jon
age = 32
두개의 값 객체는 같은 객체가 아니다. 값이 같을 뿐이지 엄연히 다른 객체이다.
값이 같아도 무언가의 식별자가 존재하게 되는데 위에서는 id
라고 볼 수 있다.
class UserId
{
private string value;
public UserId(string value)
{
if (value == null) throw new ArgumentNullException(nameof(value));
this.value = value;
}
}
...
사용자가 이름을 변경 하기전과 변경하기 이후 같은 사용자로 인식해야한다.
class User
{
private readonly UserId; // 식별자
private string name;
public User(string name)
{
if (id == null) throw new ArgumentNullException(nameof(id));
this.id = id;
ChangeUserName(name);
}
public void ChangeUserName(string name)
{
if (name == null) throw new ArgumentNullException(nameof(name));
if (name.Length < 3 ) throw new ArgumentException("사용자명은 3글자 이상이어야 함");
this.name = name;
}
}
식별자를 통해 같은 User 인지 아닌지를 판단하기 때문에 UserId
로 판단 하기 위한 메서드가 필요로 하다. 이책에서는
void Check(User leftUser, User rightUser)
{
if (leftUser.Equals(rightUser))
{
console.WriteLine("동일한 사용자임");
}
}
를 통해서 판단하고있다.
엔티티와 값 객체 두개는 유사한점이 많다.
그럼 어떻게 구별을 할까 ?
로서 다루면 좋다.
주석이 없어도 술술 익히는코드를 지향하는것처럼 보였다.
class User
{
public string Name { get; set;}
}
위의 코드에선 내용을 잘 알려주지 않고 있다.
class UserName
{
private readonly string Value;
public UserName(string value)
이처럼 코드에 대한 힌트를 많이 줘야한다.
사람일이 변하기 쉬운것처럼 도메인도 같다.
사용자명의 최소길이가 3글자 이상이였다가 최소길이 6글자 이상으로 바뀔 수도 있다.