몇몇 메소드의 결과와 협력하는 콜렉션을 어떻게 리턴할것인가?(?)
ComposedMethod의 단점중 하나는, 작은 메소드들 사이의 연관때문이다. 큰 메소드 하나에서 공유되었던 임시 변수들이, 이제는 작은 메소드들 사이에 공유된다. 가장 해결하기 쉬운 방법은
ComposedMethod를 없애고 다시 하나의 큰 메소드에 다 때려넣는 것이지만, 안좋다. 또 다른 해결책으로는 이 작은 메소드들 사이에서 공유되는 임시 변수를 멤버변수에 넣는 것이다. 이것은 객체의 생명기간 동안 유효한게 아니라, 저 메소드들이 실행될때에만 유효하다. 역시 안좋다.
우리의 해결책은, 메소드들마다 필요한 파라메터들을 넘겨주는 것이다. 이것도 좀 망설여지는 방법이긴 하나, 다른 것들보단 낫다.
어떤 콜렉션의 기혼남과 미혼녀를 추출해내는 코드를 보자.
~cpp
vector<People> marriedMenAndUnmarriedWomen()
{
vector<People> result;
for(vector<People>::iterator it = result.begin() ; it != result.end() ; ++it)
{
if(it->isMarried() and it->isMan())
result.add(*it);
}
for(vector<People>::iterator it = result.begin() ; it != result.end() ; ++it)
{
if(it->isUnmarried() and it->isWoman())
result.add(*it);
}
return result;
}
ComposedMethod를 적용해보자.
~cpp
vector<People> marriedMen()
{
vector<People> result;
for(vector<People>::iterator it = result.begin() ; it != result.end() ; ++it)
{
if(it->isMarried() and it->isMan())
result.add(*it);
}
return result;
}
vector<People> unmarriedMen()
{
vector<People> result;
for(vector<People>::iterator it = result.begin() ; it != result.end() ; ++it)
{
if(it->isUnmarried() and it->isWoman())
result.add(*it);
}
return result;
}
vector<People> marriedMenAndUnmarriedWomen()
{
return marriedMen() + unmarriedMen(); // 될지 안될지는 모르겠지만 된다고 가정하자.
}
콜렉션을 리턴하지 말고 각각을 콜렉션에 더하자.
~cpp
vector<People> marriedMenAndUnmarriedWomen()
{
vector<People> result;
addMarriedMenTo(result);
addUnmarriedWomenTo(result);
return result;
}
void addMarriedMen(vector<People>& aCollection)
{
for(vector<People>::iterator it = result.begin() ; it != result.end() ; ++it)
{
if(it->isMarried() and it->isMan())
aCollection.add(*it);
}
}
void addUnmarriedMen(vector<People>& aCollection)
{
for(vector<People>::iterator it = result.begin() ; it != result.end() ; ++it)
{
if(it->isUnmarried() and it->isWoman())
aCollection.add(*it);
}
}
즉, 두 메소드의 결과를 모으는 경우인데, 그리 흔한 경우는 아니였던걸로 기억. 약간은 다르긴 하지만 나의 경우
CollectionParameter 의 성격으로 필요한 경우가 read/write 등 I/O 가 내부적으로 필요할때 또는 Serialization 등의 일이 필요할때. 그 경우 I/O 부분은 Stream 클래스로 만들고(C++ 의 Stream 을 쓰던지 또는 직접 Stream 클래스 만들어 쓰던지) parameter 로 넘겨주고 그 파라메터의 메소드를 사용하는 형태였음. --
1002