Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][OOP]Walidacja, Klasa walidujaca,
MateuszS
post
Post #1





Grupa: Zarejestrowani
Postów: 1 429
Pomógł: 195
Dołączył: 6.10.2008
Skąd: Kraków/Tomaszów Lubelski

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


Witam, zaczynam z OOP i napisałem prostą klasę walidującą dla małych formularzy, napiszcie co można poprawić, miałem ją zaopatrzyć w MVC i prezentować błędy widokiem ale to już na kiedy indziej.

  1. //wlasciwa klasa w moim nastepnym poscie w tym temacie ;P


Ten post edytował MateuszS 21.04.2010, 17:23:14
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Crozin
post
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


To zacznijmy od najłatwiejszego - przestrzeni nazw. Już pisałem jak się ich pozbyć - wystarczy usunąć namespace xxx { ... } no i pozmieniać nazwy klas, by sama nazwa oddawała lepiej charakter obiektu (teraz masz na przykład klasę: Error - i to jest ok, bo przestrzeń nazw (..\Validation) wskazuje, że jest to obiekt błędu walidacji. Bez przestrzeni nazw powinieneś to nazwać jakoś w stylu: ValidationError).

Cytat
nie bardzo rozumiem jeszcze czemu używasz tyle walidatorów (obiektów)
Dwa powody:
1) Każdy obiekt powinien zajmować się jednym, wyspecjalizowanym zadaniem. Konkretne rodzaje walidacji to już zadanie na tyle złożone, że jeden obiekt nie powinien wykonywać wszystkich rodzajów walidacji (poza tym, że musi on posiadać jakąś metodę, sprawdzającą to może on jeszcze mieć masę wewnętrznych metod (z których korzystają te sprawdzające))
2) Elastyczność... Zawsze możesz utworzyć sobie nową klasę (wystarczy, że będzie ona implementować dany interfejs) i użyć ją jako walidatora... nie jesteś ograniczony do tych kilku walidatorów napisanych pierwotnie. Możesz również utworzyć nowy walidator, który będzie rozszerzeniem innego, już istniejącego. Zauważ, że teraz walidator Email sprawdza jedynie czy format emaila jest prawidłowy. Mógłbyś sobie napisać nowy walidator, który dziedziczy po nim, ale wykonuje jeszcze jedną operację... sprawdza czy domena, którą podano w mailu nie znajduje się przypadkiem na jakieś blacklist-cie.

Teraz mógłbyś napisać... "A to jak chcę sobie dodać jakąś dodatkową opcję do walidatora maila to czemu sobie nie mam zmodyfikować istniejącego już walidatora?"
I to jest generalnie prawda - mógłbyś, ale:
1) Jeżeli projekt jest już duży mogłoby to doprowadzić do zerwania kompatybilności
2) Z czasem możesz zrobić syf w kodzie, ciągle coś tam zmieniając

Cytat
przekazujesz je jako wartość tablicy
Cóż... obiekt Walidator (ten, do którego dodajesz walidatory) musi w swoim wnętrzu wiedzieć jakie wartości jakim walidacjom poddać. Struktura: [nazwa pola] => obiekt walidatora, jest dosyć dobrą strukturą... ma swoje ograniczenia w postaci: jedno pole, jeden walidator - co na pewno musiałbyś rozbudować.

Cytat
dlaczego to rozwiązanie ma przewagę nad pojedynczym obiektem
To już opisałem - przede wszystkim czytelność i elastyczność.
Cytat
No i czy konieczna przy tym jest klasa abstrakcyjna/interfejs?
Zacznijmy od interfejsu...
No w teorii nie jest on do niczego potrzebny (PHP nie jest językiem silnie typowanym jak na przykład Java, w której raczej ciężko byłoby w ogóle skompilować kod bez użycia takiego interfejsu), ale zapewnia on zarówno polepszoną czytelność kodu (wszystkie IDE wyświetlając listę metod dostępnych dla obiektu od razu wskażą Ci, że ten parametr ma być obiektem implementującym coś tam, jak również i Ty sam czytając kod szybciej go załapiesz (po kilku tyg. nie patrzenia w niego) jak i zapewnia tego podstawową ochronę przed wrzuceniem czegoś niepoprawnego jako walidatora, przykładowo:
  1. <?php
  2.  
  3. # Jeżeli metoda Validator::addValidator() ma tak zapisane parametery: $key, $validator, wtedy:
  4.  
  5. $v->addValidator('firstname', new PDO()));
  6.  
  7. # Zadziała... tzn. kod się uruchomi a Ty dostaniesz błąd, że nie można wykonać metody isValid na tym obiekcie.
  8. # Jeżeli zaś metoda AddValidator() ma tak zapisane parametry: $key, Validatable $validator
  9.  
  10. $v->addValidator('firstname', new PDO()));
  11.  
  12. # To wywali Ci dużo przyjaźniejszy błąd: obiekt z drugiego parametru musi implementować interfejs Validatable - a nei robi tego
Na dobrą sprawę interfejsy w PHP nie są aż tak istotne (da się bez nich żyć) - tutaj wątek dot. sensu ich stosowania: Temat: Interfejsy - ale warto jest z nich korzystać.

Co do klasy abstrakcyjnej - jedyny powód, dla którego powstała to ten interfejs... wymusza on by obiekt go implementujący miał nie tylko metodę isValid, ale również dodatkowe: configure, getOpion, getOptions. Nie ma sensu bym w każdym walidatorze pisał te metody, skoro mają one robić dokładnie to samo - dlatego właśnie walidatory dziedziczą po Base (ValidatorBase w przypadku braku przestrzeni nazw).
Go to the top of the page
+Quote Post

Posty w temacie
- MateuszS   [PHP][OOP]Walidacja   21.04.2010, 15:58:09
- - Crozin   Dlaczego ten kod się do niczego nie nadaje? 1) P...   21.04.2010, 16:55:47
- - MateuszS   To tak: 1. Miałem tragiczny błąd w metodzie, nie p...   21.04.2010, 17:21:55
- - Spawnm   destruct masakryczny , echo w modelu ? Dodatkowo l...   21.04.2010, 17:29:51
- - Wicepsik   Walidacja NIPu nie polega tylko na policzeniu jego...   21.04.2010, 17:42:50
- - MateuszS   Spawnm, tak wiem, to nie jest problem zamienić na ...   21.04.2010, 18:24:03
- - Crozin   Cytat3. Mógłbyś wytłumaczyć o co chodzi z Cytatwa...   21.04.2010, 19:41:32
- - MateuszS   Niestety jest to dla mnie czarna magia co napisałe...   21.04.2010, 19:55:49
- - Crozin   CytatPoza tym wywala błędy z tym namespaceWidoczni...   21.04.2010, 20:17:58
- - MateuszS   CytatWidocznie masz PHP w wersji poniżej 5.3 - ale...   21.04.2010, 21:03:41
- - Crozin   CytatNo ja przecież napisałem skrypt który ma za z...   21.04.2010, 22:06:30
- - MateuszS   CytatRównież uważam, że branie się za FW w momenci...   22.04.2010, 11:51:06
- - Crozin   CytatNo nie przesadzajmy, podstawy pewne mamTego n...   22.04.2010, 13:30:24
- - zzeus   @Crozin mógłbyś rzucić kilka linków do artykułów k...   22.04.2010, 13:34:31
- - marcio   Cytat@Crozin mógłbyś rzucić kilka linków do artyku...   22.04.2010, 13:50:12
- - MateuszS   Crozin, to że nie użyłem w mojej klasie np. dziedz...   22.04.2010, 13:57:49
- - Crozin   CytatCrozin, to że nie użyłem w mojej klasie np. d...   22.04.2010, 16:50:25
- - MateuszS   No a jak wy się OOP uczyliście? Też mieliście taki...   22.04.2010, 19:31:53
- - marcio   Cytat(MateuszS @ 22.04.2010, 20:31:53...   22.04.2010, 20:50:39
- - MateuszS   He czyli głupie pytania kluczem do sukcesu To kol...   22.04.2010, 20:58:21
- - marcio   Taka ze dziedziczysz po klasie ktora rozszerza kla...   22.04.2010, 21:27:49
- - MateuszS   IMHO nie rozszyfrowałem skrótu acl. Mądrze piszesz...   22.04.2010, 21:52:07
- - Crozin   CytatJakis praktyczny przyklad masz komponent News...   23.04.2010, 01:02:49
- - marcio   Jak pisalem przyklady wymyslilem w momencie. Cytat...   23.04.2010, 09:29:00
- - MateuszS   Czyli jednak moja intuicja jeszcze ma się całkiem ...   23.04.2010, 13:12:58
- - Crozin   CytatKiedyś też tak myślałem ale doszedłem wtedy d...   23.04.2010, 13:57:22
- - MateuszS   Crozin, dało by się jakoś uprościć twoje klasy? Ta...   23.04.2010, 14:24:57
- - Crozin   Nie chcę już zaśmiecać wątku kolejnym długim listi...   23.04.2010, 16:42:30
- - marcio   CytatCóż... proszę rozwiń dlaczego uznałeś, że był...   23.04.2010, 17:09:22
- - MateuszS   Wielkie dzięki Crozin! To teraz pytania: 1. ...   23.04.2010, 17:31:27
- - smentek   Tablice mają to do siebie, że przechowują dane róż...   23.04.2010, 22:12:42
- - Crozin   CytatTwój walidator zwraca błędy (do tego poprzez ...   24.04.2010, 15:08:03
|- - smentek   Cytat(Crozin @ 24.04.2010, 16:08:03 )...   28.04.2010, 19:00:58
- - marcio   CytatTablice w swojej znanej z "normalnych...   24.04.2010, 17:57:00
|- - smentek   CytatTablice w swojej znanej z "normalnych...   28.04.2010, 18:43:24
- - MateuszS   Hmm... to ja może od nowa spróbuję napisać klasę, ...   24.04.2010, 22:54:01
- - Crozin   Skoro "filozofii", któregoś kawałka nie ...   25.04.2010, 00:34:00
- - MateuszS   Ok to tak, nie bardzo rozumiem jeszcze czemu używa...   25.04.2010, 08:03:55
- - Crozin   To zacznijmy od najłatwiejszego - przestrzeni nazw...   25.04.2010, 10:40:21
- - MateuszS   Albo jestem za głupi albo... właściwie to tylko to...   25.04.2010, 15:01:29
- - Crozin   JAk już napisałem... w PHP interfejsy nie grają is...   25.04.2010, 16:01:50
- - MateuszS   Ok, czyli nie wolno pojedynczemu obiektowi w tym p...   26.04.2010, 12:36:27
- - Crozin   Nie ma chyba jednoznacznej granicy. Po prostu... o...   26.04.2010, 14:34:22
- - MateuszS   Dzięki Crozin za cierpliwość (wiem że jej zasób ju...   27.04.2010, 19:11:54
- - Crozin   Cóż... możesz zawsze wrzucić kod - jeżeli już niko...   27.04.2010, 22:41:47
- - marcio   Ogolnie w jezykach takich jak Ruby/Python standart...   28.04.2010, 01:53:08
- - MateuszS   Jak najlepiej rozwiązać problem dodawania nowych o...   28.04.2010, 18:58:46
- - MateuszS   No dobra smentek, ale może wypowiedz się na temat,...   28.04.2010, 19:23:36
- - Crozin   CytatTablice w większości języków programowania mo...   28.04.2010, 20:12:27
- - MateuszS   No ok, ale Ty w swojej klasie zamieściłeś coś w st...   28.04.2010, 21:17:33
- - Crozin   To co ja zamieszczałem jako parametry to były właś...   28.04.2010, 21:20:40
- - smentek   Cytat(MateuszS @ 28.04.2010, 20:23:36...   4.05.2010, 15:19:32
- - Cysiaczek   Myślę, że iloczyn logiczny stanu walidatorów pozwa...   7.05.2010, 06:44:32


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: 14.10.2025 - 10:23