객체지향 생활체조-규칙7

1 분 소요

해당 글은 developerFarm 개발자 블로그의 농장객체지향 생활체조를 참고하여 정리한 글 입니다.

규칙7. 2개 이상의 인스턴스 변수를 가진 클래스 사용 금지

대부분의 클래스가 간단하게 하나의 상태 변수를 처리하는 일을 맡아 마땅하지만 몇몇 경우 둘이 필요할 때가 있다. 새로운 인스턴스 변수를 하나 더 기존 클래스에 추가하면 클래스의 응집도는 즉시 떨어진다. 보통, 이런 규칙 아래서 프로그래밍을 하는 동안 클래스는 두 종류, 즉 인스턴스 변수 한 개의 상태를 유지하는 종류와 두 개의 독립된 변수를 조율하는 종류가 있음을 파악하게 된다. 일반적으로 그 두 종류의 책임을 혼용하면 안 된다.

그 차이를 잘 아는 독자라면 규칙 3(원시값과 문자열의 포장)과 규칙 7은 같은 형태로 간주할 수 있다는 사실을 눈치챌지도 모르겠다. 더 일반적인 의미로, 많은 인스턴스 변수를 지닌 클래스를 대상으로 응집력 있는 단일 작업을 설명할 수 있는 경우는 거의 없다.

아래는 분할이 필요한 경우의 예인데, 한번 쪼개보기 바란다.

String first;
String middle;
String last;

위 코드는 다음과 같이 두 클래스로 분해할 수 있다.

class Name {
   Surname family;
   GivenNames given;
}
 
class Surname {
   String family;
}
 
class GivenNames {
   List<String> names;
}

분해 방법에 있어 (많은 법적 주체 확인에 쓰이는) 성(family name)의 판별은 다른 이름 요소(중간 이름이나 이름 등)와는 근본적으로 다르다. 여기 GivenNames 객체에는 이름 리스트가 있는데, 이름(first name), 중간 이름(middle name), 또 그 밖의 이름을 가진 사람을 흡수할 수 있다. 자주, 인스턴스 변수의 분해는 여러 개의 관련 인스턴스 변수의 공통성을 이해하게 해준다. 때때로 여러 관련 인스턴스 변수가 실은 일급 콜렉션(first-class collection) 안에서 연관된 삶을 살고 있다.

속성의 집합에서 객체를 협력 객체의 계층구조로 분해하면 더 직접적으로 효율적인 객체 모델에 이른다. 이 규칙을 이해하기 전에 대형 객체를 통해 데이터 흐름을 쫓으려고 많은 시간을 할애했다. 하나의 객체 모델을 족집게처럼 뽑아내는 일이 가능은 했지만, 동작과 관련된 그룹과 그 결과를 이해하는 일은 고통스러운 과정이었다. 반면, 이 규칙을 재귀적으로 적용하면 복잡하고 덩치 큰 객체를 훨씬 간단한 모델로 매우 빠르게 분해하게 된다. 동작은 자연스레 인스턴스 변수를 적절한 곳으로 따르며, 컴파일러와 캡슐화에 대한 규칙은 그 밖의 경우를 허용하지 않을 것이다. 분해 과정을 진행하다가 막히게 되면, 객체를 상관 있는 반으로 쪼개는 식으로 내려가거나 두 인스턴스 변수를 골라 그로부터 하나의 객체를 만드는 식으로 올라간다.

위의 객체를 분리하는 방법은 아직까지 잘 모르겠다. 굳이 저렇게 복잡하게 코드를 작성해야 하는것인가 싶기도 하고, 인스턴스 변수를 하나 이상 사용하지 말라라는 의미 자체가 파악이 잘 되지 않는다. 이 내용은 추후에 다시 수정하여 작성하도록 하겠다.

태그: ,

카테고리:

업데이트:

댓글남기기