Đại diện cho trạng thái của bạn dưới dạng bitmask như bạn viết, bạn chỉ có thể dịch các mô tả của bạn về các ràng buộc thành mã:
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...
Bạn có thể gói nó thành một makeStateConsistent()
cái mà bạn có thể gọi trước khi kiểm tra các bit trạng thái để đảm bảo rằng trạng thái có ý nghĩa.
Tuy nhiên, một hạn chế của phương pháp này là nó không thể giải thích được thứ tự thay đổi trạng thái. Ví dụ: nếu bạn muốn có một kết quả khác đối với các mặt hàng nóng bị ướt hơn so với các mặt hàng ướt trở nên nóng, bạn không thể làm như thế này: tất cả các makeStateConsistent()
phương pháp nhìn thấy là một vật nóng và ướt, không có thông tin về cách nó phải là như vậy
Thay vào đó, những gì bạn có thể làm là làm cho tình trạng mục tin (ít nhất là theo lý thuyết) và vận dụng nó thông qua một tập hợp các phương pháp như coolItem()
, heatItem()
, wetItem()
, dryItem()
và vân vân. Bằng cách đó, bản thân các phương pháp thay đổi trạng thái có thể xử lý bất kỳ thay đổi bổ sung nào. Ví dụ, heatItem()
phương thức có thể trông giống như thế này:
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
}
Tất nhiên, bạn vẫn có thể muốn có một makeStateConsistent()
phương thức như một bản sao lưu, chỉ trong trường hợp bạn có một lỗi trong các phương thức thay đổi trạng thái của bạn.
Ngoài ra, trong một số trường hợp, bạn có thể đơn giản hóa mã của mình bằng cách loại bỏ các trạng thái không cần thiết. Ví dụ, bạn có thực sự cần một FROZEN
trạng thái riêng biệt , hoặc nó sẽ đủ để chỉ coi bất kỳ vật phẩm lạnh và ướt nào là đông lạnh?