Как решить проблему с выключателем света дяди Боба? - PullRequest
0 голосов
/ 23 сентября 2019

Я смотрел Роберта Мартина, программирующего 101 видео .Я объясню, о чем он говорит, в видео для тех из вас, кто его не смотрел.

Роберт Мартин находится в своем доме и показывает выключатель света.Если этот переключатель повышается, свет горит.Если выключатель выключен, свет выключен.Он написал код, чтобы справиться с этим.Это просто, но ситуация усложняется, когда он показывает второй, третий и четвертый выключатель света.Все они меняют состояние одного и того же света.Каждый из них зависит от других.Он также показывает, как обрабатывать его в коде.

Роберт Мартин объясняет, что этот код не является лучшим решением, потому что может быть ситуация, когда два человека приходят в одну комнату и хотят включить свет,Он продемонстрировал, что написанный им код не работает должным образом, потому что свет не меняет своего состояния.Это происходит потому, что компьютер не видит одновременных событий.Один из них встречается первым.Это происходит, когда два человека хотят включить свет.Это происходит одновременно только с человеческой точки зрения.Для компьютера один человек сначала меняет состояние источника света, поэтому фактически состояние источника света меняется дважды.К счастью, дядя Боб показывает, как решить эту проблему.Он измеряет время, прошедшее с момента последнего изменения состояния света.Если следующее изменение происходит через 500 мс, он отклоняет его.Теперь, когда два человека хотят включить свет, он фактически включен.

К сожалению, реализация вышеупомянутого решения нарушает случай, когда один человек быстро включается и выключает свет.Поскольку второе изменение происходит через 500 мс, оно отклоняется.Поэтому невозможно быстро включить и выключить свет.Дядя Боб не показал, как решить эту проблему.Он оставил это как домашнее задание.

Мне потребовалось много времени, чтобы понять, как я могу решить эту проблему, но, наконец, я нашел рабочее решение.Я не уверен, что если мое решение хорошо, или, может быть, я только думаю, что это хорошо.Можете ли вы сказать мне, если я правильно решил проблему или есть лучшее решение?

Код дяди Боба выглядит следующим образом:

void lightLogic() {
    boolean a = switchA.isUp();
    boolean b = switchB.isUp();
    boolean c = switchC.isUp();
    boolean d = switchD.isUp();
    int currentSwitchState = 0;

    int base=10;
    if (a) currentSwitchState += base*base*base;
    if (b) currentSwitchState += base*base;
    if (c) currentSwitchState += base;
    if (d) currentSwitchState += 1;

    int currentTime = millis();
    if (currentSwitchState != lastSwitchState) {
        if (currentTime - lastChangeTime > 500) {
            light.state = !light.state;
            lastChangeTime = currentTime;
        }
    }

    lastSwitchState = currentSwitchState;

}

Я ввел новыйпеременная с именем penultimateSwitchState и я проверяю, равно ли текущее состояние источника света предпоследнему состоянию.Если да, я знаю, что этот же переключатель использовался для изменения состояния освещения, поэтому я принимаю это изменение:

void lightLogic() {
    boolean a = switchA.isUp();
    boolean b = switchB.isUp();
    boolean c = switchC.isUp();
    boolean d = switchD.isUp();
    int currentSwitchState = 0;

    int base=10;
    if (a) currentSwitchState += base*base*base;
    if (b) currentSwitchState += base*base;
    if (c) currentSwitchState += base;
    if (d) currentSwitchState += 1;

    int currentTime = millis();
    if (currentSwitchState != lastSwitchState) {
      if ((currentTime - lastChangeTime > 500) || (penultimateSwitchState == currentSwitchState)) {
        light.state = !light.state;
        lastChangeTime = currentTime;
      }
      penultimateSwitchState = lastSwitchState;
    }

    lastSwitchState = currentSwitchState;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...