Merepresentasikan status Anda sebagai bitmask seperti yang Anda tulis, Anda bisa menerjemahkan deskripsi kendala ke dalam kode:
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...
Anda bisa membungkusnya menjadi suatu makeStateConsistent()
yang dapat Anda panggil sebelum menguji bit negara untuk memastikan bahwa negara masuk akal.
Namun, satu batasan dari pendekatan ini adalah tidak dapat menjelaskan urutan perubahan negara. Misalnya, jika Anda ingin memiliki hasil berbeda untuk item panas yang menjadi basah daripada untuk item basah yang menjadi panas, Anda tidak bisa melakukannya seperti ini: semuamakeStateConsistent()
metode yang dilihat adalah objek panas dan basah, tanpa informasi tentang cara Pasti seperti itu.
Sebaliknya, apa yang bisa Anda lakukan yaitu membuat negara item yang swasta (setidaknya konseptual) dan memanipulasinya melalui serangkaian metode seperti coolItem()
, heatItem()
, wetItem()
, dryItem()
dan sebagainya. Dengan begitu, metode perubahan negara sendiri dapat menangani setiap perubahan tambahan. Misalnya, heatItem()
metode ini mungkin terlihat seperti ini:
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
}
Tentu saja, Anda mungkin masih ingin memiliki makeStateConsistent()
metode sebagai cadangan, kalau-kalau Anda memiliki bug dalam metode perubahan negara Anda.
Juga, dalam beberapa kasus Anda mungkin dapat menyederhanakan kode Anda dengan menghilangkan status yang tidak perlu. Sebagai contoh, apakah Anda benar-benar memerlukan FROZEN
keadaan terpisah , atau apakah itu cukup untuk hanya memperlakukan barang-barang dingin dan basah sebagai beku?