Translations of this page:

01 - Opakování z Algoritmizace, konvence pro psaní kódu

Konvence pro psaní kódu

Převzato z http://java.vse.cz a poté upraveno.

Pojmenovávání tříd, proměnných, metod, ...

Pro označování tříd, konstant, proměnných, atributů, a metod se v Javě používají identifikátory. Pravidla pro jejich výběr se dělí na povinná a doporučená.

Povinná pravidla

Povinná pravidla určují, jak můžeme identifikátory vytvářet, tedy, co všechno nám „zbaští“ překladač. Přípustný identifikátor (stejná pravidla pro třídy, atributy i metody, proměnné a konstanty) je ten, který začíná Unicode znakem (a, b, c,… ,A,B,C, …, ě, š, č, …, Ě, Š, …) nebo znakem _ či $. Dále může následovat posloupnost těchto znaků a číslic. Mezi těmito identifikátory nesmí být klíčová a rezervovaná slova jazyka Java (např. if, true, goto).

Doporučení

Doporučení pro pojmenování ulehčují čitelnost kódu a jejich dodržování je nutné, aby Váš kód přijal cvičící.

  • Nepoužívejte akcentované znaky, znaky _ a $ pouze odůvodnitelně.
  • Pro identifikátory (tříd, metod, proměnných, …) používejte jména popisující jejich význam. Vyhýbejte se zkratkám. Jména by neměla být krátká (minimálně 3 znaky) ani příliš dlouhá (více než 30 znaků).
  • Jména tříd, rozhraní a výčtových typů (class, interface, enum) začínají velkým písmenem. Pokud se použije více slov, všechna začínají velkým písmenem. Pro označení třídy se obvykle používá podstatné jména v jednotném čísle, které bývá doplněno o přívlastky, např. třídy Student, SeznamStudentu. Pro rozhraní používejte přídavné jméno, např. Runnable, Serializable, Vyplnitelny.
  • Jména metod, proměnných, formálních parametrů metod začínají malým písmenem. Pokud jméno obsahuje více slov, druhé a další začínají velkým písmenem.
  • Názvy konstant se píší celé velkými písmeny, v případě více slov se jednotlivá slova oddělují znakem podtržení, např. MAXIMALNI_POCET.

Formátování

  • Na jednom řádku by měl být jeden příkaz, deklarace (případně i definice) jedné proměnné, např. int i = 7;
  • Obsah bloku odsaďte vždy o jeden tabulátor (např. 4 mezery). V rámci jednoho bloku by měly být všechny příkazy odsazeny stejně.
  • Otevírací závorka bloku je obvykle na konci řádku, uzavírací pište samostatnou na řádku a to pod identifikátor, kterým začíná řádek s otvírací závorkou.
public static void main(String[] args) {
    int scitanec1 = 5;
    int scitanec2 = 2;
    System.out.println("Soucet je: " + (scitanec1 + scitanec2));
}
  • V řídících strukturách vždy používejte složené závorky pro bloky a to i v případě, že v bloku je pouze jeden příkaz.
while (''podmínka'') {
    ''příkaz(y)
}
if (''podmínka'') {
    příkazy(y)
}else {
    příkaz(y)
}
  • Používejte mezeru před otevírací závorkou a okolo operátorů.
  • V IDE (jako je např. NetBeans) lze v editačním okně přes kontextové menu (pravé myšítko) vybrat Format a nechat si kód zformátovat. Mnohdy se tím odhalí chyby (např. pokud bude jedna odsazena více než předchozí, pravděpodobně jste tu ppředchozí neuzavřeli).

Dokumentace, komentáře

  • Na začátku každé třídy uveďte:
    • stručný popis třídy,
    • autora či autory,
    • označení verze (pořadové číslo či datum poslední změny).
/**
  * Třída SeznamAkci - obsahuje seznam přípustných příkazů adventury.
  * Používá se pro rozpoznávání jednotlivých příkazů.
  *
  * Tato třída je součástí jednoduché textové hry.
  *
  * @author Michael Kolling, Lubos Pavlicek, Jarmila Pavlickova
  * @version 4.0
  *@created září 2006
  */
  • Před každou metodou by měl být její popis doplněný o popis významu jednotlivých parametrů a návratových hodnot.
  /**
   * Metoda hledá nejvyšší hodnotu (maximum) v poli celých čísel.
   *
   * @param pole Pole celých čísel, které se bude prohledávat
   * @return Vrací celé číslo s nejvyšší hodnotou
   */
  • Popisy tříd a metod by měly být ve formátu vhodném pro javadoc.
  • Vlastní kód doplňte o komentář pouze v nezbytných případech. Předpokládejte, že čtenář zdrojového textu zná Javu.

Opakování z Algoritmizace

Hlavní program, komentáře

  • Abychom mohli program spustit, nějaká třída musí obsahovat metodu public static void main(String[] args). Jméno souboru musí být shodné se jménem třídy obsahující metodu main(). Pozor, hlavička metody main() je závazná!
public class Trida {
    public static void main(String[] args) {
        prikazy;
}
  • Překlad a spuštění z konzole:

javac Trida.java

java Trida

  • Metoda main() může být ve více třídách - vhodné pro testování.
  • Komentáře
// koncořádkový komentář, od dvou lomítek do konce řádku
 
/* blokový komentář
   muze obsahovat více řádků */
 
/**
 * javadoc komentář, slouží k vytváření HTML dokumentace, <b>lze</b> v něm používat
 * HTML tagy, podporuje direktivy jako
 * @autor
 * @version
 * @param
 */

Datové typy

Primitivní datové typy

  • celočíselné: byte (8b), short (16b), int (32b), long (64b),
  • reálné: float (32b), double (64b),
  • znakový: char (16b), používá se UCS2, viz. Unicode,
  • logický: boolean, není převoditelný na číselné typy a naopak.

Referenční datové typy

  • objekty, patří sem například řetězce reprezentované třídou String nebo pole.

Deklarace proměnných, konstant

  • Vyhrazení paměti, potřeba pro silnou typovou kontrolu.
  • Nelokální proměnné = proměnné tříd a instancí. Lokální proměnné - uvnitř těl metod.
  • Neexistují globální proměnné! Pouze statické proměnné.
  • Nelokální proměnné jsou automaticky inicializovány (např. 0, false), platí i pro prvky pole (můžete se na to spolehnout).
  • Deklarace modifikátory datovy_typ nazev_promenne
  • Konstanta - deklarace pomocí klíčového slova final. Např. final int MAX = 10; final int MIN; MIN = 0; - lze do ní jen jednou přiřadit

Operátory

  • Přiřazení: =, operace=, l-hodnota (něco, co má adresu v paměti → proměnná),
  • Přetypování: implicitní - pouze rozšiřující! Zužující a ostatní explicitní, operátor (dat_typ),
  • Unární: znaménka plus a minus, inkrement, dekrement,
  • Binární: +, -, /, *, % …,
  • Relační: ==, !=, <, >, ⇐, >=, !, &&, || (short-circuit), &, | (plne vyhodnoceni),
  • Bitové: &, |, !, «, » …,
  • Pozor na priority, raději závorkovat!

Řídící struktury

  • Větvení: úplná a neúplná podmínka
if(podminka) {
    prikazy
}else if (podminka2) {
    prikazy }
else {
    prikazy }
  • přepínač, vyraz musí být typu int nebo typu, který lze na něj přetypovat - char, byte, short, int. Od Javy verze 1.5. je přípustný i výčtový typ = Enum.
switch (vyraz) {
    case nejaka_hodnota:
        prikazy
        break;
    ...
    default:
        prikazy
        break;
}
  • ternární operátor, pozor na přehlednost! Pozor na asociativitu, je pravá.
(podminka ? prikazy_splneno : prikazy_nesplneno);
  • návěstí identifikator_navesti:, slouží jen pro návraty při break navesti, continue navesti v cyklech! Identifikátor návěstí může být uveden pouze před příkazem cyklu nebo začátkem bloku!
  • Cykly: Známý počet opakování
for (vyraz_start; vyraz_stop; vyraz_iterace) {
    prikazy }
  • Opakování, dokud je podmínka splněna
while (podminka) {
    prikazy
}
  • Opakování, dokud je podminka splněna, proběhne alespoň jedenkrát (podmínka se vyhodnotí až na konci)
do {
    prikazy
} while (podminka);
  • Návrat z podprogramu return + návratový typ. Pokud je vyhodnocen return již se neprovádí žádné příkazy uvedené v bloku metody odkud je return volán.

Podprogramy = METODY

  • Metody třídy (uvedené modifikátorem static) mohou využívat pouze třídních metod a třídních proměnných (a to všechny i private té samé třídy). Ze všech ostatních tříd mohou využívat pouze statické členy (člen = metodu + atributy), které jsou public. Ze tříd ve stejném balíčku navíc členy bez modifikátoru přístupu, tzv. default a z rodičovských tříd (a rozhraní) navíc mohou používat vše protected.
  • Metody instance - mohou využívat jak instanční (své) proměnné a metody, tak třídní proměnné a metody.
  • Deklarace = hlavička + tělo, může být umístěno libovolně v rámci třídy
specifikatory navratovyTyp jmenoMetody(formalniParametry) {
  telo metody (prikazy)
}
  • Metody nic nevracející - void. Někdy je označujeme pojmem „procedury“.
  • Java umožňuje pouze předání parametrů hodnotou!
  • Přetížené metody - liší se v počtu, pořadí, typu formálních parametrů. Metody nelze přetížit pouze na základě změny návratového typu!
/*
 * mame bitový vektor, chceme vyresetovat (nastavit na 0)
 * celý vektor
 */
public void reset() {...}
/*
 * mame bitový vektor, chceme vyresetovat (nastavit na 0)
 * pouze bit
 * @param pořadí bitu, který má být resetován
 */
public void reset(int bit) {...}
  • Java samozřejmě umí rekurzi. Používat často, kdykoli to zprůhlední kód. Pozor, někdy může být neefektivní (viz Fibonacci rekurzivně vs. iterativně v Algoritmizaci).
  • Proměnné metod - lokální proměnné - jsou deklarované uvnitř metod a rozsah jejich platnosti je do konce bloku (blok je ohraničen párem složených závorek)!
  • Lokální proměnné mohou zastínit nelokální - přístup pomocí plně kvalifikovaného jména (this.sirka).

Pole

  • Referenční datový typ: referenční proměnná je typovaná na netriviální datové typy (pole je objekt).
  • Referenční datový typ není adresa, nelze pointerovou aritmetiku, tak jako v C/C++!
  • Po deklaraci referenční proměnná nereprezentuje žádná data - v Javě pole i objekty vznikají dynamicky pomocí operátoru new a zanikají, pokud na ně neexistuje žádná reference, zajistí garbage collector.
  • Deklarace a inicializace jednorozměrného pole (lze spojit)
int[] pole; // deklarace
pole = new int[1000]; //inicializace
int delkaPole = pole.length;
// počet prvků pole si každé pole pamatuje,
// nemusíte jej předávat do metod pracujících s polem jako další parametr
  • Prvky pole jsou automaticky inicalizovány,
  • práce s polem pomocí indexace, indexuje se od 0
for (int i = 0; i < pole.length; i++)
    pole[i] = 2*i; // přiřazení hodnoty
  • Překročení mezí polí je striktně kontrolováno - výjimka,
  • inicializované pole
    int[] pole = {0, 1, 1, 2, 3, 5};
    System.out.println (pole.length); // vypíše 6
  • Vícerozměrná pole: jsou to pole polí, lze mít různě dlouhá vnitřní pole, inicializace lze i postupně.

Příklad zubatého pole:

int[][] matice = new int[5][];
for (int i = 0; i < matice[i].length; i++)
    matice[i][] = new int[i];
  • Inicializované pole vzniká obdobně jako jednorozměrné, opět navíc možnost různě dlouhých vnořených polí.

Příklady na procvičení

Parametry programu, spuštění z konzole

Napište program obsahující jedinou třídu CatalanArg, jejíž statická metoda catalanNumber vypočte n-té Katalánovo číslo rekurzivně. Získejte n jako argument programu (předpokládejte, že argument bude vždy jeden a vždy to bude číslo). V případě, že n<0, vypište na chybový výstup vhodnou hlášku, jinak vypočtené číslo vypište na standardní výstup.

Program přeložte a spusťte bez použití vývojového prostředí - pouze z konzole.

Rekurze, standardní vstup

Modifikujte předchozí program tak, aby n získal ze standardního vstupu (předpokládejte, že na vstupu bude právě jedno číslo). V případě, že n<0, vypište na chybový výstup vhodnou hlášku.

Tabulka násobení

Napište třídu Tabulka, která ve svých metodách implementuje následující operace:

  • každá tabulka bude mít svůj rozsah, např. malá násobilka od 1 do 9 a soustavu - desítkovou, dvojkovou,
  • vytvořte konstruktor bez parametrů (default - malá násobilka),
  • výpis tabulky (metoda vypis, použijte příkaz printf),
  • výpis tabulky bez popisů (metoda vypis),
  • přidejte konstruktor s parametrem rozsah,
  • přidejte konstruktor s parametrem rozsah a radix (číselná soustava),
  • dolaďte výpis.
 
/webdev/www/courses/Y36PJV/data/pages/cviceni/cviceni01.txt · Poslední úprava: 2009/03/02 11:26 autor: gutho1
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki