Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> metody i ich przeznaczenie
bliitz
post
Post #1





Grupa: Zarejestrowani
Postów: 155
Pomógł: 12
Dołączył: 5.04.2008

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


Witam

Mam pytanie odnośnie zasady tworzenia metod w klasach, przykładowo mamy następujący scenariusz. Tworzymy klasę Artykuły a w niej metody ( lub metodę ? ) odpowiedzialną(e) za pobranie wszystkich artykułów oraz tylko jednego artykułu.
Teraz moje pytanie czy lepiej stworzyć dwie metody np:
  1. get_article( $id )
  2. {
  3.  
  4. }
  5.  
  6. all_article()
  7. {
  8.  
  9. }


Czy może stworzyć jedną metodę, która w zależności od wystąpenia określonego parametru pobierze wszystkie artykuły bądź tylko jeden, np:

  1. articles( $all = NULL )
  2. {
  3.  
  4. }


Który z przedstawionych scenariuszy jest zgodny z kanonem programowania OOP, czy może jest na to jeszcze inny sposób?


--------------------
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 14)
erix
post
Post #2





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Skoro masz klasę odpowiedzialną za artykuły, to dlaczego do nazw metod dodajesz sufiks niepotrzebnie opisujący obiekt? winksmiley.jpg Skoro to obiekt-metoda, to wiadomo do czego ta ostatnia się odnosi.

IMHO lepiej zrobić dwie metody; bardziej intuicyjne w późniejszej obsłudze.


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
dr4ko
post
Post #3





Grupa: Zarejestrowani
Postów: 49
Pomógł: 4
Dołączył: 16.07.2008
Skąd: Gdańsk

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


Poprawnym podejściem jest utworzenie dwóch klas ArticlesCollection i Article, metody get_article i get_all powinny się znajdować w ArticlesCollection i zwracać obiekty Article.


--------------------
devFactor
Go to the top of the page
+Quote Post
bliitz
post
Post #4





Grupa: Zarejestrowani
Postów: 155
Pomógł: 12
Dołączył: 5.04.2008

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


co do nazw dzięki za wskazówkę smile.gif
natomiast w przypadku metod, jeśli różnią się tylko przykładowo warunkiem WHERE id=xxx, to pisanie 2 metod nie jest produkowaniem zbędnych linijek kodu?


--------------------
Go to the top of the page
+Quote Post
skowron-line
post
Post #5





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

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


Cytat(bliitz @ 22.12.2009, 12:08:21 ) *
co do nazw dzięki za wskazówkę smile.gif
natomiast w przypadku metod, jeśli różnią się tylko przykładowo warunkiem WHERE id=xxx, to pisanie 2 metod nie jest produkowaniem zbędnych linijek kodu?


Możesz sobie utworzyć metodę chronioną do której będziesz tylko przekazywał warunek jako parametr.


--------------------
I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy.

QueryBuilder, Mootools.net, bbcradio1::MistaJam
http://www.phpbench.com/
Go to the top of the page
+Quote Post
erix
post
Post #6





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
i get_all powinny się znajdować w ArticlesCollection i zwracać obiekty Article.

No dla mnie, to jest raczej przesada... Nie chodzi o sens logiczny, tylko wydajnościowy. IMHO lepiej jest w takiej sytuacji połączyć klasę kolekcji z artykułem; są Iteratory, to trzeba z nich korzystać.

Może i sieję herezje, ale co za dużo, to niezdrowo.


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
zzeus
post
Post #7





Grupa: Zarejestrowani
Postów: 441
Pomógł: 71
Dołączył: 3.09.2007
Skąd: wrocław

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


Cytat(erix @ 22.12.2009, 12:12:26 ) *
No dla mnie, to jest raczej przesada... Nie chodzi o sens logiczny, tylko wydajnościowy. IMHO lepiej jest w takiej sytuacji połączyć klasę kolekcji z artykułem; są Iteratory, to trzeba z nich korzystać.

Może i sieję herezje, ale co za dużo, to niezdrowo.


Z czego będzie wynikać poprawa wydajności przy zastosowaniu kolekcji, skoro klasa kolekcji też utworzy x obiektów klasy Article i będzie je przechowywać w swojej strukturze ?


--------------------
Go to the top of the page
+Quote Post
erix
post
Post #8





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Ano w tym, że implementujesz w jednej klasie dwa interfejsy - ArrayAccess i Iterator. Masz jedną klasę zamiast n-dziesięciu.


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
bliitz
post
Post #9





Grupa: Zarejestrowani
Postów: 155
Pomógł: 12
Dołączył: 5.04.2008

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


zakładam, że stosowanie klasy kolekcji w przypadku gdy klasa tylko dodaje, edytuje i wyświetla artykuły jest troche jak strzelanie z armaty do komara?


--------------------
Go to the top of the page
+Quote Post
zzeus
post
Post #10





Grupa: Zarejestrowani
Postów: 441
Pomógł: 71
Dołączył: 3.09.2007
Skąd: wrocław

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


Nie zrozumiałem poprzednio, zamiast klas ArticleCollection i Article jedna klasa Article z implementacją ArrayAccess i Iterator. Tylko wówczas obiekt tej jednej klasy może być używany w dwóch różnych kontekstach, jako obiekt i kolekcja obiektów, to może prowadzić do błędów i lekkiego bałaganu, czy w związku z tym nie lepiej jednak rozdzielić to na dwie klasy ?

Cytat(bliitz @ 22.12.2009, 12:30:06 ) *
zakładam, że stosowanie klasy kolekcji w przypadku gdy klasa tylko dodaje, edytuje i wyświetla artykuły jest troche jak strzelanie z armaty do komara?

To prawda.

Ten post edytował zzeus 22.12.2009, 12:32:26


--------------------
Go to the top of the page
+Quote Post
dr4ko
post
Post #11





Grupa: Zarejestrowani
Postów: 49
Pomógł: 4
Dołączył: 16.07.2008
Skąd: Gdańsk

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


A umiecie przewidzieć że nie będą się pojawiać nowe funkcjonalności? Kiedyś popełniliśmy ten błąd i poszliśmy na skróty. Skończyło się na klasach mających po kilka tysięcy linii kodu.


--------------------
devFactor
Go to the top of the page
+Quote Post
erix
post
Post #12





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
to może prowadzić do błędów i lekkiego bałaganu

Bałaganu? Rozwijam podobne rozwiązanie już kilka miesięcy i wcale nie spowodowało to bałaganu... Błędów też nie ma, a to z tej racji, że metody wyszukiwania są po prostu metodami, odnoszenie się do danych bieżącego rekordu - przez tablicę, którą udostępnia ArrayAccess. Przesuwanie między obiektami - Iterator. Wszystko w jednej klasie i sobie radzi. smile.gif


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
zzeus
post
Post #13





Grupa: Zarejestrowani
Postów: 441
Pomógł: 71
Dołączył: 3.09.2007
Skąd: wrocław

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


Możesz jakąś przykładową klasę pokazać ?


--------------------
Go to the top of the page
+Quote Post
erix
post
Post #14





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Jak przykładową? Nie chce mi się teraz wycinać kodu, pokażę, jak mniej więcej z niej korzystam;
  1. $art = model('article')->getAll();
  2.  
  3. // ...
  4.  
  5. foreach($art as $a){
  6. echo $art['title'];
  7. }
  8.  
  9. $art['title'] = 'asdasd';
  10. $art->save();


Przesuwanie - funkcje iteratora (z których korzysta przecież foreach), odczyt danych z rekordu - offsetGet, zapis offsetSet.

Jeśli chodzi o filtrowanie, czy jakieś zaawansowane operacje, nikt nie zabroni przecież użyć dodatkowych metod (np. getCostam, która działa na wewnętrznym wskaźniku rekordu i zwraca, co trzeba). Jedna klasa abstrakcyjna, która odpowiada za I/O z bazy + dziecko, które przechowuje strukturę bazy i dodatkowe metody.

A filtry można przecież zrobić przeciążając metody iteratora z klasy abstrakcyjnej. winksmiley.jpg


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
LBO
post
Post #15





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

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


Po co doradzacie używanie kolekcji, gdy w 95% wystarczy zwykła tablica?

Rozumiem, gdyby w PHP były kolekcje generyczne, ale nie ma! Implementacja wyspecjalizowanych kolekcji to zwyczajnie więcej pisaniny. Jest to nieefektywna rada, raczej uprzykrzająca programiście życie.
Szczególnie gdy taką kolekcje można stworzyć w razie prawdziwej, podyktowanej nowymi wymaganiami, potrzeby i zrobić to praktycznie przezroczyście implementując ArrayAccess.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 00:27