Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [OOP] Schemat kalsy, i jej działanie
piraciq
post
Post #1





Grupa: Zarejestrowani
Postów: 174
Pomógł: 4
Dołączył: 27.07.2007
Skąd: Kraków

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


Witam srdecznie,

Wygląda na to,iż będę tu dosyć często zaglądał.

Tak jak w temacie chodzi mi o schemat klasy i jej działanie.
  1. <?php
  2. class userRegist
  3. {
  4.     konstruktor - używam go do przeniesienia połączenia z baza danych
  5.  
  6.     funkcja sprawdzająca poprawność email zwraza true
  7.    
  8.     funkcja sprawdzająca czy podany email jest w bazie zwraca false jesli adres istnieje
  9.  
  10.     funkcja sprawdzająca długość podanego hasła zwraca true jeśli hało ma więcej niż x znaków
  11.  
  12.    funkcja sprawdzająca czy hasło i powtórzenie hasła pasują do siebie zwraca true
  13.  
  14.      funkcja do sprawdzania tokena przepisanego i wygenerowanego zwraca true    
  15. }
  16. ?>


i teraz tak jezeli email jest prawidłowy przechodzi do sprawdzania w bazie, jeżeli go nie ma w bazie zwraca true, sprawdza hasla zwraca true, sprawdza tokeny i zwraca true w wyniku czego następuje wsadzenie rekordu do bazy i wysłanie emaila pod wskazany adres. i jest ok.


ale chodzi mi o sprawdzanie wartosci (true, false) z funkcji normalnie rozwiazal bym to tak ale chodzi mi o jakieś może lepsze rozwiazanie

  1. <?php
  2. //funkcje i cała reszta z kasy
  3.  
  4. if(poprawnyEmail)
  5. {
  6.   if(!emailJestWBazie)// tu akurat oczekuje false
  7.     {
  8.        if(dlugoscHaslaJestOdpowiednia)
  9.          {
  10.              if(podaneHaslaSaTakieSame)
  11.               {
  12.                    if(tokenSaTakieSame)
  13.                    {
  14.                           $this->rejejstrracja;
  15.                      }
  16.                 }
  17.           }
  18.      }
  19. }
  20. ?>


mam nadzieję, że jasno to napisze!! Czy można by było to zapisać w jakiś inny sposób niż taki "blok" if?(IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) ?
Go to the top of the page
+Quote Post
LBO
post
Post #2





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

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


Można. Na przykład obiektowo wykorzystując istniejący już system walidacji.

Nie jest może najlepszy, ale polecam Zend_Validate
Go to the top of the page
+Quote Post
piraciq
post
Post #3





Grupa: Zarejestrowani
Postów: 174
Pomógł: 4
Dołączył: 27.07.2007
Skąd: Kraków

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


(IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

i na zenda przyjdzie czas :-)

Na razie przez to muszę przejść, że tak powiem :]
Go to the top of the page
+Quote Post
LBO
post
Post #4





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

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


To może inaczej, sposób jaki zaprezentowałeś działa, ale jest z punktu programistycznego zły (mało reusable).

Trzymasz w jednej klasie najróżniejszego rodzaju metody walidujące. Rozbij je. Zrób klasę do walidacji stringów; inną do walidacji liczb etc. Jak już będziesz miał jakiś zestawik, zacznij się bawić.

Natomiast jeżeli uważasz, że Twoj problem nie wymaga niewiadomo czego - to olej klasy i napisz wszystko proceduralnie - [sarkazm]też będzie działać[/sarkazm]
Go to the top of the page
+Quote Post
piraciq
post
Post #5





Grupa: Zarejestrowani
Postów: 174
Pomógł: 4
Dołączył: 27.07.2007
Skąd: Kraków

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


:]

Wolę jednak mieć to obiektowo :]

więc jak widać zabrałem się do tego z innej strony :]
Go to the top of the page
+Quote Post
mike
post
Post #6





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

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


Cytat(piraciq @ 12.10.2008, 15:46:11 ) *
Wolę jednak mieć to obiektowo :]
Tyle tylko, że to co zaproponowałeś ma tyle wspólnego z OOP co JavaScript z Java.
Go to the top of the page
+Quote Post
piraciq
post
Post #7





Grupa: Zarejestrowani
Postów: 174
Pomógł: 4
Dołączył: 27.07.2007
Skąd: Kraków

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


Tak jak napisałem schemat nie samo działanie.

W trakcie jest tak jak pisał Twój poprzednik. Klasy do walidacji stringów liczb itp. Wtedy to może będzie miało coś więcej wspólnego z OOP. Niż to forum z gotowaniem :]
Go to the top of the page
+Quote Post
LBO
post
Post #8





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

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


Cytat(piraciq @ 12.10.2008, 16:08:52 ) *
Tak jak napisałem schemat nie samo działanie.

W trakcie jest tak jak pisał Twój poprzednik. Klasy do walidacji stringów liczb itp. Wtedy to może będzie miało coś więcej wspólnego z OOP. Niż to forum z gotowaniem :]


Gdyby nie ta klasa "userRegist" to bym uwierzył :] A tak przyjmij słowa krytyki - to naprawdę nie jest flame.
Go to the top of the page
+Quote Post
piraciq
post
Post #9





Grupa: Zarejestrowani
Postów: 174
Pomógł: 4
Dołączył: 27.07.2007
Skąd: Kraków

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


Cytat(LBO @ 12.10.2008, 16:14:00 ) *
Gdyby nie ta klasa "userRegist" to bym uwierzył :] A tak przyjmij słowa krytyki - to naprawdę nie jest flame.


Ja chylę czoła przed ludźmi znającymi sie na rzeczy. I to samo robię tutaj. :-) Dopiero zgłębiam wiedzę na ten temat, nie każdy jest geniuszem informatyki (zwłaszcza mechanik) ale nic nie stoi na przeszkodzie by nim zostać. :-)
Go to the top of the page
+Quote Post
Crozin
post
Post #10





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

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


A patrzyłeś chociaż na schemat działania podanego wcześniej Zend_Validate?
Go to the top of the page
+Quote Post
marcok
post
Post #11





Grupa: Zarejestrowani
Postów: 26
Pomógł: 8
Dołączył: 15.10.2008
Skąd: Wrocław

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


Witam, nie rozpisując się moge powiedzieć, że przedstawiony wyżej blok można zamienić na podobny lecz z ciekawym dodatkiem jakim niewątpliwie jest obsługa wyjątków.
  1. <?php
  2. $a = 1;
  3. $b = 2;
  4. try 
  5. {
  6.   if($a != $b)
  7.   {
  8.   throw new exception('error'); // jeżeli $a != $b zgłoś wyjątek
  9.   }
  10.   echo 'success'; // jeżeli wszystkie warunki spełnione 
  11. }
  12.  
  13. catch (exception $e) // przechwytuje wyjątki
  14. {
  15.   echo $e->getmessage(); // wyświetla wyjątek
  16. }
  17. ?>
Go to the top of the page
+Quote Post
mike
post
Post #12





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

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


~marcok właśnie podałeś najlepszy przykłąd na to ... gdzie powinno się unikać wyjątków i jak o nich nie powinno się myśleć.
Wyjątek to ... wyjątek. Sytuacja wyjątkowa, niespodziewana.

A co jest niespodziewanego w tym że pewne parametry są niepoprawne? Nic.

Sztuczne zastępowanie instrukcji warunkowych wyjątkami to błąd. Wydawałoby się że to jest "pro" ale tak nie jest. Stosowanie wyjątków ma swoje konsekwencje. Kod zamknięty w try ... catch wykonuje się dłużej. Mechanizm dla parsera robi się cięższy.
Go to the top of the page
+Quote Post
marcok
post
Post #13





Grupa: Zarejestrowani
Postów: 26
Pomógł: 8
Dołączył: 15.10.2008
Skąd: Wrocław

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


~mike mówisz, że wyjątki służą do sytuacji wyjątkowych jednak idąc dalej tym tropem gdy wstawiasz w kod try ... catch przewidujesz wystąpienie anomalii więc po co catch lepiej upakować to w if'y. Mówisz, że kod taki wykonuje się dłużej, szczerze mówiąc nie wiem nie sprawdzałem jednak dla klasy obsługującej jedynie rejestracje - czynność zdecydowanie rzadszą od np. wyświetlania strony głównej etc. Moim zdaniem jest to sposób korzystniejszy abstrahując od wydajności kodu, która czasami nie jest tak ważna.

Ten post edytował marcok 16.10.2008, 06:08:12
Go to the top of the page
+Quote Post
Crozin
post
Post #14





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

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


  1. <?
  2.  
  3. //poprawne użycie wyjątku
  4. if(!file_exists('./myConfig.php')){
  5.  //plik ten powinien zawsze istniec
  6.  throw new Exception('....', 123);
  7. }
  8.  
  9. //niepoprawne użycie wyjątku
  10. $username = $_POST['username'];
  11. if(mb_strlen($username) < 3){
  12.  //to nie jest sytuacja wyjątkowa, jest ona wręcz powszechna
  13.  throw new Exception('...', 321);
  14. }
  15. ?>


Tak jak napisał mike - poza tym, że kod jest "ciekawszy" i wygląda "fajniej"/"pr0" jest on zły.
Go to the top of the page
+Quote Post
mike
post
Post #15





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

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


Cytat(marcok @ 16.10.2008, 07:06:08 ) *
Mówisz, że kod taki wykonuje się dłużej, szczerze mówiąc nie wiem nie sprawdzałem jednak dla klasy obsługującej jedynie rejestracje - czynność zdecydowanie rzadszą od np. wyświetlania strony głównej etc.
Dobre nawyki programowania powinno sosować się zawsze. Jeśli czasem odpuszczasz "bo to tylko jedna klasa" to po pewnym czasie pisząc dużą aplikację połowa to będzie jakiś "spaghetti code".
Tu dopuszczasz sprawdzaine parametrów przy rejestracji, tak? A podczas wykonywania dowolnej innej akcji jak sprawdzasz parametry żądania? Inaczej?
Po co dwa różne sposoby? COś mam wrażenie, że gdzieś indziej też byś tak zrobił a "dowolna inna akcja" wykonuje się już "trochę" częściej niż rejestracja.
Cytat(marcok @ 16.10.2008, 07:06:08 ) *
Moim zdaniem jest to sposób korzystniejszy abstrahując od wydajności kodu, która czasami nie jest tak ważna.
W takim razie mam proste pytanie. Co zyskujesz, skoro tak jest korzystniej?

Cytat(marcok @ 16.10.2008, 07:06:08 ) *
~mike mówisz, że wyjątki służą do sytuacji wyjątkowych jednak idąc dalej tym tropem gdy wstawiasz w kod try ... catch przewidujesz wystąpienie anomalii więc po co catch lepiej upakować to w if'y.
Spłaszczasz problem. Oczywiście, że można pokazać sytuacje kiedy wiesz, że coś może wystąpią ale nadal będzie to dla Ciebie niespodziewane. ~Crozin pokazał przykład.
Kolejny przykład - łączysz się z bazą, to połączenie zawsze powinno być ale dopuszczasz możliwość, że baza padła. Sieci nie ma. Dane dostępowe się zmieniły. Dajesz to w try ... catch bo niby połączenie zawsze powinno istnieć ale co jeśli?
Go to the top of the page
+Quote Post
LBO
post
Post #16





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

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


@mike, jeżeli pozwolisz, spróbuje wyklarować sytuację w kilku zdaniach.
Wyjątki nie służą do powiadamiania o błedach jako takich (np. błedy użytkownika). Za pomocą wyjątków kształtuje sie przepływ aplikacji. Mówimy tu o sytuacji gdy część kodu nie działa jak powinna (a wystapienie błedu walidacji jest jak najbardziej rzeczą normalną i przewidywalną) i trzeba obsłużyć alternatywę - nic wiecej.

Wydaje mi się, że to jest esencja wyjątków.

Pozdrawiam, Alan
Go to the top of the page
+Quote Post

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: 23.08.2025 - 19:39