Yazılım mühendisliği dersimdeki bir görev, belirli bir oyunun farklı formlarını oynayabilen bir uygulama tasarlamaktır. Söz konusu oyun Mancala, bu oyunlardan bazılarına Wari veya Kalah deniyor. Bu oyunlar bazı yönlerden farklıdır, ancak sorum için oyunların aşağıdakilerde farklı olabileceğini bilmek önemlidir:
- Bir hareketin sonucunun ele alınış şekli
- Oyunun sonunun belirlenme şekli
- Kazananın tespit edilme şekli
Bunu tasarlamak için aklıma gelen ilk şey strateji modelini kullanmaktı, algoritmalarda (oyunun gerçek kuralları) bir varyasyonum var. Tasarım şöyle görünebilir:
Daha sonra kendi kendime Mancala ve Wari oyununda kazananın belirlenme şeklinin tamamen aynı olduğunu ve kodun çoğaltılacağını düşündüm. Bunun tanımı gereği, Mancala için kurallarda değişiklik olarak görülen 'bir kural, bir yer' veya KURU ilkesinin ihlali olduğunu düşünmüyorum, kuralın Wari'de de otomatik olarak değiştirilmesi gerektiği anlamına gelmez. Yine de profesörümden aldığım geri bildirimlerden farklı bir tasarım bulma izlenimi edindim.
Sonra bununla geldim:
Her oyun (Mancala, Wari, Kalah, ...) sadece her kuralın arayüzünün türüne sahip olacaktı, yani WinnerDeterminer
Mancala 1.0 ile aynı olan bir Mancala 2.0 sürümü varsa, kazananın nasıl belirleneceği dışında Mancala versiyonlarını kullanır.
Bu kuralların bir strateji modeli olarak uygulanmasının kesinlikle geçerli olduğunu düşünüyorum. Ama asıl sorun, onu daha fazla tasarlamak istediğimde ortaya çıkıyor.
Şablon yöntem kalıbı hakkında okurken hemen bu soruna uygulanabileceğini düşündüm. Kullanıcı bir hamle yaptığında yapılan işlemler her zaman aynıdır ve aynı sıradadır:
- deliklere taş yatırın (bu tüm oyunlar için aynıdır, bu yüzden şablon yönteminin kendisinde uygulanır)
- hareketin sonucunu belirle
- oyunun bir önceki hamle yüzünden bitip bitmediğini belirle
- oyun bitmişse, kimin kazandığını belirleyin
Bu son üç adım yukarıda açıklanan strateji modelimde. Bu ikisini birleştirirken çok sorun yaşıyorum. Bulduğum olası bir çözüm, strateji modelini terk etmek ve aşağıdakileri yapmak olacaktır:
Strateji örüntüsü ile bu tasarım arasındaki tasarım farkını gerçekten görmüyorum? Ama bir şablon yöntemi kullanmam gerektiğinden eminim (bir strateji kalıbı kullanmak zorunda olduğumdan emin olmama rağmen).
TurnTemplate
Nesneyi oluşturmaktan kimin sorumlu olacağını da belirleyemem , oysa strateji modeli ile soyut bir fabrika modeli kullanarak kolayca oluşturabileceğim nesne ailelerine (üç kural) sahip olduğumu hissediyorum. Daha sonra bir MancalaRuleFactory
, WariRuleFactory
vb. Olurdu ve kuralların doğru örneklerini oluşturacaklar ve bana bir RuleSet
nesneyi geri vereceklerdi .
Strateji + soyut fabrika modelini kullandığımı ve RuleSet
içindeki üç kural için algoritmalara sahip bir nesnem olduğunu varsayalım . Şablon yöntem desenini hala bununla kullanabileceğimi hissetmenin tek yolu bu RuleSet
nesneyi benim iletmektir TurnTemplate
. O zaman yüzeye çıkan 'sorun', somut uygulamalara asla ihtiyacım olmayacak TurnTemplate
, bu sınıfların modası geçecek. Korunan yöntemlerde TurnTemplate
sadece arayabiliyordum ruleSet.determineWinner()
. Sonuç olarak, TurnTemplate
sınıf artık soyut olmayacak, ancak somut hale gelmek zorunda kalacaktı, o zaman hala bir şablon yöntemi kalıbı mı?
Özetlemek gerekirse doğru şekilde mi düşünüyorum yoksa kolay bir şey mi kaçırıyorum? Doğru yoldaysanız, bir strateji kalıbını ve bir şablon yöntemi kalıbını nasıl birleştirebilirim?