Programové konvence, dokumentace a ladění 2. přednáška Alena Buchalcevová
Proč dodržovat programové konvence? velkou část životního cyklu softwaru tvoří údržba údržbu provádí většinou někdo jiný než autor konvence zlepšují čitelnost a rychlost pochopení kódu zdrojový kód by měl odpovídat standardům, které používá komunita vývojářů 2
Konvence pro soubory soubory se zdrojovým kódem mají příponu.java soubory se bytekódem mají příponu.class zdrojové soubory by neměly mít více než 2000 řádků každý soubor může obsahovat pouze jednu veřejně přístupnou třídu nebo rozhraní v souboru může být několik privátních tříd a rozhraní, které by ale měly logicky souviset s veřejnou třídou souboru 3
Struktura zdrojového souboru 1. Úvodní komentář 2. Deklarace balíčku 3. Import balíčků /* * Jméno třídy * * Verze * * Datum * * Copyright */ 4. Deklarace rozhraní a tříd 4
importy Deklarace třídy metoda lokální proměnná import java.awt.*; import java.awt.geom.*; public class Kruh { private int prumer; private int xpozice; private int ypozice; private String barva; /* * Vytvoreni noveho kruhu na pozici 20,60 s barvou modra */ public Kruh() { prumer = 30; xpozice = 20; ypozice = 60; barva = "modra"; kresli(); hlavička třídy deklarace atributů konstruktor } /** * Posune kruh o nekolik bodu (o 20) doprava. */ public void posunvpravo() { posunhorizontalne(20); } /** * Nakresli kruh s aktualnimi parametry na platne. */ private void kresli() { Platno platno = Platno.getPlatno(); platno.setbarvapopredi(barva); platno.vybarvi(new Ellipse2D.Double(xPozice, ypozice, prumer, prumer)); platno.wait(10); } 5
Struktura deklarace třídy 1. Dokumentační komentář třídy /** */ 2. Hlavička třídy nebo rozhraní 3. Implementační komentář /* */ 4. Proměnné třídy (static) v pořadí public, protected, package, private 5. Instanční proměnné opět v uvedeném pořadí 6. Konstruktory třídy 7. Metody třídy seskupené do logicky souvisejících skupin (ne nutně dle viditelnosti) 6
Odsazování kódu Na jednom řádku by měl být jeden příkaz, deklarace jedné proměnné. Obsah bloku odsaďte vždy o 3 či 4 mezery. V rámci jednoho bloku by měly být všechny příkazy odsazeny stejně. while (...) { if (...) { prikaz1; prikaz2; } else { prikaz3; } prikaz4; } 7
Pravidla zalamování řádků Pokud je nutné řádek rozdělit, pak zalamovat za čárkou zalamovat před operátorem preferovat zalamování na vyšší úrovni vnoření zarovnat nový řádek se začátkem výrazu na řádku předchozím pokud vede předchozí pravidlo k nepřehlednosti, použít odsazení o 8 znaků 8
Komentáře Dokumentační Obsahují zejména specifikace Implementační poznámky k implementaci, popřípadě nastavení 9
Implementační komentáře Blokový před metodami k označení důležitých úseků Jednořádkový pokud je na samostatném řádku, pak mu předchází jeden řádek volný Do konce řádku často pokud potřebujeme zakomentovat kód krátký komentář /* * Blokový komentář */ /* komentář */ // komentář 10
Dokumentační komentáře Popisují třídy, rozhraní, konstruktory, metody a položky pro potřeby tvorby dokumentace /** Komentář */ nebo /** * Komentář */ Mohou obsahovat speciální argumenty začínající @ (např. @autor, @param, @see) 11
Základní pojmy programování Proměnná pojmenovaná část operační paměti, která slouží pro uložení určité hodnoty. jak velkou část paměti proměnná zabere závisí na datovém typu uložené hodnoty Konstanta pojmenovaná část operační paměti, která slouží pro uložení určité hodnoty, kterou ale není povoleno měnit. Datový typ určuje typ a velikost hodnoty ukládané do proměnné a určuje i množinu operací, které lze s hodnotou provádět. 12
Deklarace je zápis, kterým jsou v programu popsány a pojmenovány datové typy, konstanty, třídy a jejich atributy a metody deklarace metody je v Javě spojena s definicí, tj. metody jsou naplněny svým výkonným kódem - jsou implementovány 13
Deklarace proměnných Oznamuje překladači typ a identifikátor proměnné Určuje, kolik místa proměnná zabere v paměti Syntaxe: datový_typ identifikátor; datový_typ ident1, ident2; Příklad: int i; float a,b,c; int j = 20; explicitní inicializace deklarace + přiřazení hodnoty 14
Identifikátory slouží k pojmenování datových typů, konstant, proměnných, atributů, metod apod. skládají se z písmen, číslic, popřípadě znaku _ nesmějí obsahovat mezery, české znaky, operátory atd. nesmějí se shodovat s klíčovými slovy jazyka Java je Case-sensitive rozlišuje velká/malá písmena!!! Příklad: Student a student jsou dva rozdílné identifikátory - např. dvě rozdílné proměnné 15
Názvy identifikátorů Identifikátor by měl vystihovat obsah třídy, metody, datového atributu, proměnné, parametru, nepoužívejte krátké názvy nepoužívejte příliš dlouhé názvy výjimky z předchozího pravidla: iterační proměnná cyklu for (int i =0; i<10; i++) označení chyby v bloku catch catch (IOException e) označení události v handleru actionperformed(actionevent e) 16
Deklarace proměnných Doporučeno uvádět jednu deklaraci na řádek Mezi typem a identifikátorem lze dělat buď jednu mezeru nebo používat tabelátor Uvádět výhradně na začátku bloku za { Vždy inicializovat hodnoty proměnných v deklaraci, pokud lze int pocet; // počet instancí String jmeno; // jméno osoby 17
Pravidla pro pojmenování Třídy, rozhraní podstatná jména, každé slovo v identifikátoru začíná velkým písmenem velbloudí notace např. SeznamStudentu, MojeAplikace Metody slovesa první písmeno malé, každé další slovo začíná velkým písmenem např. vypisudajestudenta Proměnné stejné jako u metod nepoužívat _ srozumitelný identifikátor Konstanty - velká písmena, slova oddělená _ 18
Pravidla pro závorky Za příkazy if, while a for by měly být vždy uvedeny závorky. Kód se lépe kontroluje. if (cislo1 > cislo2) { System.out.println( Prvni cislo je vetsi ); } else {... 19
Klausule import celé jméno List a ArrayList v balíčku java.util je java.util.list a java.util.arraylist private java.util.list <String> seznam = new java.util.arraylist<string>(); programátor si může zjednodušit psaní pomocí importu: import java.util.list; import java.util.arraylist; případně (nedoporučuje se) import java.util.*; automatický import java.lang.*; možnost kolize jmen, např. List je v java.util a v java.awt private List <String> seznam = new ArrayList<String>(); 20
Pravidla pro import neduplikujte import java.io.*; import java.io.file; neimportujte java.lang neimportujte zbytečně neimportujte z aktuálního balíčku package mujbalik; import mujbalik.mojetrida; public class MojeTrida2 {... 21
Zbytečný kód Nedeklarujte proměnné, které nepoužijete. Nepište private metody, které nepoužijete. Nedeklarujte formální parametry metody, které nepoužijete. Nikde v programu by se neměly vyskytnout prázdné příkazy if, try, while, finally, switch. 22
Další pravidla Nekonečný cyklus pište pomocí while ne for, použití for evokuje vždy, že autor ví, kolik bude průběhů cyklu. Pozor na iterační proměnné ve vnořených cyklech for for (int i = 0; i<10; i++) { for (int j = 0; j<10;i++) { 23
Další pravidla Nepoužívejte formální parametr metody na levé straně přiřazovacího příkazu private void metoda (int parametr) { parametr = 5;... Ve větvi case příkazu switch by měly být 1-4 příkazy. Pokud jich potřebujete víc, napište pro ně metodu. 24
Pravidla pro String Při vytváření instancí nepoužívejte přímo konstruktor, ale zjednodušený zápis. ne String text = new String ( Textik ); String text = Textik ; ano Nikdy nevolejte metodu tostring() pro instanci Stringu String text = Textik ; String dalsitext = text.tostring(); ne 25
Možnosti pro ověření "správnosti" kódu Simulace na papíře Dvojí čtení kódu Ladící výpisy obsažené přímo v kódu Debugging Programming By Contract (assert) Jednotkové testování tříd 26
Výpisy přímo z kódu System.out.println nejjednodušší řešení je třeba po odladění odstraňovat z kódu Logování pomocí parametrů je možno zapínat a vypínat různé druhy výpisů java.util.logging log4j 27
Debugging Použití speciálního nástroje Degugger buď samostatně nebo je součástí vývojového prostředí Pomocí zarážek (breakpointů) zastavuje provádění kódu a umožňuje krokování a prohlížení obsahu proměnných a datových atributů 28
Debugger v BlueJ Spuštění přes volbu Zobrazit Umožňuje nastavit zarážky a krokovat kód Umožňuje prohlížení aktuálního obsahu proměnných 29
Tvorba dokumentace kódu Podpora pro tvorbu dokumentace je zabudována již přímo v jazyce. Součástí J2SDK je nástroj javadoc, který generuje dokumentaci přímo ze zdrojových kódů tříd opatřených strukturovanými komentáři. 30