Něco málo pro zasmání (pobrečení)

Dostal se mi do rukou jeden web, který si jeho majitel nechal udělat u jedné nejmenované profi-programátorské společnosti. Podle ceníku si firma bere 600Kč/hodinu práce programátora, tak se mrkněte na úryvek skriptu od opravdových "profíků" (v podobném duchu se táhne celý web):

<?
 $aABCD = Array(1=>"A","B","C","D","E","F","G","H","CH","I","J","K","L","M","N","O","P","R","S","T","U","V","W","X","Y","Z");

 $vFromLetter= isset($_REQUEST['letter']) ? addslashes($_REQUEST['letter']) : "";
 switch ($vFromLetter) {
  case "A" : $sLike = "sSlovo LIKE 'A%' OR sSlovo LIKE 'Á%'"; break;
  case "C" : $sLike = "sSlovo LIKE 'C%' OR sSlovo LIKE 'Č%'"; break;
  case "D" : $sLike = "sSlovo LIKE 'D%' OR sSlovo LIKE 'Ď%'"; break;
  case "E" : $sLike = "sSlovo LIKE 'E%' OR sSlovo LIKE 'É%' OR sSlovo LIKE 'Ě%'";break;
  case "I" : $sLike = "sSlovo LIKE 'I%' OR sSlovo LIKE 'Í%'";break;
  case "O" : $sLike = "sSlovo LIKE 'O%' OR sSlovo LIKE 'Ó%'";break;
  case "R" : $sLike = "sSlovo LIKE 'R%' OR sSlovo LIKE 'Ř%'";break;
  case "S" : $sLike = "sSlovo LIKE 'S%' OR sSlovo LIKE 'Š%'";break;
  case "T" : $sLike = "sSlovo LIKE 'T%' OR sSlovo LIKE 'Ť%'";break;
  case "U" : $sLike = "sSlovo LIKE 'U%' OR sSlovo LIKE 'Ú%'";break;
  case "Y" : $sLike = "sSlovo LIKE 'Y%' OR sSlovo LIKE 'Ý%'";break;
  case "Z" : $sLike = "sSlovo LIKE 'Z%' OR sSlovo LIKE 'Ž%'";break;
  case "all" : $sLike = "sSlovo LIKE '%'"; $vFromLetter='all'; break;
  default : $sLike = "sSlovo LIKE '".$vFromLetter."%' ";
 }
 $sQuerySlovo= "SELECT * FROM slovnik WHERE ".$sLike." ORDER BY sSlovo";

<? for ($i=1; $i<27; $i++ ):?>
 | <a href="page.php3?IDM=9&letter=<?echo $aABCD[$i]?>"
  class="text90 <?if ($aABCD[$i] == $vFromLetter) echo 'colorR'?>"><?echo $aABCD[$i]?></a>
<?endfor;?>

PS: pokud bude reakce kladná, rád přidám další úseky, klidně i s komentáři - ty jsou někdy opravdu zábavné (jenom doufám, že se v tom autor nepozná)
=Tom=
No, docela drsné ..ale možná jsem pochopil, co tenhle skript měl dělat. Ale nenapadá me moc lepších způsobu řešení - snad jen výrazně čitelnějších.. A jeslti jsem ho pochopil správně, tak v něm chybí několikero dalších znaků ..
Vzhledem k tomu, že tyhle prasárny předělávám, tak to jde výrazně jednodušeji. Ten switch jsem odstranil jednou drobnou úpravou databáze a ten zbytek:

for($i='A';( $i<='Z' && strlen($i) == 1);$i++) {
 echo ' | <a href="?letter='.$i.'">'.$i.'</a>';
}

No a ještě přidám tři perličky:
1) web je starý sotva 2roky a je psaný v PHP3 (!)
2) aby autor nezapomněl k čemu slouží konstrukt exit:
### KONEC PROVADENI SKRIPTU ###
exit;

3) super důležitá funkce:
function fSetSelected($id1, $id2) {
 if ($id1 == $id2) echo 'selected="selected"';
}
ale k pláči je to, že je v kódu 7x (!) pod sebou, akorát se pokaždé jmenuje jinak.

Že já vůl jsem se neživím programováním...?!
=Tom=
Upravit cyklus for neni problem - spis by me zajimalo, proc tam puvodni autor asi 4* ukoncoval php skript misto pouziti jednoho echa..

Heh.. ja uz loni delal vetsinu veci jenom proc php5 :D

A takove skvele funkce mam taky .. - a krome isSelected mam i isChecked ;) .. jen teda trochu jinak ->

function isSelected($jedna,$dva){
if($jedna==$dva) return 'selected="selected" ';
return '';
}
Každy programuje jinak. Ale tohle za 600 kč za hodku je docela mazec.
Ani se tomu nedivim.

Jako externista s 300kč/hod jsem dostal jeden hotový projekt k úpravě. Dělal ho jeden programátor. Měl jsem opravit chyby. Před otevřením kódu jsem řekl prkotina. A to jsem neměl říkat. Byla radost ten kód číst. Nejdřív jsem musel luštit co je co a pak to trochu přeformátovat. Jakmile se v tom dalo číst, tak přišel další šok. Jsem se divil, jak může něco takového vůbec fungovat. Naprostá amateřina. Žádné ošetřování chyb, čí možných nežádoucích vlivů. Zbytečně přaplácané kódy, duplicity. A to nemluvím o tom, že ta aplikace je v určitem okamžiku důležitá - krizové řízení města. Takže bych od toho očekával jistou stabilitu a zabezpečení. No nic. Neměl jsem čas to překopávat. Tak jsem opravil jen to, co nefungovalo. Bylo otázkou, kdy ta aplikace selže. A netrvalo to dlouho. Po čase jsem musel provést jednu kosmetickou chybku, ale od svého konzultanta jsem se dozvěděl, že ta aplikace zblbla. Nutno říct, že já s tím nemám nic společného. Jen jsem v nelibosti opravoval to, co by stejně časem selhalo.

Prostě každej je jiný a za programátora se může vydávat kdekdo. Narazil jsem i na programátora co umí kód jen číst, ale už ne psát.


Jinak k uvedenému kódu. Dalo by se to vylepšit, ale oproti tomu, co jsem měl, to ujde. To, jak ten kód nakonec bude vypadat, záleží i na okolnostech. Může na tebe tlačit čas. V tom případě je skoro jedno, jak je to napsáno. Hlavně aby to fungovalo.

Nevim proč, ale já jsem pořád zafixovanej na PHP4. PHP5 znám a je v určitých ohledech lepší. Jen prostě dělam kódy s ohledem na kompatibilitu PHP4. Že by za to mohl WZ, který zde ještě používá PHP4? ;)

Dynamické generování select-option je jedna z nejpouživanějších vlastnosti v projektech. Řekl bych, že toto by mohl být i hlavní testík pro určení úrovně znalosti programování.

Zadání by znělo takto: Vytvořte aplikaci, která bude dynamicky generovat libovolný počet položek. Každa tato položka obsahuje seznam kategorii. A aby to nebylo jednoduchý, tak některé z těchto položek mají přednastavenou hodnotu kategorie. Tuto přednastavenou hodnotu v aplikaci proveďte (to jest přednastavit hodnotu v seznamu selected).
Seznam kategorii je víceúrovňový a je umístěno v databázi. Je však potřeba seznam kategorii seřadit do stromové struktury. Následně proveďte zpracování, kdy se uloží hodnoty každé položky. Časový limit není dán. Rozhodující je finální podoba.

Příklad: Máme deset položek a z každé této položky je potřeba přiřadit odpovídající hodnotu kategorie. Seznam kategorie obsahuje 70 kategorii o maximálně čtyři úrovně hloubky. U šesti položek je známa jeho pozice v kategorii a je proto ji třeba přednastavit.

Snad jste pochopili zadání. A snad jste pochopili i pointu. Tato aplikace má totiž více možnosti řešení. A na základě tohoto řešení lze vyčíst, jak si s tim programátor poradil. To znamená časová náročnost, rychlost, plitvání paměti i kódu, apod. Abych nemluvil do větru, tak toto jsem dělal předevčírem. A řeknu vám, kolik se toho dalo k dokonalosti vylepšovat.
Nehci, abyste to zadání provedli. Je to jen příklad. Kdo chce, může to zkusit.
=Tomik=
K tvemu prikladu - jeste ze jedu zitra pryc a mam tak dobrou vymluvu to nedelat :D

Taky jsem mel hotovy projekt k uprave - jen diky znamosti a pochopeni, ze predchozi projekt je prakticky needitovatelny (ani po 2 hodinach cisteni kodu) se cely projekt delal znova :D (asi urcite to bylo rychlejsi nez editace puvodniho:)

Imho dopry programator se pozna nejen podle toho, jaky program napise, ale taky podle toho, ze program je pozdeji editovatelny a hlavne citelny ;)

Tech 600/hodina jsem prehlidl .. za ty prachy to je fakt mooc hodne - lip by to zvladli i studenti gymplu/prumyslovek, kterym by zaplatili min nez polovic :D
2Freeze: Výmluvy neberu :D

Zadání, které jsem uvedl, je nastaveno na poněkud vyšší laťku. Prostě to, co jsem dělal já.
Mirnější zadání je takové, že je vypuštěn dynamický počet položek a seznam kategorii je jednoduchý a nemusí být řazen. Ostatní zůstává stejné.

Takže: Máte 5 položek a 10 kategorii. Ke každé položce vybrat jednu kategorii ze seznamu. U pěti položek přednastavte vybranou kategorii.

He? Teda. Je to až moc zjednodušené :)
Tomik (tom.czweb.org):
Tu tvou vizi jsem sice vůbec nepochopil, ale připomnělo mi to, že už tu dlouho nebylo žádné programátorské cvičení ;)

Freeze (dreamer.kvalitne.cz):
Tak já takovýhle funkce nezatracuju, taky je sem tam použiju, ale mě dostal fakt, že tahle funkce je ve zdrojáku zkopírovaní 7x pod sebe, akorát se mění první písmeno. Takže se tam potom člověk může dočíst něco jako:

function aSetSelected($id1, $id2) {if ($id1 == $id2) echo 'selected="selected"';}
function bSetSelected($id1, $id2) {if ($id1 == $id2) echo 'selected="selected"';}
function cSetSelected($id1, $id2) {if ($id1 == $id2) echo 'selected="selected"';}
function dSetSelected($id1, $id2) {if ($id1 == $id2) echo 'selected="selected"';}
function eSetSelected($id1, $id2) {if ($id1 == $id2) echo 'selected="selected"';}
function fSetSelected($id1, $id2) {if ($id1 == $id2) echo 'selected="selected"';}
function gSetSelected($id1, $id2) {if ($id1 == $id2) echo 'selected="selected"';}

A dost jsem se divil, že se používají všechny?!


No a další perlička: snažil jsem se ze serveru (taktéž dodávala ona nejmenovaná programátorská firma - ještě jsem ho v reálu neviděl, ale už se těším) získat databázi, se kterou to pracuje abych mohl pracovat pěkně na localhsotu. Při prvním pokusu kdy jsem chtěl vytáhnout i data jsem server zbořil. Potom jsem zjistil že databáze má 350MB a obsahuje pouze spam.
Tak to je nemálo fér kód.

Taky jsem předělával starý web (reklamni-listy.cz), resp jejich administraci, ale neměl jsem původní zdrojáky, takže jsem vše psal od znova. Bývalý "zaměstnavatel" toho, kdo psal původní kód říkal, že to je prasečina.. Naštěstí neposkytl zdrojáky.

Chee, dnes si vyzpomněli, že chcou to a to, když už jsem to měl provozuschopný.. Protože jsem chytře generoval cosi 400 řádkovym JS u klienta, ale teď by to znamenalo zásadní zásahy, tak jsem to prostě smazal a nechal to generovat na serveru.. A to se tam toho ještě dost (=samotný lišty) cachujou, aby nedošlo k přetěžování serveru ^_^.

Né že bych psal nějaký extra-kód, ale myslím, že píšu dost pochopitelně pro budoucí úpravy (až na to, že vynechávám komentáře...), částečně využívám objekty (kupodivu to nefunguje na PHP4, nevím proč). Ale je čas je rozjet naplno :P.

POSTni sem nějaký kód s komentářem prosíííííííím O:-).

PS: Na tu hádanku (soutěž?) se moooožnááá podívám, jestli se mi bude chtít.
<HTML>Doporučuju The Daily WTF, konkrétně sekci CodeSOD: <a href="http://thedailywtf.com/Series/CodeSOD.aspx">
http://thedailywtf.com/Series/CodeSOD.aspx</a> ;-)

Jinak, nemám co dodat. Programátorem je dnes kdekdo, protože jsou za to slušný peníze.</HTML>
Tomik (tom.czweb.org)
Mam podobne zkusenosti :) Akce za 2000 udelat par malych uprav. Stravil jsem nad tim tyden nez jsem program pochopil, opravil hlavni chyby (bez kterych bych se dal nehnul) a pridal, co jsem pridat mel.
Proto jsem tak skepticky, kdyz nekdo rika, jak neco delat a ze to je to nejlepsi a tak to delaji profesionalove. Viz jakpsatweb :)
OndraSter: jeden kousek, kterej mi dal opravdu hodně zabrat:
<?
$vURL= $_POST['url'];
$vMesto= $_POST['mesto'];
// do 060124 fungovalo urlencode, pak to najednou prestalo fungovat :-)
$qMesto= $vMesto;
// presmerovani na sestavenou adresu
header ("Location: ".$vURL.$qMesto);
?>
=Tom=
>"pak to najednou prestalo fungovat :-)"
Tak tohle je dobré .. :D:D

Stejne tak mi prijde docela zajimave kompletni predani adresy v parametru, kdyz se to tam jen a pouze presmeruje - tedy nechapu smysl celeho skritpu :D
k tomu tematu nahore mne jeste napadlo toto.
Nektere veci se obvykle delaji dost na rychlo a tak se pouzije prvni reseni, co cloveka napadne. Pak nekdo ve stejnem shonu vymysli, ze to neni dobre, a ze by se to melo doplnit o to a to a to. Vysledkem byva nejsnadnejsi reseni, proste ze scriptu zkopirovat, upravit a nechat to tak i za cenu, ze je tam more veci navic.
To uz jsem taky parkrat zazil a za nektere vytvory se stydim. Jsem si rikal, az to odsouhlasi, tak to upravim. Jenze oni uz do toho nedovoli sahat :)