역할이 둘 이상인 변수가 있다면 쪼개야 한다.
그리고 변경이 없다면 js에서 항상 let대신 const를 쓸것
매개변수를 변경하는 일은 굉장히 위험할 수 있다.
매개변수를 다른 값에 할당하고 해당 값을 변경하여 사용하는 것이 역할을 다르게 쓰는 패턴중 하나다.
이름(데이터 구조)는 프로그램을 이해하는 데 큰 역할을 한다.
데이터 구조는 중요한 만큼 반드시 쌀끔하게 관리해야 한다.
파생 변수: 가볍게 계산해서 얻을 수 있는 변수(클래스에선 필드로 사용된다.)
질의 함수: 기존의 값을 계산한 값을 리턴하는 함수
가변 데이터는 소프트웨어에 문제를 일으키는 가장 큰 졸칫거리에 속한다.
한 쪽 코드에서 수정한 값이 연쇄 효과를 일으켜 다른 쪽 코드에 원인을 찾기 어려운 문제를 야기하기도 한다.
가변데이터(필드)의 유효범위를 가능한 좁혀야 한다고 힘주어 주장해본다.
가변데이터(필드)의 유효범위를 아예 줄일 수는 없지만, 질의함수(계산한 값을 리턴)로 사용할 수 있는 필드라면, 그렇게 getter로 위장해 줄일 수 있다.
값과 참조의 차이
값을 즈 자체가 더이상 불변하는 형태이기 때문에 나중에 그 값이 몰래 바뀌어서 내부에 영향을 줄까 염려하지 않아도 된다.
클래스에서 다른 클래스를 참조할 때, 해당 클래스를 값처럼 사용하려면,
사용할 때 마다 새로운 클래스를 생성할 수 있도록 변경하면 된다.
get officeAreaCode(){ // 참조를 넘기는 경우
return this._telephoneNumber.areaCode;
}
get officeAreaCode(){ // 새로운 클래스를 생성하여 값처럼 넘기는 경우(불변성)
return new TelephoneNumber(arg, this.officeNumber);
}
참조를 사용해야할 때,
논리적으로 같은 데이터를 물리적으로 복제해 사용할 때 가장 크게 문제되는 상황은
그 데이터를 갱신해야할 때다.
모든 복제본을 찾아서 빠짐없이 생신해야 하며,
하나라도 놓치면 데이터 일관성이 깨져버린다.
이런 상황이라면 복제된 데이터를 모두 참조로 바꿔주는 게 좋다.
Repository Pattern
특정한 값을 매필해서 찾아야 하는 경우라면 이 방법을 쓸 수 있다.
코드 자체가 뜻을 분명하게 드러내는 게 좋다.
상수를 저의하고 숫자 대신 상수를 사용하도록 바꾸면 될 것이다.