![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 16.11.2012 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Witajcie ponownie!
Tym razem, w ramach rozbudowy firmowego bloga, chcielibyśmy podzielić się bardzo prostą, ale równie użyteczną klasą pozwalającą na wygodną obsługę parametrów funkcji, które zanadto się "rozrosły". Przykładowo, przypuśćmy że mamy taką oto funkcję/metodę:
Aby ją wywołać, zamierzając zmienić np. tylko jeden domyślny parametr timeout, musimy przebrnąć przez wszystkie parametry:
Prosiłoby się użycie rozwiązania znanego z JavaScript, gdzie wystarczy przekazać jako jedyny parametr odpowiedni obiekt. Z pomocą przychodzi nasz klasa Params. Dzięki niej wywołanie ma postać:
Więcej o klasie i jej użyciu tutaj: http://www.implico.pl/klasa_params_wygodna...od_w_php,8.html P.S. Jeśli istnieje już podobne, być może lepsze rozwiązanie - dajcie znać. |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 142 Pomógł: 24 Dołączył: 30.03.2009 Skąd: Rokitno Szlacheckie Ostrzeżenie: (0%) ![]() ![]() |
w czym te rozwiązanie jest lepsze od ValueObject lub po prostu tablicy ?
|
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 16.11.2012 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Sądzę że zgrabniej i szybciej jest zapisać konstruktor klasy niż tworzyć nowy obiekt. Poza tym automatycznie obsługiwane są wymagane parametry i wartości domyślne, nie trzeba powielać kodu w każdej metodzie - patrz pełny opis na naszej stronie.
Ten post edytował implico 6.02.2013, 10:06:02 |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 4 298 Pomógł: 447 Dołączył: 16.11.2006 Ostrzeżenie: (0%) ![]() ![]() |
Takie coś też zapewni automatyczną zmianę parametrów
I nie potrzeba dodatkowej klasy. Kwestia przyzwyczajeń do budowy i zarządzania nimi ![]() -------------------- Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta). |
|
|
![]()
Post
#5
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Ale co tu oceniać? Dwie metody na krzyz: set i get... pierwszy lepszy średnio nierozgarniety programista coś takiego stworzy.
Jak już napisano: tablica wystarczy. Zaś ta klasa jedynie ułatwia przypisywanie domyślnych wartosci. Kontr klasa, zdecydowanie krótsza i moim zdaniem zdecydowanie bardziej wygodniejsza w użyciu
Korzystanie:
-------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 2 148 Pomógł: 230 Dołączył: 26.03.2008 Ostrzeżenie: (0%) ![]() ![]() |
Moim zdaniem cudowanie na siłę. Poczytajcie o zasadzie KISS i stosujcie się do niej. Taka klasa mogła by mieć sens dla funkcji, w której jest 30 parametrów, ale czy widzieliście kiedyś taką funkcję?
@nospor, twoja klasa sprawia, że wymaganie parametry tak naprawdę nie są wymagane, więc pozwolę sobie nanieść drobną modyfikację
Niestety tab mi nie działa w forumowym textarea ![]() -------------------- ET LINGUA EIUS LOQUETUR IUDICIUM
|
|
|
![]()
Post
#7
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
@pyro bo ja nie zakładałem, że coś jest wymagane. Jak chcesz takiego założenia, to musisz dodać czwarty parametry $required=false, bo tak Twoja poprawka teraz to wymusza na użytkowniku zawsze wymagalnośc parametru, a wcale tak być nie musi
![]() -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 2 148 Pomógł: 230 Dołączył: 26.03.2008 Ostrzeżenie: (0%) ![]() ![]() |
@pyro bo ja nie zakładałem, że coś jest wymagane. Jak chcesz takiego założenia, to musisz dodać czwarty parametry $required=false, bo tak Twoja poprawka teraz to wymusza na użytkowniku zawsze wymagalnośc parametru, a wcale tak być nie musi ![]() @nosporku, sama konstrukcja i pojęcie "funkcji" w programowaniu z założenia może mieć obowiązkowe lub opcjonalne parametry, więc wypadałoby to uwzględnić. Poza tym co wymusza? Nic nie wymusza
Poza tym jak już wspomniałem - według mnie w ogóle tworzenie takiej klasy to bezsens. No chyba, że używana jest funkcja z 30 parametrami, ale czy natknęliście się kiedyś na taką funkcję? Poza tym idąc dalej tokiem myślenia, klasę tą można przerobić tak, że nie trzeba podawać w metodzie Params::Get argumentu $params Ten post edytował pyro 6.02.2013, 13:09:18 -------------------- ET LINGUA EIUS LOQUETUR IUDICIUM
|
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 16.11.2012 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
@*!*: takie coś wcale nie zapewni żadnej automatycznej zamiany parametrów. Myślę że to aż nazbyt oczywiste, ale co w przypadku, jeśli chciałbyś zmienić jeden parametr? Znowu trzeba przepisywać pozostałe.
@nospor: "Ale co tu oceniać? Dwie metody na krzyz: set i get... pierwszy lepszy średnio nierozgarniety programista coś takiego stworzy." A jednak nikt z Was nie stworzył rozwiązania ekwiwalentnego, z obsługą parametrów wymaganych i sensowną obsługą wartości domyślnych. Zaproponowane przez Ciebie rozwiązanie w ogole nie obsługuje parametrow wymaganych i takie sprawdzenie, nawet po odpowiednich przeróbkach, nie jest możliwe bez odwołania się do zmiennej (trzeba zawsze sprawdzić jej wartość, inaczej klasa nie wykryje braku zmiennej wymaganej). Dodatkowo chcąc odwołać się dwukrotnie do zmiennej o wartosci domyślnej, należałoby ją przedtem przypisać do jakiejś zmiennej, aby nie dublować kodu. Poza tym łatwiej odwołać się do np. $par->get('raz'), niż do Params::Get($params, 'raz'). @pyro: zapewniam Cię, że funkcja jest przydatna również nawet w przypadku 5 parametrów. Ciekawe, @nospor twierdzi że to parę metod na krzyż, z kolei Ty każesz stosować KISS (Keep It Simple, Stupid) - taki paradoks. Mimo wszystko sądzę, że rozwiązanie jest proste zarówno w obsłudze, jak w implementacji. Niestety Twoje rozwiązanie nie zapewnia obsługi parametrów wymaganych, a jedynie wymaga wprowadzenia parametru domyślnego. Raczej miałeś na myśli dodanie parametru, np. isRequired i sprawdzanie tego warunku w 7. linijce. Ale to również ma wadę - jak wspomniałem "takie sprawdzenie, nawet po odpowiednich przeróbkach, nie jest możliwe bez odwołania się do zmiennej (trzeba zawsze sprawdzić jej wartość)". Ogólnie chodziło o stworzenie EKWIWALENTU (czyli PEŁNEJ funkcjonalności) zapewniającej obsługę parametrów z uwzględnieniem wymagalności i wartości domyślnych, a nie proponowanych przez Was półśrodków. Proszę Was jeszcze o przemyślenie kwestii. |
|
|
![]()
Post
#10
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Cytat @nosporku, sama konstrukcja i pojęcie "funkcji" w programowaniu z założenia może mieć obowiązkowe lub opcjonalne parametry, więc wypadałoby to uwzględnić. Tak, tylko że ja nie widzę sensu tego uwzględniania ![]() Ale jak już chcesz uwględniać rób to dobrze. Nie możesz uwazac, ze dajac null w default to oznacza ze jest to parametr wymagany. A co jesli nie jest to parametr wymagany? jak bedzie to ok, jak nie bedzie to ok? Jak mam to zapisać? Dajac 0 zamiast null? No ale 0 moze byc wartoscią a nie oznaczeniem, ze parametr nie jest wymagany. Dlatego wlasnie pisze, ze trzeba dopisac jeszcze $required ![]() Cytat Zaproponowane przez Ciebie rozwiązanie w ogole nie obsługuje parametrow wymaganych Jak juz pisalem: wystarczy dopisac parametr $required. Ja tego nie zrobilem, bo uwazam to za totalnie zbędne.
-------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#11
|
|
![]() Grupa: Zarejestrowani Postów: 2 148 Pomógł: 230 Dołączył: 26.03.2008 Ostrzeżenie: (0%) ![]() ![]() |
Tak, tylko że ja nie widzę sensu tego uwzględniania ![]() Ale jak już chcesz uwględniać rób to dobrze. Nie możesz uwazac, ze dajac null w default to oznacza ze jest to parametr wymagany. A co jesli nie jest to parametr wymagany? jak bedzie to ok, jak nie bedzie to ok? Jak mam to zapisać? Dajac 0 zamiast null? No ale 0 moze byc wartoscią a nie oznaczeniem, ze parametr nie jest wymagany. Dlatego wlasnie pisze, ze trzeba dopisac jeszcze $required ![]() Tak, ale to już zresztą zaznaczyłem: Cytat(pyro) // problem może być dla funkcji w której wartość domyślna ma być NULL, ale na to też jest rozwiązanie. Można przypisać $default jakąś konfiguracyjną daną i potem po niej sprawdzać albo jak już wspomniałeś, dodać parametr $isRequired. -------------------- ET LINGUA EIUS LOQUETUR IUDICIUM
|
|
|
![]()
Post
#12
|
|
![]() Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 16.11.2012 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
@pyro: Niestety, chyba nie do końca rozumiesz ideę klasy nospora.
"Params::Get($params, 'name1'); // wymagany parametr" Zawsze zwróci błąd. |
|
|
![]()
Post
#13
|
|
![]() Grupa: Zarejestrowani Postów: 2 148 Pomógł: 230 Dołączył: 26.03.2008 Ostrzeżenie: (0%) ![]() ![]() |
Może gdzieś popełniłem błąd, bo nie jestem u siebie i nie mam gdzie tego sprawdzić, ale według mnie:
Nie zwróci błędu. @pyro: zapewniam Cię, że funkcja jest przydatna również nawet w przypadku 5 parametrów. Ciekawe, @nospor twierdzi że to parę metod na krzyż, z kolei Ty każesz stosować KISS (Keep It Simple, Stupid) Zasada KISS dotyczy nie tylko uproszczania niezbędnego kodu, ale także pozbycia się nadmiernego, zbędnego kodu. Niestety Twoje rozwiązanie nie zapewnia obsługi parametrów wymaganych, a jedynie wymaga wprowadzenia parametru domyślnego. Nie wymaga, bo dla parametrów obowiązkowych zanim jest sprawdzane wartości domyślnej wywoływane jest return. @pyro: zapewniam Cię, że funkcja jest przydatna również nawet w przypadku 5 parametrów. Ciekawe, @nospor twierdzi że to parę metod na krzyż, z kolei Ty każesz stosować KISS (Keep It Simple, Stupid) - taki paradoks. Mimo wszystko sądzę, że rozwiązanie jest proste zarówno w obsłudze, jak w implementacji. Niestety nie wziąłeś pod uwagę np. dokumentacji, bo IDE zazwyczaj mają podpowiadanie parametrów dla user-made functions, a przy takim rozwiązaniu dla stworzonej funkcji jedyne co może się pokazać to... Cytat array $params - a list of parameters for the function W dużych projektach takie coś jest naprawdę problematyczne. Ten post edytował pyro 6.02.2013, 13:25:03 -------------------- ET LINGUA EIUS LOQUETUR IUDICIUM
|
|
|
![]()
Post
#14
|
|
![]() Grupa: Zarejestrowani Postów: 435 Pomógł: 40 Dołączył: 16.02.2003 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Czemu nie po prostu:
Bardzo często stosowane gdy np musimy przechowywać wiele "opcji" w klasie. -------------------- Linkedin | ...
|
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 6 380 Pomógł: 1116 Dołączył: 30.08.2006 Ostrzeżenie: (0%) ![]() ![]() |
Poza tym można też po prostu http://php.net/manual/en/function.func-get-args.php. A to tutaj przedstawione to przecież zwykły rejestr.
-------------------- |
|
|
![]()
Post
#16
|
|
![]() Grupa: Zarejestrowani Postów: 273 Pomógł: 52 Dołączył: 3.02.2013 Skąd: Przemyśl Ostrzeżenie: (0%) ![]() ![]() |
Moim zdaniem już samo pisanie tak wieloparametrowych funkcji/metod jest złą praktyką
A tworzenie "hooków", aby sobie to ułatwić to już całkiem herezje Jeśli funkcja zaczyna posiadać sporą ilość parametrów to pierwszy sygnał, aby zadać sobie pytanie czy to nie jest odpowiedni moment, aby utworzyć klasę zamiast pisać kolejne i kolejne parametry . Takie wieloparametrowe funkcje w większości (nie zawsze) są już tak rozbudowane, że spokojnie mogą stać się jakimś osobnym libem A jeżeli już to zazwyczaj projektuje się funkcje/metody w taki sposób, aby móc łatwo zarządzać ich parametrami Przykładowo dlaczego flagi true/false są parametrami przed integerem który na pewno będzie używany częściej niż wspomniane flagi, które z kolei w 90% mogą mieć wartość domyślną ? Ten post edytował mstraczkowski 13.02.2013, 03:47:05 -------------------- Jeżeli moja wypowiedź Ci pomogła użyj przycisku
![]() |
|
|
![]()
Post
#17
|
|
![]() Grupa: Zarejestrowani Postów: 142 Pomógł: 24 Dołączył: 30.03.2009 Skąd: Rokitno Szlacheckie Ostrzeżenie: (0%) ![]() ![]() |
@mstraczkowski: mówisz o pisaniu klasy, ale co w przypadku gdy konstruktor przyjmuje pierdyliard parametrów? W tedy tylko tablica lub ValueObject
|
|
|
![]()
Post
#18
|
|
![]() Grupa: Zarejestrowani Postów: 2 148 Pomógł: 230 Dołączył: 26.03.2008 Ostrzeżenie: (0%) ![]() ![]() |
@mstraczkowski: mówisz o pisaniu klasy, ale co w przypadku gdy konstruktor przyjmuje pierdyliard parametrów? W tedy tylko tablica lub ValueObject Jeżeli konstruktor przyjmuje pierdyliard parametrów, to w 99% przypadków jest to zły konstruktor. -------------------- ET LINGUA EIUS LOQUETUR IUDICIUM
|
|
|
![]()
Post
#19
|
|
![]() Grupa: Zarejestrowani Postów: 142 Pomógł: 24 Dołączył: 30.03.2009 Skąd: Rokitno Szlacheckie Ostrzeżenie: (0%) ![]() ![]() |
zawsze można potem użyć kilkunastu setterów, ale za sto konstruktor nie będzie musiał przyjmować parametrów.
|
|
|
![]()
Post
#20
|
|
![]() Grupa: Zarejestrowani Postów: 273 Pomógł: 52 Dołączył: 3.02.2013 Skąd: Przemyśl Ostrzeżenie: (0%) ![]() ![]() |
Konstruktor nie służy do ustawiania nie wiadomo jakiej konfiguracji klasy.
Konstruktor powinien przyjmować tylko parametry, które są niezbędne do utworzenia obiektu danej klasy. Całą resztę można rozwiązać za pomocą setterów, getterów, właściwości (jeżeli ustawiania mają być elastyczne) lub stałe klasy (jeżeli ustawienia klasy są sztywne) Jeżeli istnieje coś co musi zostać podane zawsze przy tworzeniu obiektu (aby klasa mogła prawidłowo funkcjonować), to wtedy powinno to stać się parametrem konstruktora. Po to, aby w każdej innej metodzie nie sprawdzać czy ktoś za pomocą settera to ustawił i nie rzucać mu wyjątku. Jeżeli twoja klasa staje się rozbudowana i ilość setterów / getterów cię przerasta można pomyśleć o osobnej klasie konfiguracyjnej dla danej klasy. Tak jak przykładowo robi to HTML Purifier Przykładowo:
Ten post edytował mstraczkowski 13.02.2013, 12:45:51 -------------------- Jeżeli moja wypowiedź Ci pomogła użyj przycisku
![]() |
|
|
![]() ![]() |
![]() |
Aktualny czas: 22.08.2025 - 01:57 |