konto usunięte

Temat: przeciążenie funkcji

Tylko po co nam przeciążanie w języku dynamicznym ? Co najwyżej żeby zaoszczędzić parę linijek. Bierzmy pod uwagę że php daje nam możliwość:
~ wstawienia DOWOLNEJ ilości parametrów w metodzie ponad to co wpisaliśmy
~ pobranie ich, tak samo jak szybkie sprawdzenie ich ilości.
~ przekazanie parametrów dowolnego typu

Przykład:

<?php

class Foo {
public function bar() {
echo '<h5>Wstawiles '.func_num_args().' parametry. Lista parametrow:</h5>';
var_dump(func_get_args());
echo 'Zrob sobie z nimi co chcesz...<hr>';
}
}

$Foo = new Foo();
$Foo->bar('darek', 'marek');
$Foo->bar(102, 103, 105);
$Foo->bar(new Foo(), new Foo(), new Foo(), new Foo());
$Foo->bar('darek', 102, new Foo(), 'marek', 103, new Foo());


Wynik:

Obrazek


Więc w czym problem ? Czy wsadzimy jakiegoś ifa czy też napiszemy dodatkową metodę. Osobiście wolał bym mieć solidne przeciążanie ale można sobie poradzić spokojnie bez tego.
Bartłomiej Jończy

Bartłomiej Jończy iOS / Java EE
Developer

Temat: przeciążenie funkcji

Po co wkładać majtki przez głowę? Nie ma to nie ma. Po co kombinować? Zgadzam się z Darkiem, zmienna lista argumentów rozwiązuje problem w wystarczającym stopniu.

konto usunięte

Temat: przeciążenie funkcji

Bartłomiej Jończy:
Po co wkładać majtki przez głowę? Nie ma to nie ma. Po co kombinować? Zgadzam się z Darkiem, zmienna lista argumentów rozwiązuje problem w wystarczającym stopniu.

Nie mówiąc o tym że przeciążanie w innych językach powstało WŁAŚNIE DLATEGO że nie możemy w nich na ogół zmienić ilości oraz typu argumentów.

konto usunięte

Temat: przeciążenie funkcji

No i znowu się kłócicie bez sensu :D Przecież przeciążenie funkcji w PHP istnieje i jest dosyć proste: trzeba owej funkcji nawalić tyle roboty, że będzie już tak przeciążona, że więcej tej roboty już nie będzie w stanie wziąć na siebie :D
Marcin Staniszczak

Marcin Staniszczak Programista Python

Temat: przeciążenie funkcji

Zgadzam się z wami. Jednak nie do końca jest tak, że w językach z silnym typowaniem nie można użyć zmiennej liczby argumentów;-) Już w C była taka możliwość i oczywiście została w C++. Java tez daje taką możliwość (chociaż to jak dobrze pamiętam dopiero od wersji 5).
A co do parametrów nieokreślonego typu - to nie do końca to samo, ale w C często używało (używa) się wskaźnika na void, który wskazywał określone miejsce w pamięci, bez określenia typu;-)

konto usunięte

Temat: przeciążenie funkcji

Dariusz Półtorak:
Nie mówiąc o tym że przeciążanie w innych językach powstało WŁAŚNIE DLATEGO że nie możemy w nich na ogół zmienić ilości oraz typu argumentów.

Hmmm... z tego co pamiętam to w C++ jest va_list, za pomocą którego można z powodzeniem realizować zmienną ilość argumentów.

Kwestia teraz - który zapis jest czytelniejszy i przyjemniejszy w rozbudowie.
Joanna Siwiec-Matuszyk

Joanna Siwiec-Matuszyk programista PHP,
Python

Temat: przeciążenie funkcji

Paweł Białach:
przeciążanie nie kojarzy się dobrze i nie wiem czemu on się tak rechocze ;-)

Pewnie dlatego się rechocze, że masz w podpisie, że zajmujesz się PHP a jednocześnie nie rozumiesz co to jest przeciążenie. Douczyłabym się na Twoim miejscu zanim bym sobie takie coś w podpisie dała.

Przepraszam za szczerość, ale po Twoim poście razem z mężem rechoczemy.
Marcin Staniszczak

Marcin Staniszczak Programista Python

Temat: przeciążenie funkcji

Kwestia teraz - który zapis jest czytelniejszy i przyjemniejszy w rozbudowie.

Raczej przeciążenie;-) Tym bardziej, że większość IDE "fajniej" podpowiada parametry dla przeciążonych funkcji, szczególnie, że jednocześnie mamy silne typowanie, co dodatkowo pomaga w podpowiadaniu;-) Ale takie już ograniczenia języków z dynamicznym typowaniem i jeśli się ich używa trzeba się pogodzić i już;-)

konto usunięte

Temat: przeciążenie funkcji

Marcin Staniszczak:
Zgadzam się z wami. Jednak nie do końca jest tak, że w językach z silnym typowaniem nie można użyć zmiennej liczby argumentów;-) Już w C była taka możliwość i oczywiście została w C++. Java tez daje taką możliwość (chociaż to jak dobrze pamiętam dopiero od wersji 5).
A co do parametrów nieokreślonego typu - to nie do końca to samo, ale w C często używało (używa) się wskaźnika na void, który wskazywał określone miejsce w pamięci, bez określenia typu;-)

Tu się zgadzam ale sam raczej tej metody unikałem. Mając wskaźnik do void gubisz typ jak zwróciłeś uwagę. I w tym momencie masz troszkę więcej zmartwień na głowie. Poza tym jak ktoś już zwrócił uwagę, przy przeciążaniu IDE ładnie podpowiada parametry a samo rozwiązanie jest o wiele czytelniejsze.
Co do Javy to się nie wypowiadam. Nie pisałem w niej dość długo i sporo mi z głowy wypadło. Ostatnio do niej wróciłem gdyż zasiadłem do Androida. A jeszcze muszę troszkę literatury przewertować żeby przypomnieć sobie to i owo.

@Piotr Lewandowski, nikt nie mówił że musisz to robić w jednej metodzie. Stosujesz jakiegoś switcha albo ify i Twoja metoda którą "przeciążasz" jest wykorzystana tylko do odpalenia innych metod.

Właściwie jedyne co by dało dorzucenie solidnego przeciążania w PHP to poprawienie czytelności kodu. Ale znowu przeciążanie nie ma większego sensu ze względu na to że w parametrze jedyne co możemy wymusić to obiekt lub tablicę.

PS: Co do złego kojarzenia się słówka "przeciążać" to autor tematu mógł po prostu poczytac w google.Dariusz Półtorak edytował(a) ten post dnia 15.09.11 o godzinie 09:56
Marcin Staniszczak

Marcin Staniszczak Programista Python

Temat: przeciążenie funkcji

Tu się zgadzam ale sam raczej tej metody unikałem. Mając wskaźnik do void gubisz typ jak zwróciłeś uwagę. I w tym momencie masz troszkę więcej zmartwień na głowie.

I chyba właśnie dlatego w C++ pojawiły się szablony;-) Dzięki czemu pogodzony typowanie statyczne z elastycznością dynamicznego;-) I jeśli dobrze pamiętam, Stroustrup odradzał używania wskaźników na void. Ale to już mocno zbaczamy z tematu;-)

konto usunięte

Temat: przeciążenie funkcji

Dariusz Półtorak:
Właściwie jedyne co by dało dorzucenie solidnego przeciążania w PHP to poprawienie czytelności kodu. Ale znowu przeciążanie nie ma większego sensu ze względu na to że w parametrze jedyne co możemy wymusić to obiekt lub tablicę.

Jak to mówili starożytni grecy - bullshit.
Wymusić możesz tablicę, obiekt, interfejs, klasę obiektu i pewnie jeszcze coś co pominąłem.
Nie możesz string'a, inta, floata, boolean'a, z którymi problemu nie ma (int) 'bla bla' == 0 :)

Przeciążanie nie tylko poprawiło by czytelność ale i pracę z kodem.
Nie trzeba wtedy operować na dwóch metodach (wywołującej i "czyniącej") a jedynie na "czyniącej".

konto usunięte

Temat: przeciążenie funkcji

Michał Wachowski:
Dariusz Półtorak:
Właściwie jedyne co by dało dorzucenie solidnego przeciążania w PHP to poprawienie czytelności kodu. Ale znowu przeciążanie nie ma większego sensu ze względu na to że w parametrze jedyne co możemy wymusić to obiekt lub tablicę.

Jak to mówili starożytni grecy - bullshit.
Wymusić możesz tablicę, obiekt, interfejs, klasę obiektu i pewnie jeszcze coś co pominąłem.
Nie możesz string'a, inta, floata, boolean'a, z którymi problemu nie ma (int) 'bla bla' == 0 :)

Przeciążanie nie tylko poprawiło by czytelność ale i pracę z kodem.
Nie trzeba wtedy operować na dwóch metodach (wywołującej i "czyniącej") a jedynie na "czyniącej".

1. Klasa/intefejs, nie wyszczególniałem. Zresztą powinienem napisać klasa a nie obiekt...
2. Tablica

Przecież to napisałem. Więc czemu mówisz "bullshit". Nie możesz wymusić stringa, inta, floata, boolean itp. Sam to napisałeś.
To teraz mi proszę Michale wytłumacz. JAK miało by działać przeciążanie w takim wypadku:


public function add($a, $b) {
// troszkę kodu który łączy 2 ciągi znaków
}

public function add($a, $b) {
// troszkę kodu który dodaje 2 liczby CAŁKOWITE
}


1. PHP NIE JEST W STANIE określić którą z tych metod chcę wywołać bo nic na to nie wskazuje. Chyba że by jakoś badał kod metody i "zgadywał". Równie dobrze może wróżyć z fusów.
2. PHP NIE JEST W STANIE zapobiec przekazaniu np 2 obiektów albo 2 wartości zmiennoprzecinkowych itp w tym wypadku. Mogę ? Mogę i przejdzie.
3. Co mi da w tym wypadku "(int)tra la la la" ?? Walidację wewnątrz. Gdzie nie była by ona potrzebna gdybym typy proste mogły być wymuszane w parametrach metod tak jak to jest z klasą, interfejsem i tablicą.

Także wytłumacz mi jak wg Ciebie PHP powinien zdecydować którą metodę ma wykonać na podstawie parametrów gdybyśmy tam zaimplementowali normalne przeciążanie ? Mówisz "bullshit" więc zakładam że wiesz.Dariusz Półtorak edytował(a) ten post dnia 15.09.11 o godzinie 10:25
Jarek W.

Jarek W. Software Engineer

Temat: przeciążenie funkcji

Kurcze, jaka dyskusja na temat rzeczy, których nie ma. Lepiej niż w tv. ;-)
To co, może pogadamy teraz o UFO albo duchach? Istnieją czy nie? ;-D

konto usunięte

Temat: przeciążenie funkcji

.Paweł Koch edytował(a) ten post dnia 18.04.12 o godzinie 15:48

konto usunięte

Temat: przeciążenie funkcji

Jarek W.:
Kurcze, jaka dyskusja na temat rzeczy, których nie ma. Lepiej niż w tv. ;-)
To co, może pogadamy teraz o UFO albo duchach? Istnieją czy nie? ;-D

Popcorn już mam, kto skoczy po piwo ? :P
Marcin Staniszczak

Marcin Staniszczak Programista Python

Temat: przeciążenie funkcji

Ciechanek może być? :D

konto usunięte

Temat: przeciążenie funkcji

Co jest panowie i panie. Nigdy w życiu nie rozmyślaliście albo dyskutowali nad "co by było gdyby" ? :P

// edit - uzupełniłem o panie skoro dzisiaj w dyskusji towarzyszy nam przedstawicielka płci... zaraz... to dyskryminacja... zamienić panowie i panie na "dyskutantów" ? Tak po europejsku :PDariusz Półtorak edytował(a) ten post dnia 15.09.11 o godzinie 10:43

konto usunięte

Temat: przeciążenie funkcji

Dariusz Półtorak:
Co jest panowie i panie. Nigdy w życiu nie rozmyślaliście albo dyskutowali nad "co by było gdyby" ? :P

// edit - uzupełniłem o panie skoro dzisiaj w dyskusji towarzyszy nam przedstawicielka płci... zaraz... to dyskryminacja... zamienić panowie i panie na "dyskutantów" ? Tak po europejsku :P

nie bądź taki poprawny politycznie, to się zawsze źle kończy - spójrz na takich Brytyjczyków, tam Pakistańczyk może zrobić komuś kuku i boją się go zatrzymać bo to niepoprawne politycznie

konto usunięte

Temat: przeciążenie funkcji

Przemysław R.:
Dariusz Półtorak:
Co jest panowie i panie. Nigdy w życiu nie rozmyślaliście albo dyskutowali nad "co by było gdyby" ? :P

// edit - uzupełniłem o panie skoro dzisiaj w dyskusji towarzyszy nam przedstawicielka płci... zaraz... to dyskryminacja... zamienić panowie i panie na "dyskutantów" ? Tak po europejsku :P

nie bądź taki poprawny politycznie, to się zawsze źle kończy - spójrz na takich Brytyjczyków, tam Pakistańczyk może zrobić komuś kuku i boją się go zatrzymać bo to niepoprawne politycznie

Ja się dowiedziałem z wykopu ostatnio ze oni na listę homofobów i rasistów małe dzieci wpisują. Więc może w tym co mówisz jest troszkę racji :P

konto usunięte

Temat: przeciążenie funkcji

Dariusz Półtorak:

1. Klasa/intefejs, nie wyszczególniałem. Zresztą powinienem napisać klasa a nie obiekt...

Możesz zrobić takie coś:

function foo(Object $a) { ... }

foo(new stdClass); // error
foo( (object) array('aaa')) // ok


Jak miało by działać?
Od najbardziej rygorystycznych do najbardziej ogólnych definicji.

Jak już mamy się zamieniać w czepialskie fiutki, to funkcja add dla stringów ma złą nazwę, nie dodajesz a łączysz. :)



Wyślij zaproszenie do