A neprilis souvisejici druha otazka: Rekneme, ze chci napsat vicemene univerzalni system, kde si uzivatel muze pomoci nejakych promennych upravit chovani k obrazu svemu. Hezky je to videt treba na databazovych nebo jazykovych tridach - system by mel byt schopen prizpusobit se uzivatelovu prostredi (ja bych treba chtel Firebird, ale nekdo hned zacne vyskakovat s PostgreSQL a spousta lidi samozrejme zna a pouziva akorat MySQL, takze je treba pocitat i s nim), ale je docela otazka, jak to udelat, kdyz kazde prostredi bude mit sva specifika: I treba u jazyku je to uz videt (kazdy jazyk pouziva jiny format data a casu, napriklad, ale muzou tu byt treba otazky slovosledu - pro nektery je lepsi "100 uzivatelu online", pro jiny "online 100 uzivatelu" a ne vzdycky to pujde osetrit pres printf), u databazi uz je to docela extremni (i kdybych se drzel jenom MySQL, bude diametralni rozdil, jestli budu pouzivat trojkovou radu, ctyrkovou radu nebo petkovou radu - nemluvim o tom, ze jednou se vola mysql_* a podruhe mysqli_*, jde treba o takovou vec, ze na MySQL 5 si spoustu veci napisu jako ulozenou proceduru nebo trigger a tim mi odpadne obrovska spousta PHP kodu).
Jaky je vas nazor na to, jak tohle resit? Vim o nekolika cestach, kudy do toho, kazda se mi ale zda do jiste miry nevyhovujici:
1) Nekolik souboru, kazdy pro jednu variantu implementace (jako to dela treba PHPNuke): Mam treba soubory mysql.php, postgresql.php, interbase.php apod., ktere vsechny obsahuji stejnou strukturu trid nebo funkci (kazda obsahuje treba funkce jako sql_connect() nebo sql_query() se stejnou strukturou parametru a implementuje je pomoci specifickych funkci toho ktereho rozhrani). V programu proste includuju tu verzi, kterou si uzivatel vyzada. Problem je v tom, ze me to stavi pred dilema, jestli radsi vyuzivat jen ty funkce, ktere jsou spolecne vsem implementovanym systemum (a obetovat tak spoustu vykonu i moznosti) nebo jestli timhle zpusobem rozepsat strasne velkou cast kodu (fakticky si nevystacim s sql_query(), potrebuju spis neco jako sql_read_article() nebo sql_create_user()) a stejne mit neefektivni aplikaci (tentokrat spis spotrebou pameti - vsechna data se musi najednou nacist do promennych a teprve pak zpracovat) a navic to nejspis bude tak neprehledne, ze se v tom nevyzna ani prase.
2) Jeden soubor a v nem na kazdem vhodnem miste spoustu vetveni podle jednotlivych parametru (tak funguje nebo aspon drive fungovalo phpBB): Proste mam funkci create_user() a v ni je na vhodnem miste vetveni typu if ($database_engine=='mysql') { ... } elseif ($databaseengine=='postgresql') { ... } else ... Je to taky neprehledne, ale asi o neco min nez predchozi pripad, naproti tomu se mi vubec nelibi, ze to znamena pri kazdem provadeni skriptu prinejmensim zparsovat, kdyz uz ne primo spustit, obrovskou spoustu zbytecneho kodu.
3) Docela se mi libi myslenka, mit zdrojak v podobnem tvaru jako bod 2 vyse, ale delat spis necim jako jsou v konvencnich jazycich IFDEFy - s tim, ze pred vlastnim nasazenim na web se kod napred prozene nejakym prepocesorem, ktery podle zadanych parametru vyhazi vsechny zbytecnosti a necha jen cisty PHP kod. V podstate se tak prace s vybranim vhodne vetve prehodi z runtime na install-time, zvetsim praci pro cloveka, co to bude poprve nasazovat, ale zmensim praci pro server pri vlastnim behu. Problemu je nekolik: Jednak nevim o nastroji, ktery by mi tohle umoznil (ale to se da celkem snadno zaridit), hlavne si ale nedovedu predstavit, jak bych takovy system ladil nebo upravoval, protoze tim preprocessingem vlastne prijdu o primou a pruhlednou vazbu mezi zdrojakem a tim, co se skutecne vykonava. Pokud by system bezel na serveru, kde je nejaky akcelerator, tak se to snad da resit nejakou specialni syntaxi komentaru, ale pak bude docela problem vyznat se v tom, kde ktery komentar zacina a konci... |