Простой сценарий, как соединиться, говорит, не спрашивают?

Я оставлю это здесь для всех остальных, по-видимому, это проблема браузера и графической карты.

mrdoob: графическая карта - только одна из причин, по которой контекст не может быть создан [112 ] blockquote>

https://github.com/mrdoob/three.js/issues/4927

Похоже, почему, если у кого-то еще нет других идей. .. Проблема продолжается и не устранена, было бы интересно узнать, почему это происходит и почему открытие инструментов разработчика и обновление решают проблему для меня.

5
задан snazzer 25 December 2008 в 09:20
поделиться

4 ответа

Представьте 3-ю модель... Сиденья, который имеет ссылку и на место и на человека. Затем можно создать экземпляр той модели каждый раз, когда кто-то садится, добавьте некоторые проверки для предотвращения двух человек, сидящих на том же месте, и возможно даже добавьте некоторые тайм-ауты (нахождение на месте слишком долго, при потере его).

4
ответ дан 14 December 2019 в 09:03
поделиться

Проблемой является Ваша модель, определяется с круговой зависимостью. Существует два способа избежать этого.

Первый точно не следует, "Говорят, не Спрашивайте" явно, но это становится ближе к точке. Мы пытаемся узнать, можем ли мы сесть, затем сказать стулу, что мы сидим в нем.

void Person.SitDown(Seat seat) {
    if (seat.AcceptsPlayer(this)) {
        seat.SeatPerson(this);
        this.Status = Status.Sitting;
    }
}

void Seat.SeatPerson(Person person) {
    this.Seated = person;
}

Лучший способ сделать это (который следует, "Говорят, не Спрашивайте" более явно), могло бы быть следующим. Мы пытаемся председательствовать. Если стул отклоняет нас, мы знаем.

void Person.SitDown(Seat seat) {
    if (seat.SeatPerson(this)) {
        this.Status = Status.Sitting;
    }
    else
    {
        //Couldn't sit down!
    }
}

bool Seat.SeatPerson(Person person) {
    if (this.IsAccepted(person) && this.Seated == null) {
        this.Seated = person;
        return true;
    }
    else
    {
        return false;
    }
}
1
ответ дан 14 December 2019 в 09:03
поделиться

Используйте обратный вызов так, чтобы каждый класс мог поддержать состояние, за которое это ответственно.

public class Seat
{
  public void SeatPerson(Person person, Action successAction)
  {
    if (IsAccepted(person))
    {
      this.Seated = person;
      successAction();
    }
  }
}


public class Person
{
  public void Sit(Seat seat)
  {
    seat.SeatPerson(this, this.SitComplete);
  }

  public void SitComplete()
  {
    this.Status = Sitting;
  }
}

Здесь существует все еще циклическая зависимость.

Место несет ответственность проверить, что человек, пытающийся находиться, допустим, чтобы сделать так. Место несет ссылку на человека, после того как они находились. Человек только знает, что метод пытается сидеть на месте.

Условно, за successAction нельзя держаться дольше, чем вызов SeatPerson. Это гарантирует, что Место не может поставить под угрозу состояние Человека.

1
ответ дан 14 December 2019 в 09:03
поделиться

позвольте человеку попытаться сесть на место и обновление, это - состояние в зависимости от успеха операции:

Просто назовите myPerson. TrySeat (targetseat), который возвращает true если процесс нахождения, за которым следуют.

//inside Person class
        public bool TrySeat(Seat seat)
        {
            if (seat.TrySeat(this))
            {
                Status = Sitting;
                return true;
            }
            else
            {
                return false;
            }
        }

//inside Seat class
        internal bool TrySeat(Person person)
        {
            if (CanSeat(person))
            {
                Seated = person;
                return true;
            }
            else
            {
                return false;
            }
        }
-1
ответ дан 14 December 2019 в 09:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: