Autor wpisu: Łukasz Adamczewski, dodany: 28.04.2010 09:13, tagi: php
Tydzień temu prezentowałem na swoich seminariach inżynierskich ogólne zapatrywania na swój temat dla zainteresowanych załączam prezentację.
Wykorzystanie frameworku Symfony
Tydzień temu prezentowałem na swoich seminariach inżynierskich ogólne zapatrywania na swój temat dla zainteresowanych załączam prezentację.
Wykorzystanie frameworku Symfony
Rozpocząłem pracę nad pracą inżynierską o powyższym temacie. Pragnąłbym zawrzeć w niej kurs zgodnie z ideą 30 dniowego samouczka, po której będzie można wykonać zaawansowaną aplikację. Moim marzeniem byłoby, aby publikacja była rzetelnym polskim źródłem na temat tegoż frameworka
Niedawno w ofercie wydawnictwa helion pojawiła się ciekawa książka - Czyty Kod (ang. "Clean code", autor Robert C. Martin). Książka ta opisuje techniki oraz zasady pisania czystego, czytelnego oraz modyfikowalnego kodu. Kilka zasad z tej książki w mojej opinii jest dosyć kontrowersyjnych, ale książka sama w sobie porusza bardzo ważną kwestię, a przede wszystkim jest ona naprawdę dobra.
Głównymi przesłaniami tej książki to:
Od tych dwóch zaleceń wywodzi się szereg innych dotyczących zasad budowania klas, funkcji, zależności między modułami i wiele innych. Nie będę ich tutaj oczywiście przytaczał, zainteresowanych odsyłam do tej pozycji.
Idąc śladami autora tej książki, przebuduję mój kod który już wcześniej zamieściłem w notce "Wielostronicowe formularze". Napisałem testy jednostkowe do tej klasy (pisząc plugin, testów nie napisałem ;]), po każdej wprowadzonej zmianie odpalałem testy aby sprawdzić czy klasa nadal działa tak jak powinna.
Zawahałem się przy metodzie setForms, okazało się że nazwa tej metody wprowadza w błąd, gdyż nie ustawia ona formularzy, a jedynie nadpisuje formularze dla pierwszych stron (błąd logiczny - jeśli przekazaliśmy mniejszą liczbę formularzy niż było ich wcześniej, to na końcu tablicy zostaną formularze z przed wywołania metody). Zdecydowałem się na napisanie dodatkowej funkcji o nazwie addForms, która dopisuje tablicę formularzy. Metoda setForms, tak jak nazwa wskazuje, nadpisuje wcześniej dodane formularze.
Wprowadziłem również inne drobne zmiany nazw (np. zmiennych lokalnych) i wydają się już one być dobre, teraz czas zająć się metodami.
Na pierwszy ogień poszła metoda addForm.
[PHP]
public function addForm(sfForm $form) { $form->setOption('page', $index+1); $this->forms[$index] = $form; if(!$this->isUseGlobalNamespace() && $key = $this->getFormKeyName($form, true)) { $format = $form->getWidgetSchema()->getNameFormat(); $form->getWidgetSchema()->setNameFormat($format); } else { $form->getWidgetSchema()->setNameFormat($this->getNameFormat()); } }
Dziś kumpel miał za zadanie zrobić prostą funkcję, która z kolekcji usług spełniających odpowiednie kryteria wybierze jedną, której da specjalne przywileje. Jeśli w wybranym zestawie znajdzie się usługa danego typu, to tej usłudze, pierwszej w kolejności należy te przywileje dać.
Tych usług spełniających kryteria nawet w najgorszym wypadku nie ma więcej jak kilkanaście, więc można wybrać sobie wszystkie do (w tym przypadku) Perla, i odpowiednią pętlą z warunkami znaleźć te co trzeba. Zamiast tego, przerzuciliśmy to do MySQL, sortując tych kilka elementów:
[...] ORDER BY `type`, `id` LIMIT 1[...]
Byłoby idealnie, gdyby nie to, że najbardziej potrzebny nam typ wcale nie jest pierwszy w kolejności (niezależnie czy pierwszy od początku czy od końca ;) ). Zakładając, że mamy typy liczbowe: 1, 2, 3, 4, 5, i chcemy mieć je w kolejności: najpierw wszystkie z typu 3, później wszystkie z typu 5, kolejno wszystkie z typu 2, a reszta bez znaczenia, to zaczyna robić się ciekawie ;) Jednym ze sposobów jest użycie UNII. My użyliśmy innego: funkcji FIELD(). Jak działa w ogóle ta funkcja, można przeczytać w podlinkowanym kawałku manuala. Niżej za to jest przykład, jak jej użyć do naszego celu:
SELECT `f1`, `f2`, `type` FROM `table` WHERE [warunki] ORDER BY FIELD(`type`, 3, 5, 2, 1, 4) ASC, `id` ASC
Tym sposobem mamy posortowane tak jak chcemy elementy, i mniej zabawy po odebraniu danych ;) Ale uwaga: to nie jest optymalne rozwiązanie, jeśli trzeba przetworzyć większą ilość elementów! Użycie funkcji (w tym wypadku FIELD()) przy sortowaniu/w warunku spowoduje że MySQL będzie musiał gdzieś sobie przechować dane do posortowania, i zazwyczaj użyje tabeli tymczasowej (chyba że tych danych będzie niewiele). A jedno z drugim potrafi nieco zamulić maszynę ;)