Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Filtry i kolejność wykonywania
sf
post
Post #1





Grupa: Zarejestrowani
Postów: 1 597
Pomógł: 30
Dołączył: 19.02.2003
Skąd: Tychy

Ostrzeżenie: (0%)
-----


Posiadam klasę HFilters:
  1. <?php
  2. class HFilters
  3. {
  4. private $aFilterList = array();
  5.  
  6.  
  7. private $oContext;
  8.  
  9.  
  10. public function __construct(& $oContext)
  11. {
  12. $this->oContext = & $oContext;
  13. }
  14.  
  15.  
  16. public function add(iFilter $oFilter, $iPreWeight = 10, $iPostWeight = 10)
  17. {
  18. $this->aFilterList[] = $oFilter;
  19. }
  20.  
  21.  
  22. public function pre()
  23. {
  24. foreach($this->aFilterList as $oFilter) {
  25. $oFilter->pre($this->oContext);
  26. }
  27. }
  28.  
  29.  
  30. public function post()
  31. {
  32. foreach($this->aFilterList as $oFilter) {
  33. $oFilter->post($this->oContext);
  34. }
  35. }
  36. }
  37. ?>


IFilter wygląda następująco:
  1. <?php
  2. interface iFilter
  3. {
  4. public function pre($oContext);
  5.  
  6.  
  7. public function post($oContext);
  8. }
  9. ?>


Mam problem z zaimplementowaniem kolejności wykonywania metod pre() i post() w HFilter wg ustalonwej wagi podanej w metodzie add(). Czy ktoś ma jakiś pomysł?

Ten post edytował sf 7.03.2007, 13:30:49
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
mike
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----


Proste.
Zamiast HFilters::aFilterList daj HFilters::aPreFilterList i HFilters::aPostFilterList. Potem przy wrzucaniu daj:
  1. <?php
  2. // ...
  3.  
  4. public function add(iFilter $oFilter, $iPreWeight = 10, $iPostWeight = 10)
  5. {
  6. $this->aPreFilterList[$iPreWeight] = $oFilter;
  7. $this->aPostFilterList[$iPostWeight] = $oFilter;
  8.  
  9. // Tutaj posortuj tak jak Ci wygodnie
  10. }
  11.  
  12. // ...
  13. ?>

A na końcu wykonaj filtry, uwzględniając powyższe zmiany.

P.S.
Zamiast pętli po tablicach nie lepiej użyć iteratorów?

P.S.2
Po co Ci & w konstruktorze?

update (po przemyśleniu)
Tak w ogóle to moim zdaniem źle się za to zabrałeś.
Skoro (na to przynajmniej) metody pre() i post() są widocznie rozłączne to czemu nie dasz:
  1. <?php
  2.  
  3. abstract class AbstractFilter implements Filter
  4. class PreFilter extends AbstractFilter
  5. class PostFilter extends AbstractFilter
  6. class FilterChain implements Filter
  7.  
  8. ?>

Miałbyś wtedy łańcuchy filtrów. Każdy taki łańcuch wywołałby wszystkie swoje filtry niezależnie i w dowolnej kolejności. Byłoby troszkę ładniej i przejrzyściej zorganizowane.
Go to the top of the page
+Quote Post
sf
post
Post #3





Grupa: Zarejestrowani
Postów: 1 597
Pomógł: 30
Dołączył: 19.02.2003
Skąd: Tychy

Ostrzeżenie: (0%)
-----


Nie sprawdzi się jeśli ustawimy dla dwóch filtrów taką samą wagę, jeden nadpisze drugi.

Cytat(mike_mech @ 7.03.2007, 13:43:37 ) *
P.S.
Zamiast pętli po tablicach nie lepiej użyć iteratorów?

W tym przypadku nie robi to raczej różnicy.. bo implemetnacja i tak nie wychodzi nigdzie na zewnątrz. Chyba, że itereatory są szybsze.

Cytat(mike_mech @ 7.03.2007, 13:43:37 ) *
P.S.2
Po co Ci & w konstruktorze?

Mój głupi błąd.

Dopisek:
To musi być jedna klasa ponieważ np. załóżmy, że mamy filtr benchmark.. nie chce tworzyć benchmarkStart i benchmarkEnd. Wole to umieścić w jednej klasie.

Ten post edytował sf 7.03.2007, 13:53:37
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 17.11.2025 - 23:01