Genel Strateji Örüntüsünde, her stratejiyi bir sınıf olarak yaparız. Bir işlevi yapamayız ve bir nesneyi başlattığımızda sadece referansı atayıp nesnenin bu işlevi çağırmasına izin veremez miyiz?Strateji Örüntüsünde, her stratejiyi bir işlev olarak değil, sınıf olarak yapamayız mı?
cevap
En basit durumlarda, Strateji şablonlarını bir işlev işaretçisi ile değiştirebilirsiniz. biz sadece basit bir fonksiyon işaretçisi verdiyse Ancak, bu durumda
class HourlyPayStrategy implements PayStrategy
{
public int calculate()
{
int x = doComplexOperation1();
int y = doComplexOperation2();
return x + y;
}
private int doComplexOperation1()
{
// ...
}
private int doComplexOperation2()
{
// ...
}
}
düşünün artık (en azından bir iyi kapsüllü bir şekilde, iyi) o şeyi planı ayrı çünkü şeyler gerçekten kıllı başlıyorsun.
Buna katılmıyorum. SaatlikPayStrategy veya HourlyPayStrategy.calculate referansı, refactoring veya encapsulation anlamında bir fark yaratmaz. –
@DavidArno, yazıcınız tarafından _eta genişlemesini gerçekleştiren iyi bir iş olan C# ile tanıştığınıza inanıyorum. Bu yazının pek çok dilde yapılması kolay değildir: JavaScript, Ruby, Python, Java, OCaml (birkaç yıllık bellekten) bile, C++ (sorular: C++ 11 bu günlerde nasıl oluyor?). – kizzx2
Birçok dilde _function_ parametresi bekleniyorsa, derleyicinin/çalışma zamanının ilişkili nesne ile birlikte hareket etmesi gereken bir _method_ beklemekten oldukça farklıdır. Öyleyse evet, C# için argümanınızın bacakları vardır. – kizzx2
Dile bağlıdır. C# 'da bir delege yapabilirsin. Java'da, anonim bir sınıf olur. C++ 'da, gerçekten bir fonksiyon gösterici yapabilirdiniz.
Elbette, nesneleri kullanarak, sadece işlevlerle yapamadığınız şekillerde mirastan faydalanabilirsiniz.
C# içinde strateji modelini kullanarak delegeleri kullanabilirsiniz. Örnek olarak bu blog post'a bir göz atın.
Çoğu C++ uygulamasında kapağın altında ne olduğu neredeyse önerdiğiniz şeydir. derleyici genellikle (sözde kod) böyle bir çağrı Strategy.virtualMethod() giderir: Seni ilgilendiren tek bir işaretçi (pVtable) gerçekten ilk profile gerektiğini bir daha dereferencing ise
(Strategy.pVtable[indexOfVirtualMethod])()
Yani bunu yapamıyorsanız daha ciddi sıcak noktaları tanımlayın.
Duygularım, bir strateji nesnesi yerine bir işlev işaretçisi kullandığınızda kodunuzun anlaşılması ve bakımı çok daha zor olacaktır.
- 1. Bir sınıf işlev olarak görülemiyor
- 2. Bir Sınıf Olarak İşlev İçinde DataBase Tablosu Oluşturma
- 3. şablonlu işlev geçici olarak
- 4. Bir işlev argümanı olarak dinamik
- 5. Boole her zaman doğru olarak mı dönüyor?
- 6. C++: Sınıf üyesi işlev geri aramaları olarak işlevler
- 7. this.setState, bir işlev değil
- 8. CheckedListBox'taki her <item> için. <item>, nesne olarak değil, Denetim olarak değil
- 9. Neden arkadaş üyesi işlevi otomatik olarak işlev şablonu olarak tanınmıyor?
- 10. Haddock'da ilk olarak işlev parametrelerini tanımlamanın bir yolu var mı?
- 11. Temel sınıf işlevini türetilmiş olarak çağırın
- 12. NSNotification gözlemcisi olarak sınıf?
- 13. Dizi değeri olarak işlev
- 14. React.js - Geçirilen işlev "bir işlev değil" Hata
- 15. Javascript işlev yükleme (referans olarak?)
- 16. Neden otomatik olarak bir işlev türünü döndüremiyorsunuz?
- 17. Clojure deftype parametreli bir işlev olarak kullanılıyor
- 18. Sınıf içinde otomatik olarak tanımlanan bir arkadaş fonksiyonu var mı?
- 19. .done bir işlev değil
- 20. Android Etiketleri dinamik olarak düzenle en iyi strateji
- 21. Lua'da bir işlev verilen bir işlev var mı, adını bir dize olarak döndürüyor mu?
- 22. readFileSync bir işlev değil
- 23. Strateji
- 24. Matlab: 3B metnin nasıl çizileceği (işlev metni olarak 2D değil)
- 25. GNU koşullu işlev yapmak kullanıcı tanımlı bir işlev içinde $ (if ...) her zaman true olarak değerlendirir
- 26. std :: özel bir akış denetleyicisi olarak işlev
- 27. Constexpr lambda varsayılan olarak mı?
- 28. db.createCollection bir işlev değil
- 29. addActor bir işlev değil
- 30. getResponseHeader bir işlev değil
Bu durumda Java ile eğlenin :) – Joey
neden? Java işlevi referansı destekleyemez mi? Tasarım Kalıpları hakkında eleştirel düşünmek için –
+1. Birçok tasarım deseninin, dilin yetersizliğinin kökünden kaynaklandığını söyleyebilirim. Pek çok durumda, tasarım desenleri biblo değildir :) – kizzx2