Tomasz Jędrzejewski

Tomasz Jędrzejewski Student, Akademia
Górniczo-Hutnicza
im. Stanisława
Staszi...

Temat: Wady vs Zalety OPT

1. ... a nazwa tej zasady wywodzi się od łacińskiej sentencji, która w dosłownym tłumaczeniu brzmi... "dziel i rządź". Rozumiem, że Ty możesz sobie na poczekaniu wymyślać nieistniejące zasady oraz powoływać się na nie, i mieć pretensje do wszystkich, że czegoś nie wiesz, ale mi to już nie wolno lekko sparafrazować nazwy?

Zresztą dobra, twierdzisz, że obowiązuje niepisana zasada "jedna klasa - jeden plik". OK, to przyjmij też do wiadomości, że od pewnego czasu obowiązuje też niepisana zasada korzystania z autoloaderów, a celem ułatwienia tego nawet od pewnego czasu istnieje standard regulujący nazewnictwo klas, do którego "ten zły OPT" został w wersji 2.1 już jakiś czas temu dostosowany.

2. Mam tę książkę i nie uważam jej za jakieś wybitne dzieło. Pierwszy lepszy człowiek może siąść i coś napisać, a to, że to wydrukowano, nie świadczy jeszcze o tym, że są tam prawdy objawione. Zresztą, nie przyszedłem tu kłócić się z autorem książki. Przytoczyłeś argumenty, podpisałeś się osobiście pod nimi, więc broń ich osobiście. Jesteś programistą czy papużką powtarzającą po innych różne stwierdzenia bez głębszego ich zrozumienia? Jeśli masz coś przeciwko, to może sam przedstaw swoje wywody o rekurencji nie mnie, a np. Thomasowi Cormenowi, twórcom języków funkcyjnych oraz naukowcom prowadzącym nad nimi badania?

Wojciech Małota, Waldemar Jonik -> skoro gołe PHP jest takie dobre, to dlaczego każdy framework udostępnia co najmniej kilkadziesiąt obiektowych helperów i różnych nadbudówek?
Artur Świerc

Artur Świerc Programista PHP/Java

Temat: Wady vs Zalety OPT

Tomasz Jędrzejewski:
Wojciech Małota, Waldemar Jonik -> skoro gołe PHP jest takie dobre, to dlaczego każdy framework udostępnia co najmniej kilkadziesiąt obiektowych helperów i różnych nadbudówek?

To nie jest dobry przykład, helpery można pisać wszędzie, żeby nie powielać kodu. Koledzy mieli na myśli to, o czym sam pisałeś w swoim poprzednim poście - zacytuję:

"Smartym złe jest przede wszystkim to, że tam cała machineria służy tylko po to, by zamieniać if na if oraz foreach na foreach, nie rozwiązując żadnych problemów PHP i jedynie produkując nowe"

Po co pisać bajpasy, skoro można napisać to samo bez dodatkowej warstwy w gołym php. Jeśli OPT działa inaczej to chętnie się zapoznam z tym systemem szablonów :)Artur Świerc edytował(a) ten post dnia 04.09.10 o godzinie 09:16
Jakub L.

Jakub L. Programista

Temat: Wady vs Zalety OPT

Tomasz Jędrzejewski:
Ad. rekurencji -> wymienione przez Ciebie problemy nie mają nic wspólnego z rekurencją jako taką. To samo może spotkać Cię w każdym innym algorytmie, jeśli popełnisz błąd. Rekurencja jest podstawą funkcyjnych języków programowania, gdzie w ogóle nie istnieje coś takiego, jak pętla.

Ale w PHP istnieje coś takiego jak pętla.
Dodatkowo mocno wątpię czy PHP obsługuje rekurencję ogonową, więc drugie imię rekurencji w PHP to przepełnienie stosu, i cała jej dalsza obrona jak to miliony much... jest pozbawiona sensu.
To, że algorytm X jest wolny, jest raczej winą algorytmu, a nie tego, że korzysta on z rekurencji. Najszybszy algorytm sortowania jest algorytmem rekurencyjnym.

Kubełkowy
Ogólnie to, co jest w poście Przemka o rekurencji napisane, to jedna wielka > informatyczna herezja. Rekurencja jako narzędzie ma o wiele większą siłę
ekspresji, niż zwykłe pętle (każdą pętlę da się bez problemu zamienić na
rekurencję, nie każdą rekurencję da się bez problemu zamienić na pętlę),

Przykład takiej co to się nie da?

[...]
Z czym związana jest obecność rekurencji w OPT? Otóż podczas kompilacji szablonu budowane jest najzwyklejsze w świecie drzewo węzłów XML-owych, a jak już wiemy, do chodzenia po drzewie z zachowaniem hierarchii potrzebna jest jakaś forma rekurencji. Nie

Wcale nie.
Liniowy parser który zgłasza zdarzenia początku i końca taga przez handlery, a tagi trzymane na stosie powiązanym z handlerami a nie z samym parserem.
Prawie jak rekurencja, ale prawie robi wielką różnicę.
wiem, jak sobie, drogi Przemku, wyobrażasz poprawne przetworzenie poszczególnych elementów bez niej? Mam nadzieję, że zdajesz

Nie wiem jak on, ale ja jak powżej.

[...]
Najprawdopodobniej jest trochę miejsc w kodzie, które można zrobić optymalniej i tym się m.in. zajmuję, ale to nie stanie

Przymiotnik optymalny się nie stopniuje.

Temat: Wady vs Zalety OPT

Jakub L.:
To, że algorytm X jest wolny, jest raczej winą algorytmu, a nie tego, że korzysta on z rekurencji. Najszybszy algorytm sortowania jest algorytmem rekurencyjnym.

Kubełkowy

Nieprawda :-). Istnieje algorytm, który pozwala posortować dowolną liczbę elementów w czasie stałym (!!!). Jest jeden mankament... trzeba mieć n^2 procesorów :DWojciech Małota edytował(a) ten post dnia 04.09.10 o godzinie 11:50
Tomasz Jędrzejewski

Tomasz Jędrzejewski Student, Akademia
Górniczo-Hutnicza
im. Stanisława
Staszi...

Temat: Wady vs Zalety OPT

Jakub L. -> wiem, że w PHP istnieje pętla, ale niektóre problemy są ze swojej natury rekurencyjne i nic na to nie poradzę. Pytasz o przykład takich algorytmów:
- przechodzenie po drzewach z zachowaniem hierarchii.
- algorytm BFS/DFS.

Choćbyś nie wiem, co robił, nie zaimplementujesz ich za pomocą samej pętli, gdyż są one ze swej natury rekurencyjne. Rekurencję można emulować przy pomocy pętli, ale w ogólnym przypadku zawsze będzie Ci potrzebna do niej jakaś dodatkowa struktura danych (najczęściej stos, choć czasem da się użyć kolejkę), bo takie są prawa natury i tyle.

Ponadto - pisałem już o tym wcześniej - OPT nie używa jawnej rekurencji, ale ją emuluje właśnie przy pomocy pętli + SplQueue/SplStack, zatem przepełnienie stosu PHP może zajść tylko wtedy, gdy to Twój skrypt najpierw zajął cały, a później wywołał OPT :P.

Jedyne miejsce, gdzie jest jawna rekurencja, to instrukcja opt:root include, która była dodawana jako rozwiązanie tymczasowe w końcowej fazie rozwoju i nie chciałem robić już rozpierduchy w głównym algorytmie kompilatora, narażając się na błędy. Jednak zostało to naprawione w wersji OPT 2.1.

Jeśli chodzi o Twój przykład, to jest to dla mnie normalna rekurencja, tyle że emulowana... dokładnie tak, jak to robi OPT i tak, jak opisałem powyżej. Chyba że się umówimy, że takie coś nie jest rekurencją, ale wtedy w OPT także nie ma rekurencyjnych algorytmów poza tym jednym przypadkiem opisanym powyżej.

OPT nie może działać poprzez zwykłe zgłaszanie początku i końca znacznika z prostego powodu: instrukcje OPT nie wykonują jedynie prymitywnego podpinania kawałków kodu PHP pod znaczniki, ale często potrzebują też pomanipulować trochę strukturą drzewa.

Artur Świerc -> dokładnie, właśnie o to chodzi, że Open Power Template działa inaczej. 90% kodu kompilatora powstało właśnie po to, byś mógł po prostu powiedzieć w szablonie co chcesz uzyskać, a nie jak to ma działać oraz by Twój szablon był maksymalnie przenośny między projektami, a nawet językami programowania. Owszem, w szablonie są dostępne instrukcje opt:if, opt:foreach czy opt:for, ale może poza pierwszą się praktycznie do niczego nie przydają. Mój zamysł opiszę na przykładzie:

Przypuśćmy, że chcesz wyświetlić dwie zagnieżdżone listy. W PHP i Smartym zrobisz po prostu zagnieżdżone pętle foreach. Jednak jest pewien problem, bo musisz samodzielnie poinformować PHP/Smarty, że lista zagnieżdżona ma brać dane z elementu listy nadrzędnej, a co więcej - musisz dokładnie i samodzielnie zakodować takie połączenie. Nie jest to może trudne, ale jak takich list masz do napisania 100, albo musisz później szablon przerobić/skopiować to w inne miejsce, będziesz się ciął, zwłaszcza gdy się okaże, że w tym innym miejscu programista zapodaje szablonowi dane o nieco innej strukturze.

W Open Power Template masz instrukcję opt:section, która jest rodzajem inteligentnej pętli. I jedyne co musisz zrobić, to umieścić jedną taką instrukcję w drugiej:

<opt:section name="nadrzedna">
{$nadrzedna.info}
<opt:section name="podrzedna">
{$podrzedna.info}
</opt:section>
</opt:section>


OPT sam się "domyśli", że te sekcje mają być połączone, a co więcej - wie, jak je połączyć za Ciebie, i to na więcej niż jeden sposób. Te "sposoby" nazywają się formatami danych, które wybierasz po stronie skryptu, po prostu podając, którego z nich chcesz użyć. Jeśli będziesz robić kiedyś refaktoring i stwierdzisz, że lista elementów zamiast obiektem, ma być tablicą i to połączoną na inny sposób, wtedy zmieniasz format danych i rekompilujesz szablon bez zmiany ani jednej linijki kodu. Jeśli nie chcesz łączyć sekcji, albo chcesz ją połączyć z inną niż domyślna, masz atrybut parent, który pozwala Ci to zrobić, w dalszym ciągu ukrywając szczegóły implementacyjne.

Co więcej, ponieważ nie zajmujesz się szczegółami implementacyjnymi w szablonie, OPT może Ci je dodatkowo zoptymalizować tak, jak nie zrobiłbyś tego w czystym PHP ze względu na konieczność zachowania czytelności kodu. I to robi - opt:section iterujący po tablicy jest szybszy, niż foreach w PHP.

Inny przykład: rendering mapy serwisu. W czystym PHP albo musisz sam bawić się w rekurencyjny algorytm, emulować rekurencję lub korzystać z ciężkich obiektowych helperów. W OPT robisz:

<opt:tree name="map">
<opt:list><ul> <opt:content /> </ul></opt:list>
<opt:node><li><a href="parse:$map.url">{$map.title}</a> <opt:content /> </opt:node>
</opt:tree>


Parę linijek i pełna kontrola nad wyglądem listy w naturalny sposób, a OPT już sam zadba nie tylko o to, by z tego faktycznie renderowało się drzewo, ale żeby renderowało się w sposób optymalny.

Takich rzeczy jest dużo więcej (np. wbudowany mechanizm renderingu formularzy - komponenty), a w wersji 2.1 zrobiłem rewolucję nawet w instrukcjach warunkowych, które potrafią teraz dużo więcej, niż zwykły if oraz switch z PHP. Prosty przykład:

<opt:if>
<opt:condition test="$foo eq 1"> condition 1 </opt:condition>
<opt:condition test="$foo is either 2 or 6"> condition 2</opt:if>
<p>Wasz PHP tego nie potrafi</p>
<opt:condition test="$foo is between 3 and 5"> condition 3</opt:condition>
</opt:if>


Inny przykład: mamy szablon wyświetlający informacje o profilu, ale problem jest taki, że w serwisie jest 5 typów profili i niektóre informacje się różnią. Aby było śmieszniej, ostatni z wyświetlanych elementów musi mieć doklejoną klasę CSS "last". Można skopiować to samo 5 razy i dostosować, ale później musisz pamiętać, by coś poprawiać w kilku miejscach naraz. Można też obudować wszystko ifami, co nie jest czytelne. A można też użyć opt:switch. Takie coś będzie możliwe już niebawem w OPT 2.1 (w trakcie implementacji):

<opt:switch test="$user.type">
<!-- drogi OPT, masz dokleić ten atrybut do ostatniego elementu, jaki faktycznie bedzie wyswietlany -->
<opt:prepend to="last"><opt:attribute name="str:class" value="str:last" /></opt:prepend>

<li>Name: {$user.name}</li>
<li opt:condition="@value eq 1">Age: {$user.age}</li>
<li opt:condition="@value is either 2 or 3">Points: {$user.points}</li>
<li>Something else: {$user.something}</li>
<li opt:condition="@value is 2">Stuff: {$user.stuff}</li>
</opt:switch>


Dodatkowo, ponieważ szablony są dokumentami XML, mamy na dzień dobry sprawdzenie poprawności kodu HTML pod względem składniowym.

To jest zamysł stojący za tworzeniem OPT. Również uważam, że tworzenie nowego języka szablonów tylko po to, by zamieniać if na if i foreach na foreach nie ma absolutnie żadnego sensu. Dlatego w języku OPT staram się zaprezentować zupełnie inną filozofię projektowania szablonów i wykorzystać maksymalnie fakt, że tworzę nowy język i jestem ograniczony jedynie wyobraźnią i własnymi założeniami projektowymi. A czy ta filozofia jest lepsza czy gorsza - to już pozostawiam do oceny każdemu z osobna. Jestem pewien co do jednego - wciąż jest sporo miejsc, które można ulepszyć.

konto usunięte

Temat: Wady vs Zalety OPT

OPT zalatuje mi PHPTalem -> Zope
mylę się?

konto usunięte

Temat: Wady vs Zalety OPT

Przemek Czekaj:
Bardzo mi przykro, ale niestety nie mogę się z Tobą zgodzić Tomku, ponieważ nie ma zasady dziel i rządź w algorytmice, jest zasada dziel i zwyciężaj. Dlatego wziąłem dziel i rządź w cudzysłów.

Teraz rozumiem, zatem przedstawiłeś opinie, z którą nijak dyskutować. Ani się z nią zgodzić, ani nie zgodzić, ani się do niej odnieść.
@edit
To że ktoś, odwraca kota ogonem by wyjść z uniesioną głową to już nie moja wina.

Hmmm .. widze, ze tu trzeba sie mocniej wdrozyc, zeby zaczac rozmawiac, ale mam podejrzenie, ze i tak rozmowa, moze byc niemozliwa. Bo jak rozmawiac o spr. technicznych, gdy zaczynaja sie takie wycieczki jak wyzej.

Pozdr.

Temat: Wady vs Zalety OPT

natrafiłem ostatnio na fajny artykuł o szablonach: http://pornel.net/szablony

--edit--
wystrzeliłem za szybko bo już się to pojawiło w wątku: http://www.goldenline.pl/forum/1900186/pytanie-o-smart...Krzysztof Korzeniewski edytował(a) ten post dnia 04.09.10 o godzinie 16:31
Jakub L.

Jakub L. Programista

Temat: Wady vs Zalety OPT

Tomasz Jędrzejewski:
Jakub L. -> wiem, że w PHP istnieje pętla, ale niektóre problemy są ze swojej natury rekurencyjne i nic na to nie poradzę. Pytasz o przykład takich algorytmów:
- przechodzenie po drzewach z zachowaniem hierarchii.
- algorytm BFS/DFS.

Napiszę w skrócie - weź się doucz zanim zaczniesz pisać takie, jak to określiłeś, herezje.
Nawet w opisie z wiki jest podany algorytm nierekurencyjny, zarówno po angielsku, jak i po polsku, po polsku jest dodany nawet pseudokod.

http://pl.wikipedia.org/wiki/Przeszukiwanie_wszerz
Choćbyś nie wiem, co robił, nie zaimplementujesz ich za pomocą samej pętli, gdyż są one ze swej natury rekurencyjne.
Rekurencję można emulować przy pomocy pętli, ale w ogólnym przypadku zawsze będzie Ci potrzebna do niej jakaś dodatkowa struktura danych (najczęściej stos, choć czasem da się użyć kolejkę), bo takie są prawa natury i tyle.

To nie jest emulacja tylko pętla ze strukturą danych. Możesz się napinać, ale taki algorytm są w stanie wygenerować ludzie którzy nie znają rekurencji, a więc nie są w stanie jej emulować.
Ponadto - pisałem już o tym wcześniej - OPT nie używa jawnej rekurencji, ale ją emuluje właśnie przy pomocy pętli + SplQueue/SplStack, zatem przepełnienie stosu PHP może zajść tylko wtedy, gdy to Twój skrypt najpierw zajął cały, a później wywołał OPT :P.

Jedyne miejsce, gdzie jest jawna rekurencja, to instrukcja

No to używa czy nie?

Do samego frameworka nic nie mam, on mi w sumie wisi, ale jak widzę takie rzeczy pisane publicznie, to bierze mnie strach, że może mi się zdarzyć potem pracować z kimś, kto w to uwierzy.
Jeśli chodzi o Twój przykład, to jest to dla mnie normalna rekurencja, tyle że emulowana... dokładnie tak, jak to robi OPT

A dla mnie jest to iteracja, bo jak się zaprzeć, to każdą iterację można nazwać w ten sposób rekurencją.
i tak, jak opisałem powyżej. Chyba że się umówimy, że takie coś nie jest rekurencją, ale wtedy w OPT także nie ma rekurencyjnych algorytmów poza tym jednym przypadkiem opisanym powyżej.

Najwyraźniej ten jeden wystarcza.

[...]
Takich rzeczy jest dużo więcej (np. wbudowany mechanizm renderingu formularzy - komponenty), a w wersji 2.1 zrobiłem rewolucję nawet w instrukcjach warunkowych, które potrafią teraz dużo więcej, niż zwykły if oraz switch z PHP. Prosty przykład:

<opt:if>
<opt:condition test="$foo is either 2 or 6"> condition 2</opt:if>
<p>Wasz PHP tego nie potrafi</p>
<opt:condition test="$foo is between 3 and 5"> condition 3</opt:condition>
</opt:if>
if ($foo == 2 || $foo == 6) { /* condition 2 */ }
if ($foo >= 3 && $foo <= 5) { /* condition 3 */ }

czy coś w ten deseń z niepotrafieniem, może jeszcze switch będzie potrafił więcej, ale akurat jestem na wakacjach to nie sprawdzę.

Dodatkowo dochodzi nieścisłość operatora "is between" - ostra czy nieostra, albo ostra w którą stronę, i jak to się ma względem typów zmiennoprzecinkowych - trzeba wkuwać takie rzeczy z dokumentacji. SQL ma coś takiego, jeżeli nie wzorowałeś się bezpośrednio i nie masz dokładnie takiej samej semantyki, to ludzie którzy z tego w SQLu korzystają ukochają to strasznie.

konto usunięte

Temat: Wady vs Zalety OPT

Przemek - bez wycieczek osobistych i frustracji. Osoba ktora moze miec tutaj jakies rozdmuchane ego to jestes jedynie Ty z tego co widze.
Chetnie poczytam dalsza merytoryczna dyskusje Tomka i Jakuba, ale Ty moglbys jednak zamilknac albo zmienic sposob wypowiedzi...
Adrian Z.

Adrian Z. IT Project Manager &
PHP Programmer

Temat: Wady vs Zalety OPT

Paweł Krefta:
Minusy - to kobyla majaca wiecej wspolnego z Java niz PHP. Ludzie chca napisac cos lepszego od Smarty i dopada mi mania przedobrzania - nikt nie potrafi napisac prostego i sprawnego systemu szablonow ktory bedzie sie zawieral w kilku plikach. Tak wiem - ten kod jest wykorzystywany tylko przy kompilacji szablonow ale czy do uzyskania petli ifow i paru innych pierdol naprawde jest potrzebne tyle kodu ?
MiniTemplator

konto usunięte

Temat: Wady vs Zalety OPT

Przemek Czekaj:
@Marcin Olichwirowicz
spróbuj mnie uciszyć.

Nie mam zamiaru czytać jego bredni. I patrzeć jak się chełbi tym że piszemy o OPT. Zaraz tak w piórka obrośnie że dzioba nie będzie widzieć u ptaszka i zdechnie z głodu.

http://www.cojack.pl/dispatcher-dyspozytor
weź wyjaśnij mi jedno, rok temu podniecałeś się OPT 2 a teraz tak plujesz

po co? szkoda na takie zachowanie energii

konto usunięte

Temat: Wady vs Zalety OPT

No i masz rację, już się więcej nie będę udzielał w tym temacie.
Hubert Wesołowski

Hubert Wesołowski Człowiek od krycia
dachów podczas
deszczu (mokrej
roboty).

Temat: Wady vs Zalety OPT

tak dla odmiany opinia zwyklego zjadacza:
mialem okazje zetknac sie i uzywac w praktyce kilka systemamow szablonow:
- XSLT,
- OPT,
- Smarty (dosc dawno - nie wiem jaki jest obecny status projektu)
- gole PHP.

z mojego punktu widzenia sens stosowania szablonow polega na silnym odseparowaniu logiki aplikacji od prezentacji. dzieki temu mozemy latwo wydzielic (widok) z projektu i oddelegowac jego wykonanie osobie odpowiedzialnej za ciecie projektu do html'a (jesli jest na tyle bystra, ze ogarnia proste konstrukcje typu petle, co zdarza sie w praktyce prawie zawsze).

postaram sie opisac zauwazone wady i zalety poszczegolnych systemow.

XSLT.
generalnie mialem pecha. trafilem na duzy projekt ktory mial ten system szablonow stworzony w sposob delikatnie mowiac nie najlepszy. jak i cala reszte. ciezko sie bylo polapac w strukturze plikow, aby dokonac prostej modyfikacji w szablonie trzeba bylo czasem poznawac cala logike aby dowiedziec sie jakimi danymi w szablonie dysponujemy (co dla niektorych moze byc zaleta - silne odseparowanie aplikacji od widoku). no ale generalnie mam swiadomosc, ze balagan jest mozliwy do uzyskania w kazdym systemie :)
(-) bardziej ogolne: strasznie dzika skladnia, kiepska dokumentacja jesli che sie zrobic chocby troche wiecej.
jedyna zaleta jaka zauwazylem jest sprawdzanie poprawnosci skladni xml.

OPT.
coz... najwiekszy + chyba sie nalezy za dokumentacje. podobnie jak XSLT wymusza poprawnosc skladni, sporo ciekawych rozwiazan, ale jak wspomnial autor jak komus sie nie chce siedziec w dokumentacji moze wszystko zrobic zwyklymi petlami.

Smarty.
-: brak wymuszania poprawnej skladni xml, mialem jakies problemy z ogarnieciem tablic asocjacyjnych z tego co pamietam, ale bylo dawno i nie che mi sie do tego wracac.
+: "normalna" skladnia (z punktu widzenia programisty), swego czasu duza popularnosc.

PHP
+: nie tworzy niepotrzebnych bytow, kolejnej skladni do opanowania itp, szybkosc (jesli komus zalezy na tych promilach ;-)), ogarnie sie w tym kazdy programista php, latwosc debugowania
-: brak wymuszenia poprawnosci skladni xml (podobnie jak w smarty)

Generalnie podsumowanie jest takie, ze w nowych projektach uzywam OPT lub czystego PHP w zal. od rodzaju i skali projektu oraz osob go wspoltworzacych.

Powyzszy tekst stanowi prywatna opinie autora i jako taka nie moze byc przedmiotem sporow czy dyskusji. W zamierzeniu mial byc uzyteczny dla innych czytelnikow, jednak jesli takowym sie nie stanie, bo nikogo nie interesuje wybor szablonu tylko flame, to trudno ;-).

W kazdym razie zycze duzo wygody programowania niezaleznie od systemu szablonow czy ich niestosowania wogole.

Hubert.

P.S. @Przemku sprawdz sobie "divide et impera" zanim znow gdzies napiszesz ze nie ma (no chyba, ze pragniesz zawladnac srodowiskiem programistow uzywajacych szablonow ;-) )
Zbigniew Prętki

Zbigniew Prętki Programista PHP

Temat: Wady vs Zalety OPT

Tomasz Jędrzejewski:
Ponadto w swojej wypowiedzi pomijasz jakże istotny fakt, że zadałem sobie niemały wysiłek napisania wszystkich rekurencyjnych algorytmów tak, by nie korzystały z jawnej rekurencji, dzięki czemu rzeczone algorytmy nie zżerają na sztywno ograniczonego do 100 wywołań funkcji stosu PHP, a my możemy przetwarzać teoretycznie dowolnie głębokie drzewa z dokładnością do pamięci przydzielonej skryptowi. W dodatku w pewnych miejscach dało mi to możliwość uproszczenia części rekurencyjnego kodu tak, by nie wykorzystywał tyle pamięci, ile by było normalnie potrzebne, więc o jakiej "nieoptymalności" my tu mówimy?

Witam, to mój pierwszy post na GL.

Specjalnie zarejestrowałem się żeby żeby zapytać o to ograniczenie do 100 wywołań funkcji stosu napisałem taki kod i się wykonał.

<?php

function bar($n) {
if($n > 1)
return bar($n - 1) + $n;
else
return $n;
}


echo bar(5000);


Mógłbym prosić o taki kod który przy 100 wywołaniach przestanie działać?Zbigniew Prętki edytował(a) ten post dnia 05.09.10 o godzinie 11:39
Przemek Szalko

Przemek Szalko iOS Developer + Full
Stack Developer

Temat: Wady vs Zalety OPT

Ograniczenie 100 wywołań jednej funkcji w PHP nie istnieje, może być wprowadzone w rozszerzeniach do PHP, np. instalując xdebug automatycznie dodaje takie ograniczenie. W xdebug jest to oczywiście konfigurowalne.Przemek Szalko edytował(a) ten post dnia 05.09.10 o godzinie 11:43

konto usunięte

Temat: Wady vs Zalety OPT

Przemek Czekaj:
@Marcin Olichwirowicz
spróbuj mnie uciszyć.

Nie mam zamiaru czytać jego bredni. I patrzeć jak się chełbi tym że piszemy o OPT. Zaraz tak w piórka obrośnie że dzioba nie będzie widzieć u ptaszka i zdechnie z głodu.

zupelnie nieobiektywna, nacechowana emocjonalnie wypowiedz

podsumowujac, nic nie warty flame
Tomasz Struczyński

Tomasz Struczyński TeamLeader PHP i
analityk

Temat: Wady vs Zalety OPT

Przemek Szalko:
Ograniczenie 100 wywołań jednej funkcji w PHP nie istnieje, może być wprowadzone w rozszerzeniach do PHP, np. instalując xdebug automatycznie dodaje takie ograniczenie. W xdebug jest to oczywiście konfigurowalne.Przemek Szalko edytował(a) ten post dnia 05.09.10 o godzinie 11:43

@Tomasz Jędrzejewski, mógłbyś się, o ile to możliwe, odnieść jakoś do tego?

BTW, ciekawa dyskusja (pomijając wycieczki osobiste). Wcześniej nie słyszałem raczej o OPT, może czs się zainteresować?...

konto usunięte

Temat: Wady vs Zalety OPT

Tomasz Struczyński:
Przemek Szalko:
Ograniczenie 100 wywołań jednej funkcji w PHP nie istnieje, może być wprowadzone w rozszerzeniach do PHP, np. instalując xdebug automatycznie dodaje takie ograniczenie. W xdebug jest to oczywiście konfigurowalne.Przemek Szalko edytował(a) ten post dnia 05.09.10 o godzinie 11:43

@Tomasz Jędrzejewski, mógłbyś się, o ile to możliwe, odnieść jakoś do tego?

BTW, ciekawa dyskusja (pomijając wycieczki osobiste). Wcześniej nie słyszałem raczej o OPT, może czs się zainteresować?...

dokładnie tak samo korzysta się z PHPTal: http://phptal.org/
składnia podobna, możliwości pewnie też
Krzysztof Lechowski

Krzysztof Lechowski Senior Research
Analyst, Franklin
Templeton
Investments

Temat: Wady vs Zalety OPT

Jakub L.:
Tomasz Jędrzejewski:
Jakub L. -> wiem, że w PHP istnieje pętla, ale niektóre problemy są ze swojej natury rekurencyjne i nic na to nie poradzę. Pytasz o przykład takich algorytmów:
- przechodzenie po drzewach z zachowaniem hierarchii.
- algorytm BFS/DFS.

Napiszę w skrócie - weź się doucz zanim zaczniesz pisać takie, jak to określiłeś, herezje.
Nawet w opisie z wiki jest podany algorytm nierekurencyjny, zarówno po angielsku, jak i po polsku, po polsku jest dodany nawet pseudokod.

http://pl.wikipedia.org/wiki/Przeszukiwanie_wszerz
Choćbyś nie wiem, co robił, nie zaimplementujesz ich za pomocą samej pętli, gdyż są one ze swej natury rekurencyjne.
Rekurencję można emulować przy pomocy pętli, ale w ogólnym przypadku zawsze będzie Ci potrzebna do niej jakaś dodatkowa struktura danych (najczęściej stos, choć czasem da się użyć kolejkę), bo takie są prawa natury i tyle.

To nie jest emulacja tylko pętla ze strukturą danych. Możesz się napinać, ale taki algorytm są w stanie wygenerować ludzie którzy nie znają rekurencji, a więc nie są w stanie jej emulować.

Macie Panowie nieoprozumienie pojęciowe.
Rekurencja to nie funkcja odwołująca się sama do siebie, tylko definicja odwołująca się sama do siebie, innymi słowy to rodzaj konstrukcji logicznej. Podstawowym przykładem jest silnia. To, że możemy ją zapisać w formie pętli nie powoduje że silnia przestaje być rekurencją, to jedynie implementacja programistyczna, jedna z form zapisu algorytmu.

Rekurencje można też przedstawić w językach imperatywnych, w których dla odróżnienia od języków deklaratywnych nie ma czegoś takiego jak funkcja, procedura, metoda itp. Obsługując w nich rekursję nie mamy możliwości posłużenia się czymś tak miłym dla czytelności jak funkcja, co nie zmienia faktu, że nadal rekurencję obsługujemy.

Dyskusja byłaby bardziej rozwijająca, gdybyśmy skupili się na temacie. Zwroty typu "Weź się doucz" mają szkodliwy charakter, w końcu jesteśmy tu, żeby pomagać sobie w odkrywaniu świata. Jeśli to ma być konkurencja, to wolałbym konstruktywną, taka jak wyżej jest w wyjątkowo złym stylu, niczemu dobremu nie służy, a najbardziej szkodzi stosującym takie zabiegi retoryczne. W końcu nie jesteśmy wszechwiedzący.

Co do OPT. Miałem przyjemność raz używać, ale kawał czasu temu, nie znając żadnego z systemów szablonów wybierałem między OPT i Smarty. Przekonało mnie, to że OPT jest szybsze, składnię, dokumentację i architekturę rozwiązania uznałem za silne atuty, choć zaznaczam, że język dokumentacji nie stanowił dla mnie problemu i napewno ma istote znaczenie dla innych. Generalnie to dobre miejsce, żeby powiedzieć w kierunku ZYX'a Dzięki!. Przecież wcale nie musiał robić tego co zrobił, a bez wielkich korzyści pomógł wielu z nas.

Jest jeszcze osobna rzecz, z wadami czy bez, OPT to dobry produkt na rynku, napisany przez Polaka / grupę Polaków, warto go promować, upowszechniać i pozwalać mu stawać się coraz lepszym.



Wyślij zaproszenie do