다형성은 커플 링이 증가 할 가치가 있습니까?
-
06-07-2019 - |
문제
나는 더 많은 C ++ 경험을 얻는 것을 배우기 위해 단순한 게임을 쓰고 있으며, 나는 다형성을 느끼는 곳이 있습니다. 거의 작동하지만 그렇지 않습니다. 이 게임에서 Party
a Map
, 그러나 때때로 a Fork
길에서. 포크는 (기본적으로) an입니다 std::vector<location*>
. 원인으로 나는 다음과 같은 것을 Party
회원 기능 :
if(!CurrLocation->fork_.empty())
// Loop through forks and show options to the player, go where s/he wants
else
(CurrLocation++)
그러나 다음의 일부 변형이 더 나을 수 있는지 궁금합니다.
CurrLocation = CurrLocation->getNext();
포크가 실제로 위치에서 파생되고 새로운 기능을 과부하로 getNext()
. 그러나 후자의 경우 location
(낮은 레벨 구조)는 "이것을 백업하는 것"대신 사용자에게 메시지를 제시하기위한 사람이어야합니다. location
에게 UserInterface::*
.
당신의 의견?
해결책
모든 문제는 간접 수준을 추가하여 해결할 수 있습니다. 나는 당신의 제안 된 변형을 사용하고, getnext가 방향 선택을 해결하는 객체를 받아 들일 수 있도록함으로써 파티에서 위치를 분리 할 것입니다. 다음은 예입니다 (비정상적인) :
class Location;
class IDirectionChooser
{
public:
virtual bool ShouldIGoThisWay(Location & way) = 0;
};
class Location
{
public:
virtual Location * GetNext(IDirectionChooser & chooser)
{
return nextLocation;
}
virtual Describe();
private:
Location * nextLocation;
};
class Fork : public Location
{
public:
virtual Location * GetNext(IDirectionChooser & chooser)
{
for (int i = 0; i < locations.size(); i++)
if (chooser.ShouldIGoThisWay(*locations[i]))
return locations[i];
}
virtual Describe();
private:
vector<Location *> locations;
};
class Party : public IDirectionChooser
{
public:
void Move()
{
currentLocation = currentLocation->GetNext(GetDirectionChooser());
}
virtual IDirectionChooser & GetDirectionChooser() { return *this; }
virtual bool ShouldIGoThisWay(Location & way)
{
way.Describe();
cout << "Do you want to go that way? y/n" << endl;
char ans;
cin >> ans;
return ans == 'y';
}
};
다른 팁
다형성을 사용해야하는 한 다형성을 사용하고 디자인을 단순화해야합니다. 당신은 그것이 존재하고 멋진 이름을 가지고 있기 때문에 그것을 사용해서는 안됩니다. 디자인을 더 간단하게 만들면 커플 링의 가치가 있습니다.
정확성과 단순성은 모든 설계 결정의 궁극적 인 목표 여야합니다.
나는 당신이 문제를 직접 발견했으며 아마도 시스템의 나머지 부분에 대한 당신의 지식이나 우리가 볼 수있는 몇 가지 자세한 내용으로 그것을 해결할 수 있다고 생각합니다.
언급 된 바와 같이 :
- 다형성은 디자인을 단순화하는 데 사용되어야합니다.이 경우에는 잘 발견됩니다.
- 커플 링에 문제가 있습니다. 다시 잘 발견되면 커플 링은 나중에 문제를 일으킬 수 있습니다. 그러나 이것이 나에게 말하는 것은 당신이 다형성을 적용하는 방법이 가장 좋은 방법이 아닐 수도 있다는 것입니다.
- 인터페이스로의 프로그래밍을 사용하면 시스템을 구성하는 방식의 내부 세부 사항을 숨기고 커플 링을 줄일 수 있습니다.
다형성은 더 큰 커플 링에 적합하지 않으며, 그것들은 별도의 문제라고 생각합니다.
실제로 인터페이스로 프로그래밍하고 제어 패턴의 일반적인 역전을 따라 가면 커플 링 또는 제로가 줄어 듭니다.
예를 들어, 위치가 사용자 이내에 어떻게 결합되는지 알 수 없습니까?
이 경우 userinterface와 위치 사이에서 LocationViewAdapter와 같은 위치 사이의 다른 수준의 추상화를 통해 커플 링을 제거 할 수 있습니까?