Моделирование нескольких одновременных состояний - PullRequest
2 голосов
/ 13 июня 2010

Как вы можете моделировать объект, который может иметь несколько одновременных состояний?

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

Ответы [ 3 ]

2 голосов
/ 13 июня 2010

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

В вашем случае у вас будет несколько одновременных процессов, поэтому ваш класс Person будет иметь экземпляр DailyCommuteProcess, BodyClockProcess и т. Д., Каждый из которых будет заботиться о соответствующих функциях.

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

1 голос
/ 13 июня 2010

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

MrBean.states = {
    "WaitingForBus",
    "ReadingNewspaper",
    "Sniffling",
    "ThinkingAboutPaintings"
};

Способ моделирования состояний полностью зависит от вас.Выше приведен простой пример, в котором состояния моделируются строками и содержат ноль дополнительной информации.

1 голос
/ 13 июня 2010

Когда понятия ортогональны (независимы), их можно просто смоделировать как независимые значения, например,

class Person
{
   Location location; // bus stop, home etc...
   Motion motion; // sitting, walking, running
   Topic thinkingAbout;
   boolean sniffing;
   boolean blinking;
   boolean breakingWind;
}

Разумно, что человек может сделать все это одновременно, поэтому нет никаких ограничений. То есть они могут сидеть / ходить / бегать в определенном месте (автобусная остановка, дом, работа), они могут одновременно думать о какой-то теме, а также могут нюхать, мигать и делать другие вещи одновременно время.

Каждая подсистема сама по себе исключительна - человек может находиться только в одном месте, иметь один вид движения, думая об одном.

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

Например, если мы добавили «логическое чихание». Когда чихание - это правда, то мигание также должно быть правдой, поскольку при чихании невозможно держать глаза открытыми. Модель проверки закодировала бы это ограничение.

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

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