2017-01-23 5 views
0

클래스 PersonList에는 AddNewPerson() 메서드가있어서 내부 목록에 새 Person을 추가한다고 가정 해 봅시다. 그러나 Person의 생성자에는 여러 매개 변수 (주로 의존하는 인터페이스)가 필요합니다. 즉, PersonList 생성자에 전달 된 매개 변수를 필요로합니다 (또는 어떻게 든 사용할 수 있음).실제 종속성이 명확하도록 생성자를 어떻게 리팩토링 할 수 있습니까?

PersonList은 이러한 종속성을 직접 사용하지 않기 때문에이 배열은 코드 냄새처럼 보입니다. 그것은 단순히 다른 생성자에게 전달합니다. 이 클래스들을 어떻게 리팩토링하여 각 클래스에 대한 실제 의존성이 명확한 지 알 수 있습니까?

+1

일부 코드를 표시하십시오 (최소한 클래스의 모양을 요약하십시오). PersonList는 서비스가 아닌 DTO 나 Model처럼 들리므로 종속성이 없어야하는 것처럼 들리므로 (올바른 방향을 의미 함). 그러나 우리가 다루고있는 것을 실제로 알지 못하는 경우에는 "리팩터링하는 법"을 말하는 사람은 거의 없을 것입니다. – NightOwl888

+0

@ NightOwl888 나는 문제의 본질에 도달하기 위해 문제를 단순화 시켰지만, 나는 그것을 간소화했을 수있다. 제 실제의 경우이 클래스는 MVVM 응용 프로그램의보기 모델입니다. 'PersonListViewModel'은 새로운'PersonViewModel'을 생성하고 추가하는 메소드에 중계되는'AddCommand'를 가지고 있습니다. – redcurry

답변

1

"이것은 PersonList가 해당 생성자에 전달 된 매개 변수 을 필요로한다는 것을 의미합니다 (또는 어떻게 든 사용할 수 있음)."

왜 그럴까요? PersonListPerson 개체의 팩토리 일 필요는 없으므로 대신 PersonAddNewPerson에 전달할 수 있습니다.

예. 둘 다 Person 인스턴스를 생성에서 동시에 클라이언트 코드를 해소하고자하는 경우

public void AddNewPerson(Person person); 

그러나, 당신은 것 당신이 PersonFactory을 소개 할 수 Person의 작성에 필요한 무슨에 의존 PersonList을하지 않으려 생성 로직과 필요한 의존성을 캡슐화합니다. 이 경우

클라이언트는 Person의를 작성하고 목록에 추가 PersonFactory를 사용할 수 있습니다 또는 PersonListPersonFactory에 따라 달라질 수 있습니다.

+0

내 응용 프로그램의 아키텍처 때문에'AddNewPerson' 메서드는 매개 변수를 가질 수 없으므로 factory 클래스는 실행 가능한 옵션입니다. – redcurry

+0

@redcurry 그런 경우 목록에서 팩토리를 사용하는 것이 좋은 생각 일 수 있습니다. 또는'PersonList'에서 직접 적중 된 의존성을 가져갈 수도 있습니다 ... – plalx