Tato poznamka je urcena hlavne pre tych, kteri udelali cviceni 1 a ma byt inspiraci k zlepseni implementace jejich prvniho, do ctverce chodiciho, robota (jestli jste jeste neprogramoval robota chodiciho do ctverce tak to nejdriv skuste sami a pak se podivejte na tuto poznamku).
Poznamka vychazi z realniho prikladu, ktery odevzdal jeden ze studentu. Podivejte se nejdrive na mozne uhly pohledu, popremyslejte a pak se podivejte na reseni.
Nepochybne se da kazdy problem vyresit vic zpusoby. Limitovani sme nastroji, vedomostmi, skusenostmi... Nasledujici priklad je moznym (a plne funkcnim!) resenim samostatne prace z cviceni 1. Zkusme se na nej podivat z vic hladisk a zvazit kvalitu tohoto reseni.
Tak toto je ten kod. Na prvni pohled funkcni. Na druhy pohled...
Ale jaky uhel pohledu zvolit?
public void run() {
while(true) {
ahead(getBattleFieldWidth()/10);
turnRight(90);
ahead(getBattleFieldWidth()/10);
turnRight(90);
ahead(getBattleFieldWidth()/10);
turnRight(90);
ahead(getBattleFieldWidth()/10);
turnRight(180);
ahead(getBattleFieldWidth()/10);
turnLeft(90);
ahead(getBattleFieldWidth()/10);
turnLeft(90);
ahead(getBattleFieldWidth()/10);
turnLeft(90);
ahead(getBattleFieldWidth()/10);
turnLeft(180);
}
}
Predstavte si, ze by ste zjistili, ze pro bojove ucely se zvolena delka strany ctverce nehodi a chteli by ste ji zmenit. Napriklad na 1/5 sirky areny. Kolik zmen v kodu by jste museli udelat?
Jak se to da zlepsit?
Pripustme, ze nevime, jak efektivne je metoda getBattleFieldWidth() naimplementovana. Nebo naopak vime, ze je to zlozity vypocet, ktery zabere dve sekundy. Jestli ji volame casto, v arene to muze znamenat nasi smrt. (Takovych volani je i mimo arenu hodne: dost casu zabere napr. pripojeni k databazi nebo cteni ze souboru.)
Jak by jste upravili kod tak, aby volal metodu getBattleFieldWidth() jenom jednou?
V prikladu se opakuje jedna cinnost, otoceni o 90 stupnu a pohyb dopredu. U ctverce presne 4x, u ctverce tam a zpatky 8x. Kolik krat se to bude opakovat u pravidelneho dvacetiuhelniku tam a zpatky? Budete to vsechno psat?
Jak se jmenuje algoritmizacni konstrukce pro opakovani nejake cinnosti? Umeli by ste ji pouzit?
Velice strucne: v prvnim pripade pomuze umistneni opakujiciho se kodu do metody. Kdyz ulozite hodnotu z getBattleFieldWidth() do promenne, budete volat metodu jenom jednou. A ta konstrukce se jmenuje cyklus.