Filtry i kolejność wykonywania |
Filtry i kolejność wykonywania |
7.03.2007, 13:29:42
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:
IFilter wygląda następująco:
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 -------------------- Zapraszam na mój php blog, tworzenie stron.
|
|
|
7.03.2007, 13:50:41
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:
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:
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. |
|
|
7.03.2007, 13:51:43
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.
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. 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 -------------------- Zapraszam na mój php blog, tworzenie stron.
|
|
|
7.03.2007, 13:55:07
Post
#4
|
|
Grupa: Przyjaciele php.pl Postów: 7 494 Pomógł: 302 Dołączył: 31.03.2004 Ostrzeżenie: (0%) |
Nie sprawdzi się jeśli ustawimy dla dwóch filtrów taką samą wagę, jeden nadpisze drugi. To u góry to był tylko zarys pomysłu.Już Twoja w tym działka jak stworzyć te tablice żeby się nie nadpisały. Przecież nie jest to nic strasznie trudnego Ten post edytował mike_mech 7.03.2007, 13:55:53 |
|
|
7.03.2007, 15:52:49
Post
#5
|
|
Grupa: Zarejestrowani Postów: 1 597 Pomógł: 30 Dołączył: 19.02.2003 Skąd: Tychy Ostrzeżenie: (0%) |
Implementacja wcale nie jest taka prosta. Ponieważ klucz musi być unikalny, czyli można by to rozwiązać poprzez dodanie iteracyjnego przyrostku, ale to powoduje, że musimy ustalić zakres. Jeśli to będzie liczba złożona z jednej cyfry to mamy ograniczenie do 10 pozycji tylko.
Przy okazji Twój przykład kopiuje dwukrotnie ten sam obiekt. Rozwiązałem całość w następujący sposób.
Ten post edytował sf 7.03.2007, 15:54:22 -------------------- Zapraszam na mój php blog, tworzenie stron.
|
|
|
7.03.2007, 19:20:47
Post
#6
|
|
Grupa: Przyjaciele php.pl Postów: 7 494 Pomógł: 302 Dołączył: 31.03.2004 Ostrzeżenie: (0%) |
Implementacja wcale nie jest taka prosta. Ponieważ klucz musi być unikalny, czyli można by to rozwiązać poprzez dodanie iteracyjnego przyrostku, ale to powoduje, że musimy ustalić zakres. Jeśli to będzie liczba złożona z jednej cyfry to mamy ograniczenie do 10 pozycji tylko. Niekoniecznie.Jeśli taki indeks jest już zajęty to można z niego zrobić tablicę i zagnieździć się głębiej. Ogólnie. 1. Sprawdzam czy podana waga istnieje. 2. Jeśli nie to dodaję do tablicy. 3. Jeśli tak to sprawdzam czy pod indeksem jest tablica. Jeśli tak to dopisuję się do niej (z kolejnym indeksem) 4. Jeśli indeks istnieje i nie jest tablicą. To wyjmuję obiekt znajdujący się pod tym indeksem a wkładam tablicę gdzie ten obiekt jest jedynym elementem. To bardzo prosty algorytm. Przy okazji Twój przykład kopiuje dwukrotnie ten sam obiekt. Nieprawda.Przeanalizuj poniższy przykład: (PHP5 naprawdę już nie jest takie ułomne jeśli chodzi o obiekty ) |
|
|
8.03.2007, 12:22:45
Post
#7
|
|
Grupa: Przyjaciele php.pl Postów: 384 Pomógł: 6 Dołączył: 11.09.2004 Skąd: Grodzisk Mazowiecki Ostrzeżenie: (0%) |
Rozwiązanie takich filtrów jak dla mnie jest trochę mało wygodne. Ja rozwiązuję to o wiele wygodniej i filtry mają większe możliwości. Mianowicie filtr implemetuje interface z jedną metodą - execute która przyjmuje jako argument $filterChain'a z publiczną metodą next() która wykonuje następny filtr. Kod zapisany przed wykonaniem metody next to pre, a po metodzie to post. Proste w działaniu, banalne w implementacji.
Ufff, pisane z palca na lekcji historii (mamy w sali od inf.) Mam nadzieję że nie ma błędów i ogólny koncept zrozumiany. Pozdrawiam -------------------- |
|
|
Wersja Lo-Fi | Aktualny czas: 22.09.2024 - 11:42 |