Shell modban egy parbeszedes program ugy mukodik, hogy mondjuk a user ir egy
sort, a program valaszol valamit, megint a user, megint a program, stb. Az,
hogy a user epp hol tart, milyen fazisnal, az impliciten be van kodolva,
hiszen epp ahol tart a program szovegeben.
Webes konyezetben viszont ugyanez ugy nez ki, hogy a program megkapja a user
inputot, kiirja a valaszt, majd vegeter. A user ujra ir valamit, azt a
program megint az elejen kapja meg, a session-bol kitalalja, hogy hol is
tartott a user, es kikopi a kovetkezo valaszt, majd vegeter, stb. Az, hogy a
user epp hol tart, expliciten nyilvantartando, es ezeket a program egy
kozponti helyerol kell meghivogatni. Ettol viszont a debuggolas nehezkes.
Az idealis egy olyan modszer/library/kornyezet lenne, amely ugyanazt a
programot tudna mindket modban futtatni. Debuggolashoz hasznosabb lenne a
shell mode, utana pedig transzparens modon lehetne weben futtani.
Egy nem tul elegans megoldas a kovetkezo: a shell-tipusu programban minden
I/O-t egy altalanos print_this_and_get_user_input() fuggvennyell megoldani,
amelyek elso parametere egy sorszam, es a hivast egy ugyanilyen cimke
koveti, tehat
dispatcher();
akarmi;
akarmi;
$from_user = print_this_and_get_user_input(1, "first output"); label
LABEL_1;
akarmi;
akarmi;
$from_user = print_this_and_get_user_input(2, "second output"); label
LABEL_2;
akarmi;
akarmi;
$from_user = print_this_and_get_user_input(3, "third output"); label
LABEL_3;
Amikor shell modban fut, akkor nyilvan minden jol mukodik, a dispatcher()
nem csinal semmit.
Amikor web modban megy, akkor a print_this_and_get_user_input() elmenti az
osszes valtozot, es a sajat cimkejet is. A dispatcher() ertelmezi a web
valtozokat, beleteszi az inputot a $from_user valtozoba, visszatolti a
session valtozokat, es csinal egy GOTO-t a megfelelo cimkere.
Ez nem annyira bonyolult, de nem tul szep, es konnyu elrontani a szamozast
(mondjuk ennek az ellenorzesere is lehet egy programot irni). Es kulonben is
csak Perl-ben menne, mert PHP-ben nincs GOTO.
De nem hiszem, hogy ez masnak ne jutott volna mar eszebe, es talan van is ra
valamilyen jobb/szebb/ertelmesebb megoldas, nem akarom ujra feltalalni a
fakereket, ha mar van gumikerek is.
Hol lehetne ilyet talalni?
Koszonom,
Jozsi.
|