W typowym schemacie strategii każdą strategię definiujemy jako klasę. Czy nie możemy uczynić go funkcją i po prostu przypiszmy odwołanie do funkcji, gdy tworzymy instancję i pozwalamy obiektowi wywoływać tę funkcję?W "Wzorze strategii" nie możemy zrobić każdej strategii jako funkcji, ale nie jako klasy?
Odpowiedz
W najprostszych przypadkach można zamienić wzorce strategii na wskaźnik funkcji. Uważa jednak, że ta sprawa
class HourlyPayStrategy implements PayStrategy
{
public int calculate()
{
int x = doComplexOperation1();
int y = doComplexOperation2();
return x + y;
}
private int doComplexOperation1()
{
// ...
}
private int doComplexOperation2()
{
// ...
}
}
Gdybyśmy po prostu dał prosty wskaźnik funkcji, rzeczy zaczną się naprawdę owłosione, bo nie można już byłaby to coś (no, przynajmniej nie w sposób dobrze kapsułkach).
Nie zgadzam się z tym. Niezależnie od tego, czy odwołasz się do HourlyPayStrategy, czy HourlyPayStrategy.calculate, nie ma znaczenia w kwestii refaktoryzacji lub enkapsulacji. –
@DavidArno według twojej notacji Wierzę, że znałeś C#, który wykonuje dobrą robotę wykonując _eta expansion_. Ta notacja wcale nie jest łatwa do osiągnięcia w wielu językach: JavaScript, Ruby, Python, Java, OCaml even (mówienie z pamięci kilkunastoletniej), C++ (pytania: jak C++ 11 się z tym dzisiaj przejmuje?). – kizzx2
W wielu językach, gdy oczekuje się parametru _function_ jako, różni się on od oczekiwania metody _method_, w której kompilator/środowisko wykonawcze musiałoby być przenoszone wraz z powiązanym obiektem. Więc tak, dla C# twoja argumentacja ma nogi. – kizzx2
W zależności od języka. W języku C# można uczynić go delegatem. W Javie będzie to raczej anonimowa klasa. W C++ można naprawdę uczynić z niego wskaźnik funkcji.
Oczywiście, chociaż przy użyciu obiektów można korzystać z dziedziczenia w sposób, w jaki nie można było korzystać z funkcji.
W języku C# można używać delegatów ze wzorem strategii. Spójrz na to blog post na przykład.
To, co dzieje się pod maską w większości implementacji C++, to prawie to, co sugerujesz. Kompilator zwykle rozwiązuje Strategy.virtualMethod call() tak (w pseudo kod):
(Strategy.pVtable[indexOfVirtualMethod])()
Więc jeśli jedynym zmartwieniem jest to jeden z bardziej dereferencji wskaźnika (pVtable) naprawdę powinieneś najpierw profil jeśli nie można zidentyfikować bardziej poważne hotspoty.
Mam wrażenie, że Twój kod będzie trudniejszy do zrozumienia i utrzymania, gdy użyjesz wskaźnika funkcji zamiast obiektu strategii.
- 1. Dlaczego wzorzec strategii jest nazywany wzorem strategii?
- 2. Parametryzowany wzór strategii
- 3. Nie można wywołać klasy jako funkcji
- 4. Zalety/wady strategii Redis paginacji
- 5. Hibernate 5 + Eclipse RCP + SQLite 3 - Nie można rozpoznać nazwy jako strategii org.hibernate.dialect.Dialect
- 6. Różne parametry w wzorcu strategii
- 7. Używanie fabryki ze wzorem strategii
- 8. Używanie równoległych strategii z monadami
- 9. Apache CXF - Żadna z opcji strategii nie może być spełniona
- 10. optymalnej strategii dla gry 2 graczy
- 11. Jak wdrożyć wzór strategii w programie Go?
- 12. hapi-auth-cookie nie może załadować strategii sesji
- 13. Jak korzystać z równoległych strategii w Haskell
- 14. Wzorzec strategii i eksplozja klas akcji
- 15. Czy można zdefiniować blok jako członka klasy?
- 16. Devise Omniauth - konfigurowanie i definiowanie strategii
- 17. Jak zrobić deserializowania klasy jako inną nazwą
- 18. Strategiczny wzór - wybór strategii z licznikami
- 19. Wzór strategii C + 11 ze stanem
- 20. Gdzie jest korzyść z używania wzorca strategii?
- 21. uWSGI działa jako proces, ale nie jako demon
- 22. Jak zaimplementować wzorzec strategii w C++ z std :: function
- 23. Budowanie nowej strategii dla Omniauth, ale Omniauth nie może jej znaleźć.
- 24. Szyny 4 - Wymyśl Omniautha (wiele strategii)
- 25. ES6: Zastosowanie funkcji jako metody klasy
- 26. Dobre wdrożenie Git przy użyciu strategii oddziału w Heroku?
- 27. Wzór strategii w Pythonie, gdy "strategia" składa się z więcej niż jednej funkcji
- 28. Jak rozmieścić rep: pliki strategii przez maven?
- 29. Język skryptów do opracowywania strategii handlowej
- 30. Subselect nie działa, ale jako widok działa
Baw się z Javy w takim przypadku :) – Joey
dlaczego? Java nie może obsługiwać odwołania do funkcji? –
+1 za krytyczne myślenie o wzorach projektowych. Powiedziałbym, że wiele schematów projektowych wynika z korzeni niezdolności języka. Więc w wielu przypadkach wzorce nie są biblami :) – kizzx2