Когда понятия ортогональны (независимы), их можно просто смоделировать как независимые значения, например,
class Person
{
Location location; // bus stop, home etc...
Motion motion; // sitting, walking, running
Topic thinkingAbout;
boolean sniffing;
boolean blinking;
boolean breakingWind;
}
Разумно, что человек может сделать все это одновременно, поэтому нет никаких ограничений. То есть они могут сидеть / ходить / бегать в определенном месте (автобусная остановка, дом, работа), они могут одновременно думать о какой-то теме, а также могут нюхать, мигать и делать другие вещи одновременно время.
Каждая подсистема сама по себе исключительна - человек может находиться только в одном месте, иметь один вид движения, думая об одном.
При наличии ограничений можно использовать одну и ту же модель, но в сочетании со структурой проверки, чтобы убедиться, что состояние действительно.
Например, если мы добавили «логическое чихание». Когда чихание - это правда, то мигание также должно быть правдой, поскольку при чихании невозможно держать глаза открытыми. Модель проверки закодировала бы это ограничение.
С точки зрения состояний, независимые значения можно смоделировать коллективно как единое состояние, взяв декартово произведение каждого подсостояния.