sobota 25. října 2014

Vztahy mezi třídami (Java)

Vztahy mezi třídami lze rozdělit následovně

  1. Vztahy mezi třídami jako datovými typy
    1. Generalizace
    2. Realizace
  2. Vztahy mezi třídami jako instancemi
    1. Asociace
    2. Agregace
    3. Kompozice

 

Generalizace

Neboli specializace nastává při dědění třídy. V Javě se používá klíčové slovo extends. Třída tímto zdědí metody a atributy třídy od které dědíme.

Generalizace je jednosměrná, takže vytváří hierarchii tříd (rodič -> potomek). Třída může dědit pouze od jedné třídy, ale rozhraní může dědit od více rozhraní.





Realizace

Zde se jedná o implementaci rozhraní. Tzv. rozhraní (interface) definuje metody, které potom musíme ve třídě implementovat. Odkaz na rozhraní se u této třídy provádí klíčovým slovem implements. Realizace je jednosměrný vztah, stejně jako generalizace. Realizovat je možné více rozhraní. Omezením tohoto vztahu je, že vždy na jedné straně vztahu musí být rozhraní a na druhé straně třída. Z toho vyplývá, že graf realizace musí mít vždy právě dvě úrovně (rozhraní a třída).


Asociace

Jedná se o poměrně obecný způsob vztahu mezi dvěmi instancemi. Příkladem může být použití jedné třídy v jiné třídě jako parametru metody, atributu třídy apod. Následující vztahy jsou specifičtější.

Tento vztah může (ale nemusí) být obousměrný. Tedy pokud zakreslíme tento vztah mezi třídami do grafu, můžeme v grafu získat cykly. Z toho vyplývá, že grafem nemusí být strom, jak tomu bylo v předchozích případech. Tato vlastnost platí i pro agregaci a kompozici.

Případ na obrázku může nastat, pokud položka menu (MenuItem) obsahuje zpátky referenci na menu, do kterého patří.

Agregace

Tento druh vztahu vytváří mezi třídami volnou vazbu - mohou bez sebe existovat. Například třída PC používá třídu Tiskarna. Pokud bude vztah ukončen, stále můžou jednotlivé třídy fungovat.

Kompozice

Kompozice je opak agregace. Tímto vztahem rozumíme silnou vazbu, tedy že jedna třída bez druhé nemůže existovat neboť ztrácí smysl. Jako příklad si můžeme vzít třídu obdelník a bod. Body definují umístění a velikost obdélníku, bez této třídy nemůže obdélník existovat.


Zdroje:
http://www.milosnemec.cz/clanek.php?id=199
http://www1.osu.cz/~hunka/vyuka/javaOOP/obop1/jvcv04/OOP_04.pdf
http://java.vse.cz/pdf/skripta-rozhrani.pdf
rozdíly druhů asociací: http://stackoverflow.com/questions/19606720/uml-class-diagram-association-implemented-in-java-classes
http://www.uml-diagrams.org/association.html

úterý 21. října 2014

Instalace balíku Procyon

Zdrojáky staženy z repozitáře https://bitbucket.org/mstrobel/procyon pomocí programu hg.
 hg clone https://bitbucket.org/mstrobel/procyon
Na první pohled drobné zklamání, chybí soubor build.xml, takže kompilace programem ant asi neprovedu. Složka ale obsahuje soubor build.gradle, takže máme co dočinění s programem gradle a ten teda ještě neznám. Podle www.zdrojak.cz vám gradle dokáže i vyvenčit psa, tak jsem zvědav.

$ sudo apt-get install gradle
Čtu seznamy balíků… Hotovo
Vytváří se strom závislostí      
Čtu stavové informace… Hotovo
Některé balíky nemohly být instalovány. To může znamenat, že požadujete
nemožnou situaci, nebo, pokud používáte nestabilní distribuci, že
vyžadované balíky ještě nebyly vytvořeny nebo přesunuty z Příchozí fronty.
Následující informace vám mohou pomoci vyřešit tuto situaci:

Následující balíky mají nesplněné závislosti:
 gradle : Závisí na: libgradle-plugins-java (= 1.4-2ubuntu1) ale nebude se instalovat
E: Nelze opravit problémy, některé balíky držíte v porouchaném stavu.
Gradle se zjevně nemá rad s eclipse a to kvůli knihovně libtomcat6-java, kterou gradle vyžaduje, zatímco eclipse vyžaduje libtomcat7-java. Takže po odinstalování eclipse a nainstalování gradle spouštím.

Příkazem gradle tasks lze získat zajímavý výpis všech "tasků", které, je možné spustit. Takže spouštím gradle jar a gradle javadoc. Příkaz gradle install končí s chybou, takže si s přidáním .jar souborů do vývojového prostředí snad poradím ručně.

Soubory .jar úspěšně vytvořeny nyní už jen zpátky nainstalovat eclipse :-)

Zdroje:
https://bitbucket.org/mstrobel/procyon
http://www.zdrojak.cz/clanky/gradle-moderni-nastroj-na-automatizaci/

pondělí 20. října 2014

Instalace knihovny BCEL

Ne, že by na tom bylo něco složitého, ale pár překážek najít lze.

Stažen soubor bcel-5.2-src.zip z http://commons.apache.org/proper/commons-bcel/download_bcel.cgi.

Po rozbalení nelze provést ant. Což je z následujících důvodů:
  1. Odkaz v souboru build.xml na řádku 115 (http://www.ibiblio.org/maven/regexp/jars/regexp-1.2.jar) už je nějakou dobu mrtvý, takže ho je potřeba nahradit nečím funkčním. Já našel následující http://central.maven.org/maven2/regexp/regexp/1.2/regexp-1.2.jar. Výsledek by měl vypadat takto:

    1
    <get dest="${libdir}/regexp-1.2.jar" usetimestamp="true" ignoreerrors="true" src="http://central.maven.org/maven2/regexp/regexp/1.2/regexp-1.2.jar"></span> </get>
    


  2. Dalším problémem je podivná znaková sada u několika zdrojových souborů.
    U souborů s jinou znakovou sadou hlásí chardet toto:
    $ chardet classfile/StackMap.java
    classfile/StackMap.java: TIS-620 (confidence: 0.99)
    U normálních je tento výpis:
    $ chardet classfile/SourceFile.java
    classfile/SourceFile.java: ascii (confidence: 1.00)
    Utilitce enca se tyto soubory nechce překódovat, tak, protože jich není mnoho, to udělám ručně.
    greg@Gregorg:~/bcel-5.2/src/java/org/apache/bcel$ enca -c *.java */*.java */*/*.java
    enca: Cannot convert `classfile/StackMapEntry.java' from unknown encoding
    enca: Cannot convert `classfile/StackMap.java' from unknown encoding
    enca: Cannot convert `classfile/Utility.java' from unknown encoding
    enca: Cannot convert `generic/ObjectType.java' from unknown encoding
    enca: Cannot convert `generic/ReferenceType.java' from unknown encoding
    enca: Cannot convert `generic/ReturnaddressType.java' from unknown encoding
    enca: Cannot convert `util/Class2HTML.java' from unknown encoding
    enca: Cannot convert `verifier/GraphicalVerifier.java' from unknown encoding
    enca: Cannot convert `verifier/statics/Pass2Verifier.java' from unknown encoding
    enca: Cannot convert `verifier/structurals/InstConstraintVisitor.java' from unknown encoding
    pozn.: parametr -c nastavuje cílovou znakovou sadu na znakovou sadu,která je nastavena v prostředí

A hurá, ant už se spustí :-)

Zdroje:
http://commons.apache.org/proper/commons-bcel/
http://wiki.ubuntu.cz/k%C3%B3dov%C3%A1n%C3%AD_znak%C5%AF