Kotlin’de Strateji Tasarım Modeli | tarafından Abhishek Saxena | Ağu, 2022

Kotlin'de Strateji Tasarım Modeli |  tarafından Abhishek Saxena |  Ağu, 2022
fotoğrafı çeken Kenny Eliason üzerinde Sıçramayı kaldır

Strateji Tasarım modelini anlamadan önce, tasarım modellerinin ne olduğunu ve neden onlara ihtiyaç duyduğumuzu anlamalıyız.

Tasarım kalıpları, yazılım tasarımındaki yaygın sorunların çözümleridir.

Ortak sorunlara çözüm oldukları için harika değiller mi? Bu onların gümüş kurşun oldukları ve doğrudan herhangi bir yerde olabilecekleri anlamına mı geliyor?

Cevap Numara, yapamazlar. Gerçek dünyada, probleminizi çözmek için bu çözümleri öğrenmeniz ve onlardan ilham almanız gerekecek, ancak çözümünüzü şekillendirmenize yardımcı oluyorlar.

Bir tasarım modelinin amacı ve yaklaşımı, çözüme ulaşmak için tasarım modelini değiştirmeniz gerekip gerekmeyebileceğinden eldeki sorunu çözmenize yardımcı olur.

Şimdi Strateji Tasarım Modeline geliyoruz, nedir ve neden buna ihtiyacımız var?

Strateji Tasarım Modeli, bir algoritma ailesini kapsüllediğimiz ve onları değiştirilebilir hale getirdiğimiz bir modeldir.

Strateji modeli, çok önemli bir tasarım ilkesine dayanmaktadır: Değişen yönleri tanımlayın ve bunları aynı kalanlardan ayırın.

Peki, bu ne anlama geliyor?

3 farklı problem cümlesini alıp strateji kalıbını kullanarak çözelim.

  • Sıralama Algoritması (Etki Alanı Katmanı)
  • Çoklu Veri Kaynağı (Veri Katmanı — Sahte/Yerel/Uzak)
  • OnClick Dinleyici Stratejisi (UI Katmanı — Tek/Çoklu)

Bu problem ifadesinde, iki veya daha fazla sıralama algoritmamız var ve hangisini kullanacağımıza kullanıcının girdisine göre karar verebiliriz.

Basitlik için, diyelim ki iki algoritmamız var, kabarcık sıralama ve birleştirme sıralama.

Yukarıdaki kod, kullanıcının girdisine göre farklı bir sıralama algoritmasını nasıl kullanabileceğimizin basit bir uygulamasıdır.

Dikkatli bir şekilde fark ederseniz, sıralama algoritmaları eklemek/kaldırmak istediğimizde, değişikliklere uyum sağlamak için else-if merdivenini güncellememiz gerekir.

Yani, else-if merdiven bloğunun değişen kod parçası olduğunu söyleyebilirim.

İlkeye göre, değişenleri kapsüllemeliyiz.

Şimdi herhangi bir algoritma eklemek/kaldırmak zorunda kaldığımızda, while bloğuna başka bir ifade ekleyeceğiz ve sıralama algoritmasını içeren yöntemi ekleyeceğiz.

Son yeniden düzenleme kodumuzun daha iyi görünmesini sağladı ancak ilk sorunu çözmedi, yine de güncellememiz gerekiyor. when Seçilen algoritmayı çalıştırmak için blok.

Algoritmaların yöntemlerini değerlendirdiğinizde, girdi olarak bir dizi sayı aldıkları, algoritmayı uygulayan bir gövdeye sahip oldukları ve geri dönüş türü olmadığı için hemen hemen aynı olduklarını fark ediyorsunuz.

Bu, yöntemleri bir arabirime çıkarabileceğimiz anlamına gelir, diyelim ki SortStrategyve arayüzün her uygulaması ilgili sıralama algoritmasına sahip olacaktır.

Bu arabirimi kullanabilir ve sürücüdeki sıralama yöntemine bir argüman olarak iletebiliriz.

Arabirimi kullanarak, sayıları sıralamak için kullanılacak sıralama algoritmasını seçmek için koşullu ifadeleri tamamen kaldırdık.

Diyelim ki bir sıralama algoritması eklemek/kaldırmak istediğimizi varsayalım. Ekleme Sıralamasıuygulayabiliriz SortStrategy arayüz Ekleme Sıralama algoritması ile sıralama yöntemine iletin.

Şimdi, sıralamak için sayılarla birlikte sıralama algoritmasını geçiyoruz.

Burada algoritmaları sıralayan algoritma ailesini kapsülledik ve onları değiştirilebilir hale getirdik.

Bonus🎉: Hepsini kullandık SOLID ilkeleri yukarıdaki örnekte.

Bu problem bildiriminde, kullanıcı verilerini kaydetmekten sorumlu bir havuzumuz var ve havuzu test etmek istiyoruz.

Basit UserRepositorysave yöntemi ile bu şekilde görünecektir.

Kullanıcıyı kurtarmak için yapılan API çağrısı, havuzun hemen içinde olduğundan, kodu, API çağrısının sahte veya sahte sonuçlarıyla tek başına test etmek zordur. Bu, test edemeyeceğimiz anlamına gelir. UserRepository düzgün bir şekilde.

Yukarıdaki örnekte, içindeki kod save()değişen şeydir, gerçek veriler için gerçek API çağrısı ve test için alaylı/sahte uygulama.

Bu, içindeki kodun save() yöntem, değişen şeydir.

Şimdi, değişen parçayı tanımladığımıza göre, onu kapsüllemeli ve değiştirilebilir hale getirmeliyiz.

Bir arayüz oluşturalım UserDataSourcedeğişken kod bloğunu içine alır.

Şimdi, bu veri kaynaklarını şu şekilde kullanabiliriz: UserRepositoryve veri kaynağının uygulanması davranışını tanımlayacaktır.

sürücü yöntemi olacaktır

Strateji modelini kullanarak, uzak ve sahte çeşitli veri kaynakları arasında kolayca geçiş yapabiliriz.

Bu yaklaşım, API’leriniz hazır olmadığında ancak yerel veri kaynaklarıyla çalışmak istediğinizde bile kullanılabilir. Yerel veya sabit kodlanmış verilerle bir uygulama oluşturun ve bunu şu şekilde adlandırın: LocalUserDataSourceve ona ilet UserRepositoryAPI’ler hazır olana kadar.

Bu sorun bildiriminde, kullanıcı arayüzünde bir düğmemiz var ve işlemi gerçekleştirmek için kullanıcının düğmeye kaç kez tıklaması gerektiğini dinamik olarak ayarlamak istiyoruz.

Olası tıklama sayısı

  • Yok (Düğme devre dışı)
  • Bekar
  • Birden çok kez (tıklama sayısı bir aralıkta sabit veya rastgele olabilir)

Bir düğmeyle alay edelim.

Butona tıklandığında yapmak istediğimiz işlem

Strateji Modeli olmadan tıklama işlemini ve kurulum düğmesini gösterecek sürücü

Gördüğünüz gibi tek bir tıklama ile buton oldukça basit ve istediğimiz kadarını kolayca oluşturabiliyoruz. Yine de, birden çok tıklama içeren düğmeleri oluşturmak o kadar kolay değil çünkü böyle bir düğme oluşturmak istediğimiz her seferde birden çok tıklama için mantığı çoğaltmamız gerekecek.

Ya birden fazla tıklama ile bir düğme oluşturmak istiyorsak, ancak tıklama sayısı bir dizi sayı içinde rastgele olmalıdır?

Bu, ilk etapta zaten zor olan bir düğme oluştururken daha fazla karmaşıklık katacaktır.

Dolayısıyla bu problem ifadesinde değişen kısmın işlemi gerçekleştirmek için gereken tıklama sayısı olduğunu söyleyebiliriz.

Bunu çözmek için oluşturacağız OnClickStrategy ve farklı sayıda tıklama için birden fazla uygulamaya sahip olun.

SingleOnClickStratejisi

ÇokluOnClickStratejisi

Ayrıca bir ihtiyacımız olacak ButtonItemdüğmenin stratejisini tutmak için

Bileşen tabanlı bir UI çerçevesi kullandığınızı varsayalım – Flutter, React veya Android’in Jetpack Compose.

Bu örnek için Android’in Jetpack Compose’unu kullanıyorum ancak aynısı diğer çerçevelerde de çoğaltılabilir.

UIButton birleştirilebilir

bu GörünümModeli ve Ekran birleştirilebilir

Not: kullanıcının tıklama davranışı ile alay edilir. also engellemek.

Kullanıcı arayüzündeki düğmeler için birden çok strateji kullandık ve bu stratejiler, onClick davranışı için kodu çoğaltmadan ekrandaki herhangi bir düğmeye eklenebilir.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.