Toggle menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

CollectionParameter

From ZeroWiki

Collecting Parameter

몇몇 메소드의 결과와 협력하는 콜렉션을 어떻게 리턴할것인가?(?)


ComposedMethod의 단점중 하나는, 작은 메소드들 사이의 연관때문이다. 큰 메소드 하나에서 공유되었던 임시 변수들이, 이제는 작은 메소드들 사이에 공유된다. 가장 해결하기 쉬운 방법은 ComposedMethod를 없애고 다시 하나의 큰 메소드에 다 때려넣는 것이지만, 안좋다. 또 다른 해결책으로는 이 작은 메소드들 사이에서 공유되는 임시 변수를 멤버변수에 넣는 것이다. 이것은 객체의 생명기간 동안 유효한게 아니라, 저 메소드들이 실행될때에만 유효하다. 역시 안좋다.


우리의 해결책은, 메소드들마다 필요한 파라메터들을 넘겨주는 것이다. 이것도 좀 망설여지는 방법이긴 하나, 다른 것들보단 낫다.


어떤 콜렉션의 기혼남과 미혼녀를 추출해내는 코드를 보자.

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를 적용해보자.

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();	// 될지 안될지는 모르겠지만 된다고 가정하자.
}

콜렉션을 리턴하지 말고 각각을 콜렉션에 더하자.

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]


SBPPSummary