![]() |
![]() |
![]() ![]()
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:
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:
Który z przedstawionych scenariuszy jest zgodny z kanonem programowania OOP, czy może jest na to jeszcze inny sposób? -------------------- |
|
|
![]() |
![]()
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?
![]() 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! |
|
|
![]()
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
|
|
|
![]()
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ę
![]() 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? -------------------- |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 4 340 Pomógł: 542 Dołączył: 15.01.2006 Skąd: Olsztyn/Warszawa Ostrzeżenie: (0%) ![]() ![]() |
co do nazw dzięki za wskazówkę ![]() 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/ |
|
|
![]()
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! |
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 441 Pomógł: 71 Dołączył: 3.09.2007 Skąd: wrocław Ostrzeżenie: (0%) ![]() ![]() |
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 ? -------------------- |
|
|
![]()
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! |
|
|
![]()
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?
-------------------- |
|
|
![]()
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 ?
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 -------------------- |
|
|
![]()
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
|
|
|
![]()
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. ![]() -------------------- ![]() 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! |
|
|
![]()
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ć ?
-------------------- |
|
|
![]()
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;
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. ![]() -------------------- ![]() 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! |
|
|
![]()
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. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 20.08.2025 - 00:27 |