![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 113 Pomógł: 2 Dołączył: 15.09.2011 Ostrzeżenie: (0%) ![]() ![]() |
Witajcie!
Chcę nauczyć się programowania obiektowego. Niestety, kursy internetowe opierają się na nieco głupich przykładach, w stylu: - zaszczekaj burku - hau hau Nie ma to przełożenia na realne problemy z jakimi stykamy się w programowaniu. W mojej książce, "PHP i MySQL. Vademecum profesjonalisty" także programowanie obiektowe nie zostało dobrze opisane. Postanowiłem więc spróbować napisać coś prostego. W moim przypadku był ro system rejestracji. Skrypt działa w 100%, chociaż nie jest dokończony (nie ma walidacji hasła, a walidacja loginu też nie jest w pełni skończona). Chodzi mi raczej o samą zasadę działania. Od razu mówię, że jest to mój PIERWSZY, obiektowy projekt pisany bez żadnego wzoru. Zależy mi na tym, żeby ktoś poradził, co należy zmienić.
Na początku chciałem napisać klasę connect (obecnie jest zawarta w komentarzu), jednak miałem problem z wykorzystaniem jej, tzn. zależy mi, żeby w jednej klasie zawrzeć wszystkie dane dotyczące logowania do mysql i później żebym mógł w innych klasach wykorzystywać wszystkie metody mysqli. Niestety miałem z tym problem. Jeżeli ktoś wie jak to zrobić, to byłbym także wdzięczny za odpowiedź. pozdrawiam (IMG:style_emoticons/default/smile.gif) Ten post edytował Testosteron 3.07.2014, 17:21:48 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 321 Pomógł: 55 Dołączył: 19.04.2009 Ostrzeżenie: (0%) ![]() ![]() |
do przemyślenia : co ma wspólnego "class walidacja" z DB ?
pomocny link do Twoich pytań dependency-injection |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 1 707 Pomógł: 266 Dołączył: 3.07.2012 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Po pierwsze takie małe kosmetyczne sprawy:
Oprócz tego masz logikę dziwną. Klasa walidacja nie rozszerza w logiczny sposób klasy formularz. To powinna być jedna klasa, albo klasa walidacja powinna przyjmować obiekt formularza jako parametr np. w konstruktorze. Ewentualnie na odwrót, ale tak wydaje mi się to bardziej rozsądne, bo klasa formularz ma sens bez walidacji, a walidacja bez formularza już niezbyt. Fajnie jak pouczysz się wyjątków, bo wyrzucanie błędów w echo to bardzo zły pomysł. |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 113 Pomógł: 2 Dołączył: 15.09.2011 Ostrzeżenie: (0%) ![]() ![]() |
Cytat (...) albo klasa walidacja powinna przyjmować obiekt formularza jako parametr np. w konstruktorze Chodzi o to, żeby utworzyć obiekt klasy formularz i wywołać metodę wyświetl w konstruktorze? Chyba cały czas myślę proceduralnie. W sumie rano przeczytałem rozdział dotyczący OOP, wykonałem kilka ćwiczeń, a wieczorem napisałem ten skrypt dla treningu. Wiem co to jest dziedziczenie. Często podaje się przykłady w stylu - klasy rower i samochód dziedziczą od klasy pojazd, itp. Nie jest to jednak typowy problem z którym stykamy się w programowaniu. W jakich przypadkach najczęściej korzysta się z dziedziczenia? W tej chwili do głowy przychodzi mi tylko tworzenie bazy danych. Tam faktycznie pewne pola mogą być wspólne i są logicznie połączone (IMG:style_emoticons/default/smile.gif) . Ten post edytował Testosteron 4.07.2014, 09:05:10 |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 4 291 Pomógł: 829 Dołączył: 14.02.2009 Skąd: łódź Ostrzeżenie: (0%) ![]() ![]() |
Dalej masz te same błędy:
Nazewnictwo klas Ogólnie stosuje się camelCase w nazwach metod i dobrym nawykiem są angielskie nazwy. Echo w metodach. Samo zapytanie insert powinno być odzielną metodą. Do obsługi bazy danych, np. nawiązywanie połączenia czy pobranie obiektu bazy napisz osobną klasę ale nie dziedzicz jej, a niech metoda getDb() będzie statyczna. Cytat Często podaje się przykłady w stylu - klasy rower i samochód dziedziczą od klasy pojazd, itp. Nie jest to jednak typowy problem z którym stykamy się w programowaniu. Przykład może nie z życia wzięty, ale poprawny. Przykład: RegisterController może dziedziczyć głowny kontroler aplikacji. |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 113 Pomógł: 2 Dołączył: 15.09.2011 Ostrzeżenie: (0%) ![]() ![]() |
* Nazewnictwo to mały pikuś. Ten skrypt miał być wyłącznie ćwiczeniem.
* Echo użyłem, ponieważ nie uczyłem się jeszcze obsługi wyjątków. * Co do insert - poprawię to. * Próbowałem napisać klasę do łączenia z mysql, ale cos mi nie szło, tzn. nie wiedziałem jak korzystać z wbudowanych metoda mysqli. Kod, który próbowałem napisać jest w komentarzu. Ten post edytował Testosteron 4.07.2014, 09:08:23 |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 859 Pomógł: 177 Dołączył: 29.10.2009 Ostrzeżenie: (0%) ![]() ![]() |
Odnośnie ECHO to nigdy nie używaj tego w metodach ponieważ funkcja powinna zwracać jakąś wartość, a co znią później zrobisz to od Ciebie zależy: sprawdzić warunkiem czy też wyświetlić:
Przykład:
U Ciebie z danymi nic nie możesz zrobić bo metody nic nie zwracają... Ten post edytował aras785 4.07.2014, 09:32:55 |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 1 707 Pomógł: 266 Dołączył: 3.07.2012 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Dziedziczenie jest wspaniałe i daje mnóstwo korzyści. Jedną z moich ulubionych jest tzw. polimorfizm. Jako że nie lubisz przykładów nieinformatycznych (ja np. wolę takie na psach, truskawkach itd. (IMG:style_emoticons/default/biggrin.gif) ), to spróbuję podać informatyczny. Ba, podam nawet przykład dla klasy formularzy.
Prędzej czy później będziesz chciał zrobić obiekty pól formularza. To jest doskonałe miejsce dla dziedziczenia, bo one będą miały jakieś części wspólne, na przykład:
Obiekt generujący textarea mógłby dziedziczyć po obiekcie generującym zwykłe pole tekstowe, bo będą miały prawdopodobnie wiele wspólnego, a jedną z niewielu różnic będzie metoda, która wypluwa ich HTML. W klasie formularza mógłbyś mieć metodę, która dodaje pole na zasadzie:
A definicja metody add w klasie Form mogłaby wyglądać tak:
Tutaj działa nasz polimorfizm, bo mówisz metodzie add, że może przyjmować dowolne pole. Każda z naszych powyższych klas InputText, InputCheckbox i InputTextarea to instancje klasy InputField, bo każda po niej dziedziczy. InputText i InputCheckbox bezpośrednio, a InputTextarea dziedziczy po InputText, czyli też jest dzieckiem klasy InputField (IMG:style_emoticons/default/smile.gif) |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 113 Pomógł: 2 Dołączył: 15.09.2011 Ostrzeżenie: (0%) ![]() ![]() |
Nie wiem, czy dobrze Cię zrozumiałem. Mogę stworzyć klasę form, która odpowiada za zwracanie pól formularza. Jej metoda mogłaby przyjmować parametr dotyczący typu pola, czyli - text, password, itp. Inna metoda tej klasy mogłaby ogólnie tworzyć formularz, a więc, np. ustawiałaby metodę get, bądź post i wskazywała na plik do którego mają zostać przesłane dane. Kolejne klasy dziedziczyłyby z tej klasy i odnosiłyby się do konkretnych typów pól formularza. Zawierałyby np. walidację wprowadzonych przez użytkownika danych i zwracałyby true bądź false
Dodatkowo metoda klasy form sprawdzałaby, czy dane zostały wcześniej przesłane. Zwracałaby wartość true bądź false. Poniżej deklaracji wszystkich klas mógłbym stworzyć instrukcję warunkową, która sprawdzałaby, czy dane zostały przesłane. Jeśli nie (a więc odpowiednia metoda zwróci wartość false), tworzy obiekty typu - login, password, mail, itp. W przeciwnym wypadku następuje sprawdzenie poprawności danych i jeśli wszystko jest dobrze, następuje zapisanie ich w bazie danych. W takim układzie tworząc kolejne formularze na stronie (np. komentarze, wyszukiwarka), mógłbym skorzystać z klas stworzonych wcześniej. Oczywiście musiałbym dodać nowe zapytanie, być może nową klasę weryfikującą poprawność danych, ale pracy byłoby o wiele mniej. Uważasz, że tak byłoby dobrze? Ten post edytował Testosteron 4.07.2014, 19:23:54 |
|
|
![]()
Post
#10
|
|
Grupa: Nieautoryzowani Postów: 2 249 Pomógł: 305 Dołączył: 2.10.2006 Ostrzeżenie: (0%) ![]() ![]() |
@Testosteron - nie. Przeczytałeś w ogóle post oraz listingi podane przez @SmokAnaloga?
Uproszczając: masz jedną klasę, Input, która zawiera wszelkie metody wspólne dla wszystkich typów kontrolek formularzy, np. Input::getName(). Tworzysz sobie x klas, dla każdego typu kontrolek, które chcesz wykorzystać: np. Checkbox, Text, Textarea, które dziedziczą po klasie Input. |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 113 Pomógł: 2 Dołączył: 15.09.2011 Ostrzeżenie: (0%) ![]() ![]() |
Czytałem, ale przed samym wyjściem. A metody walidacji wstawić w klasach konkretnych inputów?
|
|
|
![]()
Post
#12
|
|
Grupa: Nieautoryzowani Postów: 2 249 Pomógł: 305 Dołączył: 2.10.2006 Ostrzeżenie: (0%) ![]() ![]() |
Walidacja moim zdaniem powinna być osobnym bytem. Stosuj zasadę jednej odpowiedzialności (ang. Single responsibility principle).
Za Wikipedią: Cytat Martin utożsamia odpowiedzialność klasy z powodem do jej modyfikacji. Możemy rozważyć moduł, który generuje i drukuje raport. Odpowiada on za dwa procesy, a tym samym mogą wystąpić dwa powody do jego modyfikacji. Po pierwsze, może zmienić się treść generowanego raportu, po drugie ? format, w jakim jest on drukowany. Zasada pojedynczej odpowiedzialności mówi, że oba te procesy powinny być niezależne i zaimplementowane w postaci dwóch oddzielnych klas lub modułów, które komunikują się ze sobą przy pomocy publicznych interfejsów. Zobacz sobie jak to jest rozwiązane np. w komponencie Validation z Symfony. Ten post edytował pedro84 5.07.2014, 10:34:03 |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 113 Pomógł: 2 Dołączył: 15.09.2011 Ostrzeżenie: (0%) ![]() ![]() |
Ściągnąłem Symfony. Muszę przyznać, ze ten kod jest dla mnie jest trochę skomplikowany. Zauważyłem ponadto , że większość klas dziedziczy od sfValidatorRegex. Ona z kolei dziedziczy od sfValidatorString, itp. Jeszcze dobrze nie rozumiem zagadnień związanych z OOP. Myślałem, żeby nieco poduczyć się Javy. Nie tylko nauczę się lepiej programować obiektowo, ale ta wiedza też się nie zmarnuje:
1. Coraz więcej stron posiada mobilne wersje stron. 2. Często strony tworzą aplikacje, które mają za zadania rozreklamować daną stronę. 3. Czasami przydałoby mi się stworzyć aplikację desktopową, itp. Chciałbym rozwijać się głównie w programowaniu stron WWW (znam też trochę jQuery, a JS musiałbym sobie przypomnieć). Moją największą bolączką w PHP jest właśnie OOP, a wydaje mi się, że Java jest dobrym językiem do nauki obiektówki. PS. Jak znajdę chwilę czasu to postaram się stworzyć ten skrypt jeszcze raz, według wskazówek, które mi udzieliliście. |
|
|
![]()
Post
#14
|
|
Grupa: Nieautoryzowani Postów: 2 249 Pomógł: 305 Dołączył: 2.10.2006 Ostrzeżenie: (0%) ![]() ![]() |
Chodziło mi o Symfony 2.
Najpierw musisz poznać podstawy programowania obiektowego, a dopiero potem poszczególne implementacje w danych językach. PHP nie jest już tak tragiczny w implementacji OOP jak parę lat temu (co nie znaczy, że nie mogłoby być lepiej). PS. Co ma Java do stron mobilnych? |
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 113 Pomógł: 2 Dołączył: 15.09.2011 Ostrzeżenie: (0%) ![]() ![]() |
Chodziło mi o aplikacje na urządzenia mobilne. Dużo stron posiada takie aplikacje, które ułatwiają korzystanie z nich, np. FB, nk, Kwejk, Demotywatory, itp.
Natrafiłem na pewien problem w kodzie. Otóż - muszę stworzyć klasę, która sprawdza, czy dane zostały przesłane z formularza (następuje ich weryfikacja) czy nie (wyświetlenie formularza). W poprzednim kodzie sprawdzałem czy którakolwiek ze zmiennych globalnych nie została wysłana. W nowym kodzie mogę stworzyć dowolną ilość kontrolek formularza o dowolnych nazwach. Jak więc zrobić taką klasę? Może po prostu zrobić to już poza klasami? Faktycznie, ściągnąłem starszą wersję. W sumie za bardzo nie wczytałem się na ich stronie, ale na pierwszy rzut oka widzę, ze jest trochę zabawy z instalacją Symphony 2. Trzeba zainstalować Compozera, itp. W Zend pewnie też są w miarę porządnie napisane klasy walidacji danych. Jutro ściągnę Zenda albo ę Symphony 2, bo dzisiaj jestem już zmęczony. Trochę poprawiłem kod, ale na razie zrobiłem tylko szkielet.
Nikt już się nie wypowie? Ten post edytował Testosteron 6.07.2014, 19:10:17 |
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
Drobne uwagi co do kodu.
W klasach dziedziczących powinieneś mieć 1 metodę która nazywa się createInput (jego rodzaj definiuje przecież typ obiektu) Nie ma sensu tworzenia oddzielnych metod dla każdej z nich. Dodatkowo setName powinno się odnosić do formularza a nie do input. Nazwę input przekazuj w konstruktorze obiektu i ustawiaj w klasie. Dzięki temu masz każdy obiekt nazwany i nie musisz stosować setName, getName. Poza tym ja bym zrobił coś na zasadzie: - Jest sobie obiekt Form. Posiada on kolekcję inputów. coś na zasadzie:
To tak na szybko. |
|
|
![]()
Post
#17
|
|
Grupa: Zarejestrowani Postów: 53 Pomógł: 17 Dołączył: 4.07.2014 Ostrzeżenie: (0%) ![]() ![]() |
Może pomyśl o klasie abstrakcyjnej, wydzielisz do niej wszystkie właściwości i wymusisz interfejs metodą abstrakcyjną. Zauważ że wszystkie te klasy własnie robią podobną czynność. Potem wystarczy użyć polimorfizmu i masz ładny kod.
|
|
|
![]()
Post
#18
|
|
Grupa: Zarejestrowani Postów: 113 Pomógł: 2 Dołączył: 15.09.2011 Ostrzeżenie: (0%) ![]() ![]() |
Macie rację. Postaram się poprawić kod. Tylko, że klasa form sama w sobie posiada metody, tworzące znacznik <form> (wraz z atrybutami) oraz znacznik zamykający. Jeśli stworzę klasę abstrakcyjną to nie będę mógł stworzyć obiektu tej klasy i korzystać z jej metod w taki sposób jak to robię obecnie.
Ten post edytował Testosteron 17.07.2014, 20:35:15 |
|
|
![]()
Post
#19
|
|
Grupa: Nieautoryzowani Postów: 2 249 Pomógł: 305 Dołączył: 2.10.2006 Ostrzeżenie: (0%) ![]() ![]() |
A właściwie po co Ci metoda, w której klasa pluje HTMLem, który możesz napisać w widoku?
|
|
|
![]()
Post
#20
|
|
Grupa: Zarejestrowani Postów: 113 Pomógł: 2 Dołączył: 15.09.2011 Ostrzeżenie: (0%) ![]() ![]() |
No niby mogę, ale z drugiej strony w widoku można napisać cały formularz. Jeżeli piszę klasę formularza to mam wrażenie, że bez tych dwóch metod byłaby niepełna.
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 23.08.2025 - 02:09 |