Bir avuç öneri sunacağım. Bazıları birbiriyle çelişiyor. Ama belki bazıları faydalıdır.
Listeleri bayraklara karşı düşünün
Bayrak şeyi yapıp yapmayacağınıza karar vermek için dünyayı tekrarlayabilir ve her öğenin bir bayrağını kontrol edebilirsiniz. Ya da yalnızca bayrak işini yapması gereken öğelerin bir listesini tutabilirsiniz.
Listeleri ve sıralamaları göz önünde bulundurun
Öğe sınıfınıza, isAThis ve isAThat'a boole alanları eklemeye devam edebilirsiniz. Veya {"isAThis", "isAThat"} veya {IS_A_THIS, IS_A_THAT} gibi dizelerin veya numaralandırma öğelerinin bir listesine sahip olabilirsiniz. Bu şekilde numaralandırmada (veya dize sabitlerinde) alan eklemeden yenilerini ekleyebilirsiniz. Alan eklemeyle ilgili gerçekten yanlış bir şey olmadığı için değil ...
İşlev işaretlerini düşünün
Bayrak veya numaralandırma listesi yerine, bu öğe için farklı bağlamlarda yürütülecek eylemlerin bir listesi olabilir. (Varlık-imsi ...)
Nesneleri düşünün
Bazı insanlar veri odaklı veya komut dosyası içeren veya bileşen varlık yaklaşımlarını tercih eder. Ancak eski moda nesneler hiyerarşileri de dikkate değer. Temel sınıf, “bu kartı B-dönüşü için oynat” veya başka bir şey gibi eylemleri kabul etmelidir. Daha sonra her tür kart uygun şekilde geçersiz kılabilir ve yanıt verebilir. Muhtemelen bir oyuncu nesnesi ve oyun nesnesi de vardır, bu nedenle oyun, (player-> isAllowedToPlay ()) {oyunu oyna…} gibi şeyler yapabilir.
Hata ayıklama yeteneğini düşünün
Bir kez bayrak alanıyla ilgili güzel bir şey, her öğenin durumunu aynı şekilde inceleyip yazdırabilmenizdir. Durum farklı türler veya bileşen torbaları veya işlev işaretçileriyle temsil ediliyorsa veya farklı listelerde bulunuyorsa, yalnızca öğenin alanlarına bakmak yeterli olmayabilir. Hepsi ödünç verilir.
Sonunda, yeniden düzenleme: Birim testlerini düşünün
Mimarinizi ne kadar genelleştirdiğiniz önemli değil, kapsamadığı şeyleri hayal edebileceksiniz. Sonra yeniden gözden geçirmeniz gerekecek. Belki biraz, belki çok.
Bunu daha güvenli hale getirmenin bir yolu, bir birim testler yapmaktır. Bu şekilde, altındaki işlevleri (belki de çok fazla!) Yeniden düzenlemenize rağmen mevcut işlevselliğin hala çalıştığından emin olabilirsiniz. Her birim testi genellikle şöyle görünür:
void test1()
{
Game game;
game.addThis();
game.setupThat(); // use primary or backdoor API to get game to known state
game.playCard(something something).
int x = game.getSomeInternalState;
assertEquals(“did it do what we wanted?”, x, 23); // fail if x isn’t 23
}
Gördüğünüz gibi, oyundaki (veya oynatıcı, kart & c) üst düzey API çağrılarını sabit tutmak, birim test stratejisinin anahtarıdır.