![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 66 Pomógł: 0 Dołączył: 5.07.2007 Ostrzeżenie: (0%) ![]() ![]() |
Witam
Napisałem klasę która ma obsługiwać użytkownika wydaje mi się, że jest ona nieoptymalna... wstawiam ją aby ktoś z większym doświadczeniem ją obejrzał i mnie nakierował co można zrobić lepiej i co mam poprawić ![]() Klasa:
Logowanie:
Update/Odczyt danych:
Wylogowanie:
Struktura SQL:
Pozdrawiam Rav |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 40 Pomógł: 5 Dołączył: 24.08.2007 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
Może nie jestem jakimś profesjonalistą, ale zmienił bym parę rzeczy:
1. Wyświetlanie błędu mysql w przypadku braku połączenia jest bez sensu. Nie lepiej po prostu zostawić: "Błąd połączenia z bazą danych". 2. Używanie die() w środku klasy (szczególnie w konstruktorze) też nie jest według mnie najlepszym błędem. Jak dla mnie powinien być zwracany jakiś kod błędu i dopiero wtedy pokazywany błąd. Poza tym korzystanie z die() powoduje przerwanie wykonywanie skryptu. (o ile nie jest to biała strona bez html, dużo znaczników html nie zostanie zakończonych) 3. Tworzenie instancji klasy za każdym razem jak chcesz wykonać jakieś operacje na koncie użytkownika też trochę (jak dla mnie) jest źle pomyślane. Za każdym razem jak dokonujesz zmian jest wcześniej wykonywany kod logowania (a przez to jest dużo nie potrzebnych zapytań do bazy). Wiem, że wszyscy mówią, że korzystanie ze wzorcu Signleton jest złe i w ogóle się nie powinno, ale jak dla mnie to lepsze rozwiązanie niż wykonywanie co chwile kodu logowania. 4. Wykonywanie zapytania do bazy przy wylogowywaniu też jest zbędne. Wystarczy, że z sesji usuniesz zmienną token ;D To chyba wszystko co od razu rzuciło mi się na oczy, pewnie jest jeszcze parę rzeczy, które wymagały by poprawy, ale może niech pomyśli nad tym ktoś bardziej doświadczony ;P Pozdr, Valker |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 66 Pomógł: 0 Dołączył: 5.07.2007 Ostrzeżenie: (0%) ![]() ![]() |
1. Wyświetlanie błędu mysql w przypadku braku połączenia jest bez sensu. Nie lepiej po prostu zostawić: "Błąd połączenia z bazą danych". 2. Używanie die() w środku klasy (szczególnie w konstruktorze) też nie jest według mnie najlepszym błędem. Jak dla mnie powinien być zwracany jakiś kod błędu i dopiero wtedy pokazywany błąd. Poza tym korzystanie z die() powoduje przerwanie wykonywanie skryptu. (o ile nie jest to biała strona bez html, dużo znaczników html nie zostanie zakończonych) 3. Tworzenie instancji klasy za każdym razem jak chcesz wykonać jakieś operacje na koncie użytkownika też trochę (jak dla mnie) jest źle pomyślane. Za każdym razem jak dokonujesz zmian jest wcześniej wykonywany kod logowania (a przez to jest dużo nie potrzebnych zapytań do bazy). Wiem, że wszyscy mówią, że korzystanie ze wzorcu Cjest złe i w ogóle się nie powinno, ale jak dla mnie to lepsze rozwiązanie niż wykonywanie co chwile kodu logowania. 4. Wykonywanie zapytania do bazy przy wylogowywaniu też jest zbędne. Wystarczy, że z sesji usuniesz zmienną token ;D 1. To jest na razie do testów, później dam funkcję zapisującą logi, oraz będzie się pojawiał stosowny komunikat na stronie ![]() 2. Faktycznie, trochę nie pomyślałem... myślisz, że jak dam przekierowanie za pomocą header do strony rejestracji to będzie ok?? 3. Hmm... nie słyszałem to wzorcu Signleton więc go nie zastosowałem, natomiast przed chwilą wlazłem z ciekawości na http://phpedia.pl/wiki/Singleton i poczytałem, bardzo ciekawe to jest, tylko jak ja będę miał wszystko w osobnych plikach to nie za bardzo potrafię sobie wyobrazić jak to będzie działać... 4. Faktycznie :F jedno zapytanie do bazy mniej.... Dziękuję za wskazanie tych błędów, zmiany zostaną wprowadzone ![]() Pozdrawiam Rav |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 656 Pomógł: 3 Dołączył: 26.10.2005 Skąd: Częstochowa Ostrzeżenie: (0%) ![]() ![]() |
można wiele zmienić taka troszkę średnia ta klasa
![]() nie wczytywałem się ale na 1 rzut oka, chociażby rejestracja, po prostu ustaw sobie w bazie pola na unique i jak będzie taki istniał to zwróci błąd -------------------- zmoderowano - waga i rozmiar
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 66 Pomógł: 0 Dołączył: 5.07.2007 Ostrzeżenie: (0%) ![]() ![]() |
można wiele zmienić taka troszkę średnia ta klasa ![]() nie wczytywałem się ale na 1 rzut oka, chociażby rejestracja, po prostu ustaw sobie w bazie pola na unique i jak będzie taki istniał to zwróci błąd Rozumiem ![]() Jak klasa jest średnia to może mógłbyś nakierować co można jeszcze poprawić... dopiero się uczę pisać klasy w PHP i każda wskazówka jest cenna ![]() |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 81 Pomógł: 14 Dołączył: 28.11.2010 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
1. Definiujesz dane do bazy danych, które równie dobrze mógłbyś wpisać do klasy poprzez choćby tablicę z konfiguracją.
2. Klasa jest kompletnie nie tyle co źle, a bezsensownie napisana. 3. Pakujesz wszystko do jednego - Połączenie z bazą danych, operacje na niej, dane użytkownika, autoryzacja, wyświetlanie. 4. Łączysz się za każdym razem przy próbie utworzenia obiektu User. 5. Prawie w każdej metodzie wykonujesz zapytanie o_O. 6. Wspomniałem wyżej, że klasa jest napisana bezsensu, ponieważ niektóre "metody" zawarte w niej są na siłę wepchane (czyt. Twoja klasa to kontener na funkcję) 7. Podstawy OOP się kłaniają - Single Responsibility Principle - Jedna sprawa - Jedna klasa. Przede wszystkim musisz oddzielić od siebie taki rzeczy jak baza danych (dostęp, komunikacja, obsługa), zarządzanie użytkownikiem, autoryzacja. Stwórz klasę, która zajmie się połączeniem z bazą danych, zwróci Ci obiekt jakiegoś sterownika bazy danych (np. klasę dziedziczącą po PDO). Zrób osobną klasę dla obsługi użytkownika (tworzenie, usuwanie, edycja / pobieranie danych) oraz osobną do autoryzacji (logowanie, wylogowywanie, sprawdzanie). pozdrawiam ![]() |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 66 Pomógł: 0 Dołączył: 5.07.2007 Ostrzeżenie: (0%) ![]() ![]() |
![]() ![]() Dziękuję Ci za te wskazówki ![]() Gdyby ktoś jeszcze wykrył jakieś nieścisłości to dajcie znać ![]() Pozdrawiam Rav EDIT: Trochę się napisałem (wzorując się na innej klasie) i stworzyłem to: Klasa pomocnicza http://pastebin.com/DrBKxin0 Klasa Sesja http://pastebin.com/XdtQgZ5c Klasa User http://pastebin.com/hd6snAJT Strona bez zabezpieczeń http://pastebin.com/H2iXn0ki Logowanie/Wylogowanie http://pastebin.com/4wEwAH2F Rejestracja http://pastebin.com/Na6L10Gm Strona z zabezpieczeniem http://pastebin.com/JarmyA5K Pozdrawiam Rav Ten post edytował rav1989 25.04.2011, 21:47:50 |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 275 Pomógł: 32 Dołączył: 21.03.2006 Skąd: Warszawa Ostrzeżenie: (20%) ![]() ![]() |
Postaraj się trzymać stałego nazewnictwa. Nazwy funkcji zaczynaj od małej litery, nie wielkiej (klasa User: Rejestruj itd.)
|
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 66 Pomógł: 0 Dołączył: 5.07.2007 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 81 Pomógł: 14 Dołączył: 28.11.2010 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
1. Klasa pomocnicza - W konstruktorze klasy ustalasz na sztywno dane (przeglądarkę i ip), a co jeśli będziesz chciał przekazać to z poziomu aplikacji? Bezsensowne grzebanie w kodzie, po prostu przekaż przy tworzeniu obiektu HttpRequest te dane jako argumenty w konstruktorze, bądź jakichkolwiek metodach. Tak poza tym HttpRequest nie powinien być tylko ustalaczem i pobieraczem do browsera i ip
![]() 2. Zmienne globalne w klasie, tutaj jest to bardzo niemile widziane. Dlaczego nie przekażesz w dowolnej metodzie/konstruktorze klasy j/w obiektu PDO? Jest też lepsze rozwiązanie stworzenie klasy Singletona, która zwróci Ci jedną instancję obiektu PDO i przy okazji wykona połączenie 1 raz. 3. Co do definiowania takich rzeczy jak długość życia sesji, czy też jej nazwy - są od takich stałe w klasie. 4. Trzymaj się ustalonych zasad nazewnictwa klas/metod/zmiennych - i nie mówię dużych/małych literach z kreskami czy nie, ale też o tym, że getOpis() czy getNazwa() są po prostu śmieszne i pokazują niski poziom autora kodu i nie tylko ![]() 5. Znów wszystko jest namieszane jak leci. Musisz przemyśleć dokładnie jak to ma wyglądać. Nie wiem, przypatrz się na jakiś projekt oparty o OOP jak mniej więcej to wygląda, pozdrawiam ![]() |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 66 Pomógł: 0 Dołączył: 5.07.2007 Ostrzeżenie: (0%) ![]() ![]() |
Cytat 1. Klasa pomocnicza - W konstruktorze klasy ustalasz na sztywno dane (przeglądarkę i ip), a co jeśli będziesz chciał przekazać to z poziomu aplikacji? Bezsensowne grzebanie w kodzie, po prostu przekaż przy tworzeniu obiektu HttpRequest te dane jako argumenty w konstruktorze, bądź jakichkolwiek metodach. Tak poza tym HttpRequest nie powinien być tylko ustalaczem i pobieraczem do browsera i ip ![]() Ok ![]() Tak to teraz wygląda
A tak się inicjalizuje
Cytat 2. Zmienne globalne w klasie, tutaj jest to bardzo niemile widziane. Dlaczego nie przekażesz w dowolnej metodzie/konstruktorze klasy j/w obiektu PDO? Jest też lepsze rozwiązanie stworzenie klasy Singletona, która zwróci Ci jedną instancję obiektu PDO i przy okazji wykona połączenie 1 raz. Nie wiem czy zrozumiałem ten wzorzec Singleton... zrobiłem tak:
Pozbyłem się też tych zmiennych globalnych i przekazuję wszystko przy pomocy konstruktora ew. jako zmienna w metodach statycznych ![]() Cytat 3. Co do definiowania takich rzeczy jak długość życia sesji, czy też jej nazwy - są od takich stałe w klasie. Poprawiłem i przeniosłem jako zmienne prywatne do klasy ![]() Cytat 4. Trzymaj się ustalonych zasad nazewnictwa klas/metod/zmiennych - i nie mówię dużych/małych literach z kreskami czy nie, ale też o tym, że getOpis() czy getNazwa() są po prostu śmieszne i pokazują niski poziom autora kodu i nie tylko ![]() OK. Pozmieniałem wszystkie nazwy Polskie na Angielskie odpowiedniki (również w bazie danych) Cytat 5. Znów wszystko jest namieszane jak leci. Musisz przemyśleć dokładnie jak to ma wyglądać. Nie rozumiem... dlaczego jest namieszane? Pozdrawiam Rav |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 81 Pomógł: 14 Dołączył: 28.11.2010 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Cytat Cytat 5. Znów wszystko jest namieszane jak leci. Musisz przemyśleć dokładnie jak to ma wyglądać. Nie rozumiem... dlaczego jest namieszane? Staraj się by jedno zajmowało się jednym, a drugie drugim. 1. HttpRequest - Dodałeś GET i POST, ale co z SERVER, REQUEST, SESSION, COOKIE etc. Poza tym nie lepiej by była to klasa statyczna, bądź Singleton by nie przekazywać non stop obiektu? 2. Klasa DB - Dobry pierwszy krok, ale Singleton z tego marny, właściwie w ogóle go brak ![]() Przykład:
I wykorzystanie na początku aplikacji?
3. Co do klasy User - To tutaj głównie mam zarzuty co do mieszania. Masz tutaj rejestracje, sprawdzanie, pobieranie informacji o użytkowniku oraz zwracanie czy to Admin, czy Moderator. Jeśli mowa tutaj o optymalizacji trzeba też wspomnieć o jakimś ładzie - Osobna klasa do rejestracji użytkownika, sprawdzania czy istnieje i innych. Inna znowu do pobierania danych użytkownika o id / nazwie x, oraz ew. rozszerzenie do klasy pobierającej dane, która ustali czy to Admin/Mod/Użytkownik czy ktokolwiek. Życzę miłej pracy ![]() |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 66 Pomógł: 0 Dołączył: 5.07.2007 Ostrzeżenie: (0%) ![]() ![]() |
Cytat 1. HttpRequest - Dodałeś GET i POST, ale co z SERVER, REQUEST, SESSION, COOKIE etc. Poza tym nie lepiej by była to klasa statyczna, bądź Singleton by nie przekazywać non stop obiektu? Nie mam pojęcia jak to zrobić aby było to Singleton... natomiast dodałem SERVER i COOKIE (jakoś reszty nie potrzebuję) analogicznie jak zrobiłem to z GET i POST Cytat 2. Klasa DB - Dobry pierwszy krok, ale Singleton z tego marny, właściwie w ogóle go brak ![]() Przykład:
I wykorzystanie na początku aplikacji?
Hmm... Kod Fatal error: Non-static method PDO::__construct() cannot be called statically in C:\wamp\www\class\db.class.php on line 33 nie wiem co poszło nie tak...Cytat 3. Co do klasy User - To tutaj głównie mam zarzuty co do mieszania. Masz tutaj rejestracje, sprawdzanie, pobieranie informacji o użytkowniku oraz zwracanie czy to Admin, czy Moderator. Jeśli mowa tutaj o optymalizacji trzeba też wspomnieć o jakimś ładzie - Osobna klasa do rejestracji użytkownika, sprawdzania czy istnieje i innych. Inna znowu do pobierania danych użytkownika o id / nazwie x, oraz ew. rozszerzenie do klasy pobierającej dane, która ustali czy to Admin/Mod/Użytkownik czy ktokolwiek. Zrobiłem osobne klasy do sprawdzenia poziomu (Anonim, User, Admin)
Zrobiłem też osobne klasy do rejestracji oraz sprawdzania Usera ![]()
Pozdrawiam Rav |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 81 Pomógł: 14 Dołączył: 28.11.2010 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Cytat Hmm... Kod Fatal error: Non-static method PDO::__construct() cannot be called statically in C:\wamp\www\class\db.class.php on line 33 nie wiem co poszło nie tak... Błąd jest chyba logicznie prosty (Niestety mój ![]()
Klasa CheckUser i AddUser jest na razie bezsensu napisana, dlaczego? Przypatrz się uważnie - Skoro robisz jedną metodę w klasie to oznacza to, że klasa to tylko opakowanie na funkcję ![]() Natomiast co do klasy CheckMode, ja nie mam żadnych zastrzeżeń (przynajmniej jakichś większych). BTW: Dlaczego w klasie DB nie przypiszesz takich stałych jak prefix? pozdrawiam. |
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 66 Pomógł: 0 Dołączył: 5.07.2007 Ostrzeżenie: (0%) ![]() ![]() |
Cytat Błąd jest chyba logicznie prosty (Niestety mój ![]()
Błąd jest nadal czepia się tej linii:
prawdopodobnie chodzi mu o ten zapis parent::__construct(...); bo to wskazuje, że konstruktor rodzica jest statyczny... Cytat Klasa CheckUser i AddUser jest na razie bezsensu napisana, dlaczego? Przypatrz się uważnie - Skoro robisz jedną metodę w klasie to oznacza to, że klasa to tylko opakowanie na funkcję ![]() Hmm faktycznie, a teraz:
Cytat BTW: Dlaczego w klasie DB nie przypiszesz takich stałych jak prefix? No wiesz, jak będę przenosił stronę na inny serwer to prefix się może zmienić i wtedy będę musiał szukać go po klasie a tak mam w jednym miejscu na widoku razem z innymi danymi ![]() Pozdrawiam Rav |
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 81 Pomógł: 14 Dołączył: 28.11.2010 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Usunąłeś przed metodą w klasie DB magiczne słowo "static"?
![]() |
|
|
![]()
Post
#17
|
|
Grupa: Zarejestrowani Postów: 66 Pomógł: 0 Dołączył: 5.07.2007 Ostrzeżenie: (0%) ![]() ![]() |
Usunąłeś przed metodą w klasie DB magiczne słowo "static"? ![]() Nic nie usuwałem... słowo...
Jak widzisz skopiowałem twoją wersję ![]() Rozumiem, że reszta jest już OK? Pozdrawiam Rav |
|
|
![]()
Post
#18
|
|
Grupa: Zarejestrowani Postów: 81 Pomógł: 14 Dołączył: 28.11.2010 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Właśnie o to chodzi by usunąć tego statica, bo on jest tutaj problemem. Pamiętaj też, że podałem przykład i nie należy go kopiować jak leci
![]() |
|
|
![]()
Post
#19
|
|
Grupa: Zarejestrowani Postów: 66 Pomógł: 0 Dołączył: 5.07.2007 Ostrzeżenie: (0%) ![]() ![]() |
Właśnie o to chodzi by usunąć tego statica, bo on jest tutaj problemem. Pamiętaj też, że podałem przykład i nie należy go kopiować jak leci ![]() Aaa to dobre! test na czujność ![]() Oczywiście teraz wszystko działa jak trzeba ![]() Mam nadzieję, że reszta jest w porządku ![]() Pozdrawiam Rav Ten post edytował rav1989 27.04.2011, 22:06:23 |
|
|
![]()
Post
#20
|
|
Grupa: Zarejestrowani Postów: 81 Pomógł: 14 Dołączył: 28.11.2010 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Przydać zawsze się przyda, lecz najpierw trzeba wyznaczyć czym dana klasa ma się zajmować / co zwracać i trzeba przemyśleć jak ją napisać. Pamiętaj, że nie piszesz po to by było ładnie, ale po to by było to wygodne i pomocne. Jeśli wiesz, że nie jest Ci potrzebna, a tylko masz przez nią problemy - Zostaw ją w spokoju, usuń
![]() |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 25.07.2025 - 10:07 |