wz


Objektově Orientované Programování

Ξ July 4th, 2007 | → | ∇ Uncategorized |

Nedavno mi Touny půjčil knížku o Javě, kterou jsem si přečetl a docela jsem se i bavil tím, jak autor popisuje chovatelství zvířat pomocí objektově orientovaného programování. Rozhodl jsem se, že si také nějaký takovýho model napíšu. Zeptal jsem se tedy kivana (kterému jsem půjčoval knížku o C++, která se silně zaměřovala na objekty), jestli by mi nepomohl vybrat nějaké vhodné prostředí, kde by se dal snadno implementovat polymorfismus a enkapsulace. Po přečtení posledních dvou termínů kivan zemřel, takže jsem si musel pomoci sám (a rozhodl jsem se ho zahrnout do mého projektu, a má to! :))

Vybral jsem si oblíbené téma … člověk a reprodukce. Cílem bude vytvořit názornou strukturu tříd, kde konečnými třídami budou muž a žena. Můž a žena budou moci za určitých podmínek dohromady stvořit nového člověka, který bude mít téže reprodukční schopnosti. Každý člověk bude nositelem určitých (pojmenujme si je příznačně DNA), které budou popisovat jeho rodiče a jeho úplný rodokmen. Není to nic složitého, ale na můj druhý progámek v Javě (hned po Hello World) je to docela dobré.

Pokusím se vám popsat, jak jsem postupoval v návrhu a realizaci tohoto projektu. Nejdříve ale pár základních pojmů pro neznalé:

Co je to třída? Třída je datová struktura, obsahující své vlastní interní proměnné, metody a přístupové metody. Třída sama o sobě slouží pouze jako takový blueprint (nevím, jak bych to česky řekl).
Co je to objekt? Objekt je nezávislá instance třídy, jejíž data jsou strukturována podle třídy, jejíž instancí je. Každý objekt je nezávislý na jiných (vyjma statických proměnných a metod)

Určitě se shodneme na tom, že z hlediska forem života nemá cenu jít hlouběji, než ke třídě popisující člověka. Člověk sám jako takový nemůže v reálněm světě existovat … musí to být buď muž, nebo žena, proto v deklaraci třídy přidáme modifikátor “abstract”, který činí danou třídu abstraktní - nemůžeme z ní vytvořit žádný objekt. Takže tedy máme člověka.
Dále budeme mít Muže a Ženu, kteří budou z člověka odvozeni (budou to jeho potomci).
Aby lidé mohli vykonávat mnohé činnosti, potřebují k tomu orgány … a protože orgán jako takový nemůže existovat, vytvoříme abstraktní orgán.
A protože nám jde o reprodukci, odvodíme z této třídy dva potomky - mužství a ženství (líp jsem to už opravdu nemohl nazvat :))
Abychom zajistili přírodně identický reprodukční proces, musíme vytvořit také složky, ze kterých nový život vznikne, pojmenujme si je jako MuzskaSlozka a ZenskaSlozka.
A nakonec budeme potřebovat nějaký “generátor” nových lidí, takže mě napadá Postel :)

Protože budeme zapouzdřovat, musíme začít s psaním těch nejzákladnějších tříd, takže začneme s Orgánem :)

package devel.java;

public abstract class Organ
{
protected boolean pripraven = false;
public void Priprav()
{
this.pripraven = true;
System.out.println(”ORGAN: Organ je pripraven”);
}
public void Zklidni()
{
this.pripraven = false;
System.out.println(”ORGAN: Organ neni pripraven”);
}
}

Orgán bude nést proměnnou “pripraven”, která bude obecně indikovat to, jestli je orgán připraven vykonávat svou hlavní činnost. Metody Priprav() a Zklidni() budou toto nastavovat. Proměnná “pripraven” má modifikátor přístupu Protected, protože bude vyžadováno čtení z této proměnné z jejího potomka.
Ještě, než vytvoříme potomky této abstraktní třídy, musíme vytvořit mužkou a ženskou složku:

package devel.java;

public class MuzskaSlozka
{
public final String data = “M;”;
private boolean funkcni = false;
public MuzskaSlozka(boolean je_neni)
{
this.funkcni = je_neni;
}
public boolean GetFunkce()
{
return this.funkcni;
}
}

Tato třída je nositelem proměnné “data”, což je jako-chromozom :) a také obsahuje proměnnou “funkcni”, která je nastavována při konstrukci objektu (v konstruktoru) a značí, jestli je složka funkční.

ZenskaSlozka je to samé.

package devel.java;

public class ZenskaSlozka
{
public final String data = “Z;”;
private boolean funkcni = false;
public ZenskaSlozka(boolean je_neni)
{
this.funkcni = je_neni;
}
public boolean GetFunkce()
{
return this.funkcni;
}
}

Nyní, když máme vše potřebné, pro sestrojení funkčních orgánů, můžeme se do toho pustit, tak tedy Muzstvi:

package devel.java;

public class Muzstvi extends Organ
{
public void Vzrus()
{
this.Priprav();
System.out.println(”MUZSTVI: Muzstvi je pripraveno ke generaci slozky”);
}
public void Vychladni()
{
this.Zklidni();
System.out.println(”MUZSTVI: Muzstvi neni pripraveno ke generaci slozky”);
}
public MuzskaSlozka GenerujSlozku()
{
System.out.println(”MUZSTVI: Generuji slozku …”);
if(this.pripraven)
{
System.out.println(”MUZSTVI: Funkcni slozka byla generovana”);
return new MuzskaSlozka(true);
}
System.out.println(”MUZSTVI: Nefunkcni slozka byla generovana”);
return new MuzskaSlozka(false);
}
}

Přístupové metody příznačne obsahují Vzrus() a Vychladni() :) , které nastavují činnost orgánu. Následně je zde důležité metoda “GenerujSlozku”. Tato metoda je typu MuzskaSlozka, tudíž vrací objekt typu MuzskaSlozka. Ovšem toto vrátí pouze, je-li orgán připraven. Není-li orgán připraven, vrátí speciální MuzskaSlozka, která bude mít svojí vnitřní proměnnou “funkcni” nastavenou na false a bude to tudíž indikátor pro Postel, že nový život nelze vytvořit.

“Ženství” bude to samé, akorát s tím, rozdílem, že ZenskaSlozka bude funkční i tehdy, není-li orgán připraven. Jak je tomu v normálním světě.

package devel.java;

public class Zenstvi extends Organ
{
public void Vzrus()
{
this.Priprav();
System.out.println(”ZENSTVI: Zenstvi je pripraveno dobrovolne a je funkcni”);
}
public void Vychladni()
{
this.Zklidni();
System.out.println(”ZENSTVI: Zenstvi neni pripraveno, ale je funkcni”);
}
public ZenskaSlozka GenerujSlozku()
{
System.out.println(”ZENSTVI: Generuji slozku …”);
if(this.pripraven)
{
System.out.println(”ZENSTVI: Perzistentni zenska slozka je k dispozici”);
return new ZenskaSlozka(true);
}
System.out.println(”ZENSTVI: Perzistentni zenska slozka je nedobrovolne k dispozici”);
return new ZenskaSlozka(true);
}
}

A nyní vytvoříme tu poslední a nejdůležitější třídu před Mužem a Ženou - totiž člověka. K čemu by nám byly orgány, když nemáme něco třídy člověk, do kterých bychom je implementovali?.

package devel.java;

public abstract class Clovek
{
protected boolean zije = false;
protected int vek = 0;
protected String jmeno = “unnamed”;
private String DNA = “C;”;
public void Oziv()
{
this.zije = true;
System.out.println(”CLOVEK: Clovek “+jmeno+” byl oziven”);
}
public void Zabij()
{
this.zije = false;
System.out.println(”COLVEK: Clovek “+jmeno+” byl zavrazden”);
}
public void Prejmenuj(String novejmeno)
{
this.jmeno = novejmeno;
System.out.println(”CLOVEK: Clovek “+jmeno+” byl prejmenovan na ”
+novejmeno);
}
public void StrojCasu(int novyvek)
{
this.vek = novyvek;
System.out.println(”CLOVEK: Cloveku “+jmeno+” byl zmenen vek na ”
+ novyvek);
}
public String GetJmeno()
{
return this.jmeno;
}
public int GetVek()
{
return this.vek;
}
public void Say(String what)
{
System.out.println(this.jmeno+”: “+what);
}
public void AddDNAChain(MuzskaSlozka M, ZenskaSlozka Z, Muz muz, Zena zena)
{
this.DNA = this.DNA + “[” + M.data + “=” + muz.jmeno + “(” + muz.vek + “);” + Z.data + “=” + zena.jmeno + “(” + zena.vek+ “)]; < ” + muz.GetDNA() + ” ZDNA> ” + zena.GetDNA() + ” !!>>”;
System.out.println(”CLOVEK: Cloveku “+jmeno+” byla pozmenena DNA”);
}
public String GetDNA()
{
return this.DNA;
}
}

Jak můžete vidět, třída člověk už předpokládá existenci svých potomků, a není to tím, že ona myslí, ale je to tím, že programátor myslí :). Člověk obsahuje pár vlastností, pro člověka typických, jako je jméno nebo věk. Také si všimněte, že promenná DNA, která uchovává “genetickou informaci” daného člověka už obsahuje “C;”. To je proto, že jsem se rozhodl, že stvořím i zvířata a chci mít nezávislý nezapouzdřený systém DNA, takže “C;” značí, že nositel dané informace je člověk. Důležitá je zde metoda AddDNAChain(), která bude posléze volána Postelí, aby zakódovala do DNA nového člověka DNA svých rodičů.
Máme-li člověka hotového, můžeme konečně vytvořit specifické lidi - Muže a Ženu.

package devel.java;

public class Muz extends devel.java.Clovek
{
private Muzstvi muzstvi = new Muzstvi();
public Muz(String jmeno, int vek)
{
this.Prejmenuj(jmeno);
this.StrojCasu(vek);
this.Oziv();
System.out.println(”MUZ: Byl vytvoren muz “+jmeno);
}
public MuzskaSlozka Sex(Zena Z)
{
MuzskaSlozka MS;
this.muzstvi.Vzrus();
MS = this.muzstvi.GenerujSlozku();
this.muzstvi.Vychladni();
System.out.println(”MUZ: Muz “+this.jmeno+” mel sex s “+Z.jmeno+” a vratil slozku”);
return MS;
}
}

Vidíte, že muž je oproti člověku rozšířen pouze možností vracet mužskou složku pomocí trefně pojmenované metody Sex() :)
Stejně jako prvnímu muži i ženě, musíme jim nastavit jméno a věk sami, již při konstrukci. Lidé stvoření prostým vytvořením objektu Muz nebo Zena budou jako Adama a Eva. Adama a Evu stvořil bůh a Muze a Zenu stvořil Leviathan :) Tito lidé se již budou moci množit sami, ale to předbíhám. Teď ještě ženu, abychom to měli kompletní a mohli jít na to nejzajímavější:

package devel.java;

public class Zena extends devel.java.Clovek
{
private Zenstvi zenstvi = new Zenstvi();
public Zena(String jmeno, int vek)
{
this.Prejmenuj(jmeno);
this.StrojCasu(vek);
this.Oziv();
System.out.println(”ZENA: Byla vytvorena zena “+jmeno);
}
public ZenskaSlozka Sex(Muz M)
{
ZenskaSlozka ZS;
this.zenstvi.Vzrus();
ZS = this.zenstvi.GenerujSlozku();
this.zenstvi.Vychladni();
System.out.println(”ZENA: Zena “+this.jmeno+” mela sex s “+M.jmeno+” a vratila slozku”);
return ZS;
}
}

Toto je trochu neobvyklé, že žena vrací svou složku, ale jsme v modré sféře, holt to musíte brát jako fakt. Děti nedělá žena, děti dělá Postel!!!!
Ano je to skutečně tak, v tomto programu děti skutečně dělá Postel. Postel se tedy stává nejdůležitější věcí na světě!

package devel.java;

public class Postel
{
public Postel()
{
System.out.println(”POSTEL: Byla vyvtorena postel”);
}
public Muz GenerujMuze(Muz muz, Zena zena, String jmeno)
{
System.out.println(”POSTEL: Postel bude generovat noveho muze”);
MuzskaSlozka M;
ZenskaSlozka Z;
Muz novy;
M = muz.Sex(zena);
Z = zena.Sex(muz);
if(M.GetFunkce() && Z.GetFunkce())
{
System.out.println(”POSTEL: Obe slozky jsou funkcni”);
novy = new Muz(jmeno,0);
novy.AddDNAChain(M,Z,muz,zena);
System.out.println(”POSTEL: Muz “+muz.jmeno+” a Zena “+zena.jmeno+” dali vzniknout novemu zivotu.”);
System.out.println(”POSTEL: Je to Muz a jmenuje se “+novy.jmeno+ “, je mu “+novy.vek+” let”);
return novy;
}
System.out.println(”POSTEL: Jedna ze slozek nebyla funkcni, vracim null”);
return null;
}
public Zena GenerujZenu(Muz muz, Zena zena, String jmeno)
{
System.out.println(”POSTEL: Postel bude generovat novou zenu”);
MuzskaSlozka M;
ZenskaSlozka Z;
Zena nova;
M = muz.Sex(zena);
Z = zena.Sex(muz);
if(M.GetFunkce() && Z.GetFunkce())
{
System.out.println(”POSTEL: Obe slozky jsou funkcni”);
nova = new Zena(jmeno,0);
nova.AddDNAChain(M,Z,muz,zena);
System.out.println(”POSTEL: Muz “+muz.jmeno+” a Zena “+zena.jmeno+” dali vzniknout novemu zivotu.”);
System.out.println(”POSTEL: Je to Zema a jmenuje se “+nova.jmeno+ “, je ji “+nova.vek+” let”);
return nova;
}
System.out.println(”POSTEL: Jedna ze slozek nebyla funkcni, vracim null”);
return null;
}
}

Já miluju tuhle postel :) Víte jak je užasná? O takové automatizaci se panu Nedvědovi ani nezdálo! Prostě jenom dáte do postele muže a ženu, řeknete, jak se bude jmenovat. Postel zařídí, aby měli muž a žena sex a oba vyprodukovali svoji složku. Potom vytvoří nového člověka, vezme obě dvě složky a naláduje je do DNA nového člověka, kterého nakonec vrátí :). Je zde rozlišeno, jestli má postel generovat ženu, nebo muže, takže si doknce můžete vybrat! :)

Teď vám ukážu názornou ukázku použití těchto tříd. Takže budeme tvořit nové lidi a budem je párovat! Já si rád hraju na boha a vy? :)

package devel.java;

public class Lidstvo
{
public static void main(String args[])
{
Muz petr = new Muz(”Petr”, 18);
Zena renata = new Zena(”Renata”, 17);
Zena jana;
Muz michal = new Muz(”Michal”, 18);
Zena veronika = new Zena(”Veronika”, 17);
Muz james;
Postel postel = new Postel();
jana = postel.GenerujZenu(petr, renata, “Jana”);
james = postel.GenerujMuze(michal, veronika, “James”);
jana.StrojCasu(18);
james.StrojCasu(18);
Muz josef;
josef = postel.GenerujMuze(james, jana, “Josef”);
System.out.println(”— DNA: 1.generace —”);
System.out.println(”Petrova DNA: “+petr.GetDNA());
System.out.println(”Renaty DNA: “+renata.GetDNA());
System.out.println(”Michalova DNA: “+michal.GetDNA());
System.out.println(”Veroniky DNA: “+veronika.GetDNA());
System.out.println(”— DNA: 2.generace —”);
System.out.println(”Jany DNA: “+jana.GetDNA());
System.out.println(”Jamesova DNA: “+james.GetDNA());
System.out.println(”— DNA: 3.generace —”);
System.out.println(”Josefova DNA: “+josef.GetDNA());
System.out.println(”\nstuff happens :)”);
petr.Zabij();
petr = null;
System.out.println(”lol sry :)”);
}
}

Na začátku Leviathan stvořil Petra a učinil ho mužem, potom stvořil Renatu a učinil jí ženou (upozorňuji, že toto nemá naprosto žádnou souvislost s kivanem, který je také petr a renatou, slečnou z S1A … i když :)). Jenže Leviathanovi se nelíbil tento pár, a tak stvořil nový … stvořil Michala a učinil ho mužem a stvořil Veroniku a učinil jí ženou.
Potom bůh stvořil Postel! A do této postele on vložil (jak programátorské :)) Petra a Renatu. Tak vznikla Jana! Leviathan ale chtěl pro Janu partnera, a tak vložil do postele Michala a Veroniku … a hle!!! Vznikl James!! :)
Bůh urychlil vývoj Jamese a Jany a nastavil jim rovných 18 let, strčil je do postele a Vzniklo první skutečné dítě - Josef zvaný Pepa :)
Potom Leviathan nechal na standardní výstup vypsat DNA všech lidí a protože se mu Petr prostě nelíbíl, tak ho zabil :). A od té doby je Renata smutná.

Pokračování této telenovely, s novou upgradelou verzí mého světa :)
A na závěr vám nabídnu přesný výstup programu s Petrem,Renatou,Michalem a Veronikou: http://krepelky.kx.cz/vystup.txt

 

5 Responses to ' Objektově Orientované Programování '

Subscribe to comments with RSS or TrackBack to ' Objektově Orientované Programování '.

  1. Kesy said,

    on July 4th, 2007 at 2:20 pm

    lol, prostě lol :))

  2. Tonda said,

    on July 4th, 2007 at 4:09 pm

    Bože … co se stane když:
    lussy = postel.GenerujZenu(jana, veronika, ?Lussy?);
    ?
    :o)
    Ale naučit se z toho objekty nikdo nemá šanci. :D

  3. michaelf.ms said,

    on July 4th, 2007 at 4:47 pm

    to se ti ani nepřeloži, vždyť z tohole je vidět:
    “public Zena GenerujZenu(Muz muz, Zena zena, String jmeno)”, že GenerujZenu bere jenom muže a ženu

  4. kivan said,

    on July 4th, 2007 at 5:24 pm

    to Tonda - Já mu říkám, že z jeho výkladu chápu velký kulový a on mě pak na pomstu toho, že mu říkám, že z pedagogickýho hlediska je troska, zabije ve svým programu… TSss… :D

  5. michaelf.ms said,

    on July 4th, 2007 at 5:49 pm

    add kivan: to nebyla ta pomsta :)

Leave a reply



jsemblb

Leviathan

    kdo je Leviathan

    Jsem student aktuálně čtvrtého ročníku střední průmyslové školy strojní a elektrotechnické v českých budějovicích

     


 


RSS Zdroj

    ::

    RSS 2.0 < ZDE

    Přidejte si můj zdroj do vaší RSS čtečky

     

Statistiky