Eddig már nagyon sok rizsát olvastál az OOP-ről, itt az idő kipróbálni a gyakorlatban! Gondolom, ilyen pár soros "számoljuk ki a téglalap kerületét-területét" programok nem okoznak meglepetést. De vajon hogyan oldanád meg a következő feladatot?
Jack és Jane elmentek a kocsmába. Mindegyik iszogat: sört, bort, pálinkát, amiknek más-más alkohol koncentrációja (azaz erőssége van). Jack ha már annyit ivott, hogy összesen 1.2 deci nyers alkohol került a szervezetébe, kidől. Hasonlóképpen Jane 1 deci nyers alkohol fogyasztása után helyezkedik órás-pozícióba.
Ki fog előbb kidőlni, ha isznak mindenféle sorrendben, pld:
Gondolom most azért picit kényelmetlenül érzed magad. Emberként a fent vázolt folyamatot tökéletesen megérted, el tudod képzelni. Eddig programokat is csináltál. De vajon miért nem lehet könnyen programként megfogalmazni a feladatot?
Elárulom a titkot: eddig nagyon triviális dolgokat programoztunk. Az SOS-ező led triviális dolog, hiszen ott csak egymás után kell írni, hogy mi történjen. A téglalap kerület-terület meg azért triviális, mert egy egszerű matek képletet kell leírni.
Azonban, nincs egyszerű matek képlet a kocsmázásra.
Most gondolkodni kell.
Például, egy sör az 5 deci, és általában 5% alkohol tartalma van, tehát egy sör megivása után 5*0.05 deci alkohol kerül Jack-be. Lehetne Jack egy változó, hiszen csak arra vagyunk kíváncsiak, hogy mennyit ivott.
Csinálj egy új projektet és egy Kocsma nevű osztályt, és akkor próbáljuk meg matematikai módon megoldani a problémát!
public class Kocsma {
public static void main(String[] args) {
double jack=0;
double jane=0;
jack+=5*0.05; // egy sör
jack+=5*0.05; // második sör
jane+=0.5*0.40; // egy pálinka
jack+=0.5*0.40; // egy pálinka
jack+=0.5*0.40; // még pálinka
jane+=1*0.12; // egy bor
System.out.println("Jack "+jack+" deci alkoholt tartalmaz.");
System.out.println("Jane "+jane+" deci alkoholt tartalmaz.");
}
}
Őőő, hát izé. Valamit számolunk, és a végén ki tudjuk írni, hogy ki hol tart, oké.
De vajon hogyan lehet kitalálni, hogy mikor dőltek ki? Ehhez minden ivás után ellenőrizni kellene az alkohol szintjüket!
public class Kocsma {
public static void main(String[] args) {
double jack=0;
double jane=0;
jack+=5*0.05; // egy sör
if (jack > 1.2) {
System.out.println("Jack kidőlt!");
}
jack+=5*0.05; // második sör
if (jack > 1.2) {
System.out.println("Jack kidőlt!");
}
jane+=0.5*0.40; // egy pálinka
if (jane > 1) {
System.out.println("Jane kidőlt!");
}
jack+=0.5*0.40; // egy pálinka
if (jack > 1.2) {
System.out.println("Jack kidőlt!");
}
jack+=0.5*0.40; // még pálinka
if (jack > 1.2) {
System.out.println("Jack kidőlt!");
}
jane+=1*0.12; // egy bor
if (jane > 1) {
System.out.println("Jane kidőlt!");
}
System.out.println("Jack "+jack+" deci alkoholt tartalmaz.");
System.out.println("Jane "+jane+" deci alkoholt tartalmaz.");
}
}
Jóó, de mi van, ha nem csak ketten isznak, hanem mondjuk Jim is csatlakozik?
Akkor mindezt újra meg kell csinálni, új változó, új szorzások, új ellenőrzések.
Vajon meg tudjuk csinálni ezt egy egész karácsonyi buli méretben? Mondjuk 400 emberrel? Hááát, lesz egy kis gépelési gyakorlat, az biztos!
No és mi van, ha egy picit csavarunk még a feldataton? A játéknak akkor is vége, ha valaki túl sok folyadékot ivott, és emiatt pisilnie kell menni. 1 liter folyadék után pisiszünet. Na ezt hogyan fogjuk lekódolni? Ekkor már minden emberhez két változó kell, egyik az alkoholt, a másik a folyadékot tárolja, és az egész kódot 400-szor le kell írni, 400 x 2, azaz 800 változó használatával a karácsonyi buli mérethez...
Nos, ez így nem fog menni. Más hozzáállásra van szükségünk.