![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 59 Pomógł: 0 Dołączył: 1.10.2006 Skąd: Bydgoszcz Ostrzeżenie: (10%) ![]() ![]() |
Witam,
Mam pytanie. Na stronie będę musiał zarządzać takimi częściami jak Uzytkownik, Autor, Utwor, Komentarz, News No i dla każdego zamierzam napisać klasę z metodami tylko, że poza innimi metodami wszystkie zawierają wspólne:
Jeszcze sprawdz dane, ale to będzie na pewno metoda prywatna. Zastanawiam się czy mam kombinować z napisaniem jakiejś klasy zawierającej te 4 metody i później klasy uzytkownik, autor itd. Mają dziedziczyć z tej klasy modyfikując właściwie pola które dodają czy pobierają czy każda klasa ma zawierać pisane od początku metody i tylko mają implementować interface który zawiera abstrakcyjne metody dodaj, pobierz, aktualizuj i usun. |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 472 Pomógł: 7 Dołączył: 7.12.2005 Skąd: Gliwice Ostrzeżenie: (0%) ![]() ![]() |
Sądzę, że te metody będą zajmować się zupełnie czym innym (dodanie usera, dodanie newsa) więc myślę, że nie wiele wspólnego będą mieć. Ty powinieneś znać logikę swojej aplikacji. (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
|
|
|
![]()
Post
#3
|
|
Grupa: Moderatorzy Postów: 2 921 Pomógł: 269 Dołączył: 11.08.2005 Skąd: 127.0.0.1 ![]() |
Odpowiedź na swoje pytanie znajdziesz w moim projekcie konkursowym (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
A tak na poważnie. Tu masz przykład jak może wyglądać klasa, po której mogą dziedziczyć Twoje klasy (wyjęte na żywca z projektu):
|
|
|
![]()
Post
#4
|
|
Grupa: Moderatorzy Postów: 4 465 Pomógł: 137 Dołączył: 26.03.2004 Skąd: Gorzów Wlkp. ![]() |
@szczurek
Moim zdaniem najlepsza jest kompozycja w tym wypadku, zatem lepiej jak klasy będą implementowały interfejs. Pozdrawiam. |
|
|
![]()
Post
#5
|
|
Grupa: Przyjaciele php.pl Postów: 1 224 Pomógł: 40 Dołączył: 6.07.2004 Skąd: Wuppertal Ostrzeżenie: (0%) ![]() ![]() |
@batman opisywalem tą metodę w phpsolutions 04/2006, podałem tam gotowy kod klasy, razem z rozwiązaniem lazy init'a, finnderów danych itp
|
|
|
![]()
Post
#6
|
|
Grupa: Moderatorzy Postów: 2 921 Pomógł: 269 Dołączył: 11.08.2005 Skąd: 127.0.0.1 ![]() |
@ActivePlayer
Tak się składa, że nie czytuję phpsolutions. A klasę sam napisałem, nie wzorując się na niczyich przykładach. |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 898 Pomógł: 48 Dołączył: 2.11.2005 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Ja zgodzę się z Cysiaczkiem - najlepiej w takich przypadkach zazwyczaj użyć Interfejsu - wtedy możesz w razie konieczności sprawdzać czy dany obiekt implementuje dany interfejs (np. gdy gdzieś w innym miejscu aplikacji będzie metoda mogąca brać dowolne obiekty, które implementują te metody).
Z Twojego opisu sytuacji wnioskuje jednak, że poza takimi samymi nazwami metod nie idzie za nimi większa abstrakcja, więc pytanie czy w ogóle jest sens tutaj wprowadzać jakiekolwiek zależności. Pamiętaj, że dziedziczenie nie powstało po to aby "zaoszczędzić pisania", a żeby pozwalać na różne poziomy abstrakcji i ułatwiać pisanie/rozbudowywanie kodu. Dziedziczenie na siłę klas, które nie są logicznie powiązane powoduje zazwyczaj tylko bałagan w kodzie i problemy z jego utrzymaniem. //edit No może tutaj można zrobić specjalny obiekt, który będzie operował na bazie i będzie pozwalał na dodawanie / usuwanie /modyfikowanie/odczytywanie poszczególnych danych - coś jak Active Record Pattern Ten post edytował athabus 4.01.2007, 17:32:17 |
|
|
![]()
Post
#8
|
|
Grupa: Przyjaciele php.pl Postów: 5 724 Pomógł: 259 Dołączył: 13.04.2004 Skąd: N/A Ostrzeżenie: (0%) ![]() ![]() |
Przy ActiveRecord dziedziczenie ulatwia sprawe -- definiujesz pola i ich typy w podklasach a nadrzedna klasa zajmuje sie ich zapisem i odczytem.
|
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 59 Pomógł: 0 Dołączył: 1.10.2006 Skąd: Bydgoszcz Ostrzeżenie: (10%) ![]() ![]() |
Dzięki wielkie za odpowiedzi, zdecydowałem się na użycie interface'u.
Tylko oczywiście "znowu w życiu mi nie wyszło. Jak już ktoś zauważył metody różnych klas będą miały różne pola w bazie, no więc i różne parametry(mógłbym przyjmować tablice jako jeden parametr, ale nie widzę w tym większego sensu). Napisałem więc interface
W klasie jest np.
No i niestety wywala mi kominukat że deklaracja musi być zgodna z interface'm Jeśli w interface będzie
To oczywiście nie ma problemu. Ale ja nie mogę jasno orkęslić jakie to będą paramerty(chyba, że jak pisałem tablica). Mógłbym napisać abstrakcyjną klasę, no ale jak mówiłem zdecydowałem się na interface, po waszych wypowiedziach doszedłem do wniosku, że w moim przypadku to będzie lepsze. Ten post edytował szczurek 8.01.2007, 10:39:47 |
|
|
![]()
Post
#10
|
|
Grupa: Przyjaciele php.pl Postów: 5 724 Pomógł: 259 Dołączył: 13.04.2004 Skąd: N/A Ostrzeżenie: (0%) ![]() ![]() |
W twoim przypadku wspolny interfejs Dodaj(...) jest nieprzydatny bo nie jest wspolny (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) kazda klasa musi u ciebie miec inna liste parametrow, a zadeklarowanie tych metod jako interfejs nic nowego nie wnosi.
Mozesz np zrobic tak (jak jest np w RoR), wzorzec ActiveRecord:
i dopisz do tego implementacje |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 59 Pomógł: 0 Dołączył: 1.10.2006 Skąd: Bydgoszcz Ostrzeżenie: (10%) ![]() ![]() |
Dzięki wielkie, pozdrawiam.
|
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 898 Pomógł: 48 Dołączył: 2.11.2005 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Musisz zadać sobie pytanie: "po co ja chcę to zrobić". Użycie interfejsu ma sens jeśli chcesz ujednolicić interfejs - jeśli natomiast to nie jest Twoim celem to jest to używanie mechanizmów obiektowych "na siłę".
Wspólny interfejs jest po to aby potem np. pisać metody, które jako parametr mogą brać obiekty implementujące dany interfejs np.
W twoim wypadku, jeśli każda metoda bierze inne parametry trudno będzie pisać taki kod, bo w zasadzie nic poza nazwą nie jest wspólne. Tak jak pisałem wcześniej i to co pisze dr_bonzo - możesz zastosować wzorzec ActiveRecord - ale napisanie dobrej klasy tego typu jest dość trudne. Może popatrz jak robili to inni. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 3.10.2025 - 12:43 |