Indem Sie Ihre Zustände als Bitmaske darstellen, wie Sie sie schreiben, können Sie einfach Ihre Beschreibungen der Einschränkungen in Code übersetzen:
if ( (state & HOT) && (state & COLD) ) {
state &= ~HOT;
state &= ~COLD; // reset both HOT and COLD flags if both are set
}
if ( (state & COLD) && (state & WET) ) {
state &= ~WET; // cold items can't be wet
state |= FROZEN; // instead, they're frozen
}
if ( (state & HOT) && (state & WET) ) {
state &= ~WET; // hot and wet items dry up...
state &= ~HOT; // ...and cool down
}
// add other constraints here...
Sie könnten das in eine einwickeln makeStateConsistent()
das Sie aufrufen können, bevor Sie die Statusbits testen, um sicherzustellen, dass der Status sinnvoll ist.
Eine Einschränkung dieses Ansatzes besteht jedoch darin, dass die Reihenfolge der Statusänderungen nicht berücksichtigt werden kann. Wenn Sie beispielsweise für heiße Gegenstände, die nass werden, ein anderes Ergebnis erzielen möchten als für nasse Gegenstände, die heiß werden, können Sie dies nicht so tun: Die makeStateConsistent()
Methode sieht nur ein heißes und nasses Objekt ohne Informationen darüber, wie es muss so sein.
Statt dessen, was Sie tun können , ist das Einzelteil Zustand privaten (zumindest vom Konzept her ) und manipulieren , um sie durch eine Reihe von Methoden wie coolItem()
, heatItem()
, wetItem()
, dryItem()
und so weiter. Auf diese Weise können die Zustandsänderungsmethoden selbst zusätzliche Änderungen vornehmen. Die heatItem()
Methode könnte beispielsweise folgendermaßen aussehen:
if ( state & COLD ) {
state &= ~COLD; // cold items become normal temp when heated
if ( state & FROZEN ) {
state &= ~FROZEN; // ...and melt if they were frozen
state |= WET;
}
} else if ( state & WET ) {
state &= ~WET; // wet items dry up when heated, stay normal temp
} else {
state |= HOT; // dry normal temp items become hot
}
Natürlich möchten Sie vielleicht auch noch eine haben makeStateConsistent()
Methode als Backup haben, falls Sie einen Fehler in Ihren Statusänderungsmethoden haben.
In einigen Fällen können Sie Ihren Code möglicherweise auch vereinfachen, indem Sie unnötige Zustände beseitigen. Benötigen Sie zum Beispiel wirklich einen separaten FROZEN
Zustand, oder würde es ausreichen, nur kalte und nasse Gegenstände als gefroren zu behandeln?