문제

나는 더 많은 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';
  }
};

다른 팁

다형성을 사용해야하는 한 다형성을 사용하고 디자인을 단순화해야합니다. 당신은 그것이 존재하고 멋진 이름을 가지고 있기 때문에 그것을 사용해서는 안됩니다. 디자인을 더 간단하게 만들면 커플 링의 가치가 있습니다.

정확성과 단순성은 모든 설계 결정의 궁극적 인 목표 여야합니다.

나는 당신이 문제를 직접 발견했으며 아마도 시스템의 나머지 부분에 대한 당신의 지식이나 우리가 볼 수있는 몇 가지 자세한 내용으로 그것을 해결할 수 있다고 생각합니다.

언급 된 바와 같이 :

  1. 다형성은 디자인을 단순화하는 데 사용되어야합니다.이 경우에는 잘 발견됩니다.
  2. 커플 링에 문제가 있습니다. 다시 잘 발견되면 커플 링은 나중에 문제를 일으킬 수 있습니다. 그러나 이것이 나에게 말하는 것은 당신이 다형성을 적용하는 방법이 가장 좋은 방법이 아닐 수도 있다는 것입니다.
  3. 인터페이스로의 프로그래밍을 사용하면 시스템을 구성하는 방식의 내부 세부 사항을 숨기고 커플 링을 줄일 수 있습니다.

다형성은 더 큰 커플 링에 적합하지 않으며, 그것들은 별도의 문제라고 생각합니다.

실제로 인터페이스로 프로그래밍하고 제어 패턴의 일반적인 역전을 따라 가면 커플 링 또는 제로가 줄어 듭니다.

예를 들어, 위치가 사용자 이내에 어떻게 결합되는지 알 수 없습니까?

이 경우 userinterface와 위치 사이에서 LocationViewAdapter와 같은 위치 사이의 다른 수준의 추상화를 통해 커플 링을 제거 할 수 있습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top