35
Referat nr. 1 Referat nr. 1 Style kodowania” Style kodowania” Łukasz Kozień Łukasz Kozień 1 1

Referat nr. 1 „Style kodowania” Łukasz Kozień

Embed Size (px)

DESCRIPTION

Referat nr. 1 „Style kodowania” Łukasz Kozień. 1. Spis treści. Formatowanie kodu i nazewnictwo Struktura katalogów w projekcie JAR - Archiwa Javy Pakiety Logowanie - java.util.logging LOG4J. 2. Formatowanie kodu i nazewnictwo. Pliki źródłowe nie powinny być dłuższe niż 2000 linii - PowerPoint PPT Presentation

Citation preview

Page 1: Referat nr. 1 „Style kodowania” Łukasz Kozień

Referat nr. 1Referat nr. 1„„Style kodowania”Style kodowania”

Łukasz KozieńŁukasz Kozień

11

Page 2: Referat nr. 1 „Style kodowania” Łukasz Kozień

Spis treściSpis treści

• Formatowanie kodu i nazewnictwoFormatowanie kodu i nazewnictwo• Struktura katalogów w projekcieStruktura katalogów w projekcie• JAR - Archiwa JavyJAR - Archiwa Javy• PakietyPakiety• Logowanie - java.util.loggingLogowanie - java.util.logging• LOG4JLOG4J

22

Page 3: Referat nr. 1 „Style kodowania” Łukasz Kozień

Formatowanie kodu i nazewnictwoFormatowanie kodu i nazewnictwo

• Pliki źródłowe nie powinny być dłuższe niż 2000 liniiPliki źródłowe nie powinny być dłuższe niż 2000 linii• Linie programu nie powinny być dłuższe niż 80 znaków Linie programu nie powinny być dłuższe niż 80 znaków

(długie linie powinny być łamane)(długie linie powinny być łamane)

// Łamanie linii po przecinku// Łamanie linii po przecinkupublicpublic voidvoid zrobCos(String slowo1, String slowo2, String slowo3, zrobCos(String slowo1, String slowo2, String slowo3,

String slowo4) String slowo4) throwsthrows Exeption { Exeption {}}

// Łamanie linii przed operatorem// Łamanie linii przed operatoremzmienna = zmienna1 * ( zmienna2 + zmienna3 - zmienna4)zmienna = zmienna1 * ( zmienna2 + zmienna3 - zmienna4)

+ zmienna5 * zmienna6;+ zmienna5 * zmienna6;

Złamane linie należy wcinać o kilka tabulacji aby kod stał się przejrzysty Złamane linie należy wcinać o kilka tabulacji aby kod stał się przejrzysty (tabulacje o rozmiarze 4 znaków)(tabulacje o rozmiarze 4 znaków)

33

Page 4: Referat nr. 1 „Style kodowania” Łukasz Kozień

Formatowanie kodu i nazewnictwoFormatowanie kodu i nazewnictwo

• Miejsca w których należy stosować spację:Miejsca w których należy stosować spację:– Po słowie kluczowym po którym występuje nawiasPo słowie kluczowym po którym występuje nawias

if if (warunek) {(warunek) {}}

– PPo przecinkach w liście parametrów funkcjio przecinkach w liście parametrów funkcji – Spacja powinna oddzielać operatory od operandówSpacja powinna oddzielać operatory od operandów

zmienna += zmienna1 + zmienna2;zmienna += zmienna1 + zmienna2;Wyjątek:Wyjątek: zmienna3++; zmienna3++;

– Spacja powinna oddzielać kolejne elementy w wyrażeniuSpacja powinna oddzielać kolejne elementy w wyrażeniu forforforfor (init; war; krok) { (init; war; krok) {}}

– W celu oddzielenia operatora rzutowania od rzutowanego wyrażeniaW celu oddzielenia operatora rzutowania od rzutowanego wyrażenia((intint) zmienna) zmienna

• NNie umieszczaj odstępu pomiędzy nawiasami początkowym i końcowym funkcji czy ie umieszczaj odstępu pomiędzy nawiasami początkowym i końcowym funkcji czy wyrażeń wyrażeń

public voidpublic void zrobCoszrobCos(String (String zmiennazmienna) {) {}}

44

Page 5: Referat nr. 1 „Style kodowania” Łukasz Kozień

Formatowanie kodu i nazewnictwoFormatowanie kodu i nazewnictwo

• Każdą zmienną należy deklarować w osobnej liniiKażdą zmienną należy deklarować w osobnej liniiString zmienna1;String zmienna1;String zmienna2;String zmienna2;

• Parametry metod z przerwą po przecinkuParametry metod z przerwą po przecinkupublic public voidvoid zrobCoszrobCos(String (String zmiennazmienna1, String 1, String zmiennazmienna2) {}2) {}

• Nawias otwierający listę parametrów metody nie powinien być oddzielony żadnNawias otwierający listę parametrów metody nie powinien być oddzielony żadnąą przerwprzerwąą od nazwy metody od nazwy metody (Oraz od pierwszego i ostatniego parametru)(Oraz od pierwszego i ostatniego parametru)

• Nazwy klas i interfejsów mogą być złożone z jednego lub wielu słów, przy czym każde Nazwy klas i interfejsów mogą być złożone z jednego lub wielu słów, przy czym każde ze słów składowych musi się zaczynać od dużej literyze słów składowych musi się zaczynać od dużej litery

classclass JakasNazwaKlasy { JakasNazwaKlasy {}}

• Nazwy metod oraz pól (zmiennych składowych klasy) mogą być złożone z jednego lub Nazwy metod oraz pól (zmiennych składowych klasy) mogą być złożone z jednego lub wielu słów, każde ze słów za wyjątkiem pierwszego musi rozpoczynać się od duże literywielu słów, każde ze słów za wyjątkiem pierwszego musi rozpoczynać się od duże litery

voidvoid nazwaMetody( nazwaMetody(intint zmienna) { zmienna) {}}

55

Page 6: Referat nr. 1 „Style kodowania” Łukasz Kozień

Formatowanie kodu i nazewnictwoFormatowanie kodu i nazewnictwo

• Nazwy pakietówNazwy pakietów

– Pisane jest małymi literamiPisane jest małymi literami

– Jeśli składa się z wielu słów, to wówczas nie wprowadza się żadnego separatoraJeśli składa się z wielu słów, to wówczas nie wprowadza się żadnego separatora

packagepackage jakas.nazwa.pakietujakas.nazwa.pakietu

– Nazwa pakietu powinna odpowiadać następującemu szablonowiNazwa pakietu powinna odpowiadać następującemu szablonowi

<high level domain name>.<company name>.<project name>.<module name><high level domain name>.<company name>.<project name>.<module name>

<high level domain name><high level domain name> - nazwa domeny najwyższego poziomu - nazwa domeny najwyższego poziomu

com, edu, net, org lub dwuliterowy com, edu, net, org lub dwuliterowy kod kraju (ISO)kod kraju (ISO)

<company name><company name> - nazwa firmy lub organizacji realizującej projekt - nazwa firmy lub organizacji realizującej projekt

<project name><project name> - nazwa projektu - nazwa projektu

<module name><module name> - nazwa modułu projektu - nazwa modułu projektu

Kolejne elementy są dowolneKolejne elementy są dowolne

– Jeśli nie posiadamy własnej domeny, zmuszeni jesteśmy do wymyślenia mało Jeśli nie posiadamy własnej domeny, zmuszeni jesteśmy do wymyślenia mało prawdopodobnej kombinacji (własne imię i nazwisko)prawdopodobnej kombinacji (własne imię i nazwisko)

66

Page 7: Referat nr. 1 „Style kodowania” Łukasz Kozień

Formatowanie kodu i nazewnictwoFormatowanie kodu i nazewnictwo

• Stałe pisane są dużymi literami, poszczególne słowa oddzielane są od siebie znakiem Stałe pisane są dużymi literami, poszczególne słowa oddzielane są od siebie znakiem podkreśleniapodkreślenia

public static finalpublic static final NEW_LINE = ”\n”; NEW_LINE = ”\n”;

• Edytor Eclipse sam koloruje nasz kod oraz formatuje zgodnie z przyjętą konwencjąEdytor Eclipse sam koloruje nasz kod oraz formatuje zgodnie z przyjętą konwencją

• Dokładne informacje można znaleźć w dokumencie Dokładne informacje można znaleźć w dokumencie Code Conventions for the Java Code Conventions for the Java Programming LanguageProgramming Language, który znajduje się na stronie , który znajduje się na stronie http://java.sun.com/docs/codeconv/index.htmlhttp://java.sun.com/docs/codeconv/index.html

77

Page 8: Referat nr. 1 „Style kodowania” Łukasz Kozień

Struktura katalogów w projekcieStruktura katalogów w projekcie

• Strukturę katalogów w projekcie przedstawia tabela:Strukturę katalogów w projekcie przedstawia tabela:

88

optopt Oprogramowanie niezbędne w procesie kompilowania i instalowania oprogramowania (jdk, ant, jikes)Oprogramowanie niezbędne w procesie kompilowania i instalowania oprogramowania (jdk, ant, jikes)

srcsrc Katalog z plikami źródłowymi projektuKatalog z plikami źródłowymi projektu

build.batbuild.bat Plik przygotowujący środowisko projektu (ustawienie odpowiednich zmiennych środowiskowych, ant)Plik przygotowujący środowisko projektu (ustawienie odpowiednich zmiennych środowiskowych, ant)

build.xmlbuild.xml Plik konfiguracyjny ant-aPlik konfiguracyjny ant-a

src/configsrc/config Pliki konfiguracyjne projektuPliki konfiguracyjne projektu

src/databasesrc/database Sktypty bazodanowe projektuSktypty bazodanowe projektu

src/docssrc/docs Dokumentacja projektowa i inne dokumenty związane z projektemDokumentacja projektowa i inne dokumenty związane z projektem

src/etcsrc/etc Pliki deployment descriptorPliki deployment descriptor

src/resourcessrc/resources Pliki resource deployment descriptor dla iASPliki resource deployment descriptor dla iAS

src/tldssrc/tlds Pliki tag lib descriptorsPliki tag lib descriptors

src/javasrc/java Pliki źródłowe JavyPliki źródłowe Javy

src/testsrc/test Pliki źródłowe Javy dla testówPliki źródłowe Javy dla testów

src/websrc/web Pliki html, jsp, gif, jpegPliki html, jsp, gif, jpeg

liblib Dodatkowe biblioteki jar i zipDodatkowe biblioteki jar i zip

buildbuild Katalog tymczasowy dla skompilowanych źródeł Javy oraz dokumentacji JavadocKatalog tymczasowy dla skompilowanych źródeł Javy oraz dokumentacji Javadoc

assemblyassembly Katalog tymczasowy dla plików war, jar, earKatalog tymczasowy dla plików war, jar, ear

distdist Katalog tymczasowy z dystrybucją projektuKatalog tymczasowy z dystrybucją projektu

Page 9: Referat nr. 1 „Style kodowania” Łukasz Kozień

JAR – Archiwa Javy JAR – Archiwa Javy

• JAR (Java ARchive) – własny format Javy, w którym wykorzystywany jest format ZIPJAR (Java ARchive) – własny format Javy, w którym wykorzystywany jest format ZIP

• Służy do zbierania grupy plików do pojedynczego, skompresowanego plikuSłuży do zbierania grupy plików do pojedynczego, skompresowanego pliku

• Format JAR jest niezależny od platformy, nie trzeba się martwić o reprezentację Format JAR jest niezależny od platformy, nie trzeba się martwić o reprezentację danychdanych

• Kompresować do formatu JAR można także pliki graficzne jak i audioKompresować do formatu JAR można także pliki graficzne jak i audio

• Korzystanie z formatu JAR jest szczególnie istotne przy zastosowaniach internetowychKorzystanie z formatu JAR jest szczególnie istotne przy zastosowaniach internetowych

Przy połączeniu wszystkich klas niezbędnych do działania apletu w jeden plik JAR, Przy połączeniu wszystkich klas niezbędnych do działania apletu w jeden plik JAR, konieczne jest tylko jedno zapytanie serwera, a transfer jest szybszy z powodu konieczne jest tylko jedno zapytanie serwera, a transfer jest szybszy z powodu kompresji. Przed wprowadzeniem tego formatu przeglądarka sieciowa musiała kompresji. Przed wprowadzeniem tego formatu przeglądarka sieciowa musiała ponawiać żądania ściągnięcia z serwera wszystkich nie skompresowanych plików klas ponawiać żądania ściągnięcia z serwera wszystkich nie skompresowanych plików klas składających się na aplet.składających się na aplet.

• Każdy wpis w pliku JAR może być zaopatrzony w podpis cyfrowy w celu zachowania Każdy wpis w pliku JAR może być zaopatrzony w podpis cyfrowy w celu zachowania bezpieczeństwabezpieczeństwa

• Archiwum JAR składa się z pojedynczego pliku zawierającego zbiór plików Archiwum JAR składa się z pojedynczego pliku zawierającego zbiór plików skompresowanych oraz wykaz (ang. manifest)skompresowanych oraz wykaz (ang. manifest)

99

Page 10: Referat nr. 1 „Style kodowania” Łukasz Kozień

JAR – Archiwa JavyJAR – Archiwa Javy

• Narzędzie Narzędzie jarjar rozprowadzane jest razem z JDK (Java Developers Kit) Suna, rozprowadzane jest razem z JDK (Java Developers Kit) Suna, automatycznie kompresuje pliki wskazane przez użytkownikaautomatycznie kompresuje pliki wskazane przez użytkownika

• Wywołuje się z wiersza poleceńWywołuje się z wiersza poleceńjarjar [opcje] plik_docelowy [wykaz] plik[i] [opcje] plik_docelowy [wykaz] plik[i]

• Wykaz opcji:Wykaz opcji:– cc Tworzy nowe lub puste archiwum Tworzy nowe lub puste archiwum– tt Wypisuje zawartość archiwum Wypisuje zawartość archiwum– xx Wydobywa wszystkie pliki Wydobywa wszystkie pliki– x plikx plik Wydobywa wskazany plik Wydobywa wskazany plik– ff Wymusza podanie nazwy pliku. Brak tej opcji, jar zinterpretuje że Wymusza podanie nazwy pliku. Brak tej opcji, jar zinterpretuje że

dane będądane będą pochodziły ze standardowego wejścia, lub że ma wysyłać dane na standardowe pochodziły ze standardowego wejścia, lub że ma wysyłać dane na standardowe wyjście (gdy będzie tworzył plik) wyjście (gdy będzie tworzył plik)

– mm Pierwszy argument będzie nazwą wykazu stworzonego przez użytkownika Pierwszy argument będzie nazwą wykazu stworzonego przez użytkownika– v v Zwiększa liczbę prezentowanych informacji – Zwiększa liczbę prezentowanych informacji – jarjar będzie wypisywał co robi będzie wypisywał co robi– 0 0 Jedynie przechowuje pliki, bez kompresji. (np. można stworzyć plik JAR Jedynie przechowuje pliki, bez kompresji. (np. można stworzyć plik JAR

i dołączyć go do zmiennej środowiskowej i dołączyć go do zmiennej środowiskowej CLASSPATH CLASSPATH – m m Zapobiega automatycznemu utworzeniu wykazu Zapobiega automatycznemu utworzeniu wykazu

1010

Page 11: Referat nr. 1 „Style kodowania” Łukasz Kozień

JAR – Archiwa JavyJAR – Archiwa Javy

• Jeśli wśród plików danych do kompresji programowi Jeśli wśród plików danych do kompresji programowi jarjar znajduje się podkatalog znajduje się podkatalog wszystkie zawarte w nim pliki i podkatalogi również zostaną automatycznie dołączone wszystkie zawarte w nim pliki i podkatalogi również zostaną automatycznie dołączone do archiwum a informacja o ścieżce zostanie zapamiętanado archiwum a informacja o ścieżce zostanie zapamiętana

• Przykłady wywołań programu Przykłady wywołań programu jarjarjarjar cf mojPlikJar.jar *.class cf mojPlikJar.jar *.class

Stworzone zostanie archiwum Stworzone zostanie archiwum mojPlikJar.jarmojPlikJar.jar, zawierające wszystkie pliki , zawierające wszystkie pliki klas zklas z katalogu bieżącego, razem z automatycznie wygenerowanym wykazem katalogu bieżącego, razem z automatycznie wygenerowanym wykazem

jarjar cmf mojPlikJar.jar mojWykaz.mf *.class cmf mojPlikJar.jar mojWykaz.mf *.classTo samo, ale z włączonym wykazem stworzonym przez użytkownikaTo samo, ale z włączonym wykazem stworzonym przez użytkownika

jarjar tf mojPlikJar.jar tf mojPlikJar.jarWypisanie listy plików zawartych w Wypisanie listy plików zawartych w mojPlikJar.jarmojPlikJar.jar

jarjar tvf mojPlikJar.jar tvf mojPlikJar.jarBardziej szczegółowe informacje o plikach (opcja v)Bardziej szczegółowe informacje o plikach (opcja v)

jarjar cvf mojAplet.jar audio klasy obrazy cvf mojAplet.jar audio klasy obrazyZakładając że audio, klasy i obrazy to podkatalogi, pliki w nich zawarte Zakładając że audio, klasy i obrazy to podkatalogi, pliki w nich zawarte

zostaną zostaną włączone do plikuwłączone do pliku mojAplet.jar mojAplet.jar

• Wady programu Wady programu jarjar– Nie można dodać ani usunąć plików z istniejącego pliku JAR, trzeba go stworzyć Nie można dodać ani usunąć plików z istniejącego pliku JAR, trzeba go stworzyć

od zera (jeżeli się używa polecenia od zera (jeżeli się używa polecenia jarjar, gdyż można dodać pliki np. WinZipem), gdyż można dodać pliki np. WinZipem)

1111

Page 12: Referat nr. 1 „Style kodowania” Łukasz Kozień

JAR – Archiwa JavyJAR – Archiwa Javy

• Aby sobie uprościć zadanie do tworzenia plików JAR możemy użyć zwykłego ZIP’a Aby sobie uprościć zadanie do tworzenia plików JAR możemy użyć zwykłego ZIP’a a następnie zmienić rozszerzenie *.zip na *.jar, należy jednak pamiętać iż należy a następnie zmienić rozszerzenie *.zip na *.jar, należy jednak pamiętać iż należy dodać wtedy do archiwum własny plik manifestu.dodać wtedy do archiwum własny plik manifestu.

• Plik manifestuPlik manifestu– Przykładowy plik:Przykładowy plik:

– Plik ten może zawierać również inne pola np. Plik ten może zawierać również inne pola np. Signature-VersionSignature-Version, , Class-Path Class-Path ,,

Extension-ListExtension-List, Main-Class, Main-Class

– Możemy uruchomić program spakowany do archiwum JAR poprzez polecenie:Możemy uruchomić program spakowany do archiwum JAR poprzez polecenie:

java –jarjava –jar nazwa_pliku.jarnazwa_pliku.jar

jednak aby program się uruchomił należy dodać do pliku manifestu linijkę:jednak aby program się uruchomił należy dodać do pliku manifestu linijkę:

Main-Class:Main-Class: nazwa klasy z metodą main (klasa jaka ma być wywołana) nazwa klasy z metodą main (klasa jaka ma być wywołana)• Można np. pod Windowsem skojarzyć pliki *.jar z wykonywalnymi i uruchamiać jak Można np. pod Windowsem skojarzyć pliki *.jar z wykonywalnymi i uruchamiać jak

zwykłego programyzwykłego programy

1212

Manifest.mf

Manifest-Version: 1.0

Created-By: 1.4.2_01 (Sun Microsystems Inc.)

Page 13: Referat nr. 1 „Style kodowania” Łukasz Kozień

JAR – Archiwa JavyJAR – Archiwa Javy

• PrzykładPrzykład

1313

Projekt.java

import java.io.File;

public class Projekt {

public static void main(String[] s) {

File path = new File(".");

String[] list;

list=path.list();

for(int i=0; i<list.length; i++)

System.out.println(list[i]);

}

}

Manifest.mf

Manifest-Version: 1.0

Created-By: 1.4.2_01 (Sun Microsystems Inc.)

Main-Class: Projekt

Page 14: Referat nr. 1 „Style kodowania” Łukasz Kozień

PakietyPakiety

• Pakiety (Package) w Javie są to podzbiory bibliotek, które mają podobne funkcjePakiety (Package) w Javie są to podzbiory bibliotek, które mają podobne funkcje• Pakiety mogą zwierać interfejsyPakiety mogą zwierać interfejsy• Ważniejsze pakiety w Javie to Ważniejsze pakiety w Javie to

– java.lang.*java.lang.* - Pakiet zawierający wszystkie podstawowe klasy Javy. Nie musi być - Pakiet zawierający wszystkie podstawowe klasy Javy. Nie musi być jawnie importowany, gdyż kompilator czyni to w sposób jawnie importowany, gdyż kompilator czyni to w sposób

automatyczny automatyczny– java.util.*java.util.* - Pomocnicze klasy użytkowe (np. generacja liczb losowych, operacje - Pomocnicze klasy użytkowe (np. generacja liczb losowych, operacje

na ciągach znaków, ...) na ciągach znaków, ...)– java.io.*java.io.* - obsługa wejścia/wyjścia - obsługa wejścia/wyjścia– java.net.*java.net.* - Zawiera klasy konieczne do tworzenia oprogramowania - Zawiera klasy konieczne do tworzenia oprogramowania

wykorzystującego sieć wykorzystującego sieć – java.awt.*java.awt.* - Klasy służące do tworzenia graficznego interfejsu użytkownika(GUI) - Klasy służące do tworzenia graficznego interfejsu użytkownika(GUI)– java.applet.*java.applet.* - Pakiet zawierający klasy używane podczas tworzenia appletów - Pakiet zawierający klasy używane podczas tworzenia appletów

• Użycie słowa kluczowego Użycie słowa kluczowego importimport, służy do włączenia całej biblioteki np., służy do włączenia całej biblioteki np.importimport java.util.*;java.util.*;

Powoduje wprowadzenie do programu całej biblioteki Powoduje wprowadzenie do programu całej biblioteki utilutil• Użycie gwiazdki może wydłużyć czas kompilacji, szczególnie gdy importujemy kilka Użycie gwiazdki może wydłużyć czas kompilacji, szczególnie gdy importujemy kilka

dużych pakietów, dlatego dobrym zwyczajem jest raczej wskazanie konkretnej klasy dużych pakietów, dlatego dobrym zwyczajem jest raczej wskazanie konkretnej klasy niż importowanie całego pakietu. Użycie gwiazdki nie ma wpływu na czas działania ani niż importowanie całego pakietu. Użycie gwiazdki nie ma wpływu na czas działania ani na wielkość kodu wynikowego, powoduje jednak duże zamieszaniena wielkość kodu wynikowego, powoduje jednak duże zamieszanie

1414

Page 15: Referat nr. 1 „Style kodowania” Łukasz Kozień

PakietyPakiety

• Jeżeli chcemy importować pojedynczą klasę, możemy wymienić jej nazwę w instrukcji Jeżeli chcemy importować pojedynczą klasę, możemy wymienić jej nazwę w instrukcji importimport

importimport java.util.ArrayList; java.util.ArrayList;Można teraz używać Można teraz używać ArrayListArrayList, natomiast inne klasy pakietu , natomiast inne klasy pakietu java.utiljava.util nie będą nie będą dostępnedostępne

• Możemy również używać pełnej nazwy Możemy również używać pełnej nazwy java.util.ArrayListjava.util.ArrayList (można to robić bez (można to robić bez instrukcji instrukcji importimport))

• Gdy tworzymy bibliotekę z której będą korzystały inne programy Javy trzeba zapobiec Gdy tworzymy bibliotekę z której będą korzystały inne programy Javy trzeba zapobiec konfliktom nazw klas (patrz. „Formatowanie kodu i nazewnictwo”)konfliktom nazw klas (patrz. „Formatowanie kodu i nazewnictwo”)

• Każdy plik źródłowy definiujący pakiet rozpoczyna się następującą linią:Każdy plik źródłowy definiujący pakiet rozpoczyna się następującą linią:packagepackage <nazwa.pakietu> <nazwa.pakietu>

Instrukcja Instrukcja packagepackage musi stanowić w pliku pierwszy element nie będący komentarzem musi stanowić w pliku pierwszy element nie będący komentarzem• Podczas kompilacji wszystkie pliki pakietu umieszczone zostaną we wspólnym katalogu Podczas kompilacji wszystkie pliki pakietu umieszczone zostaną we wspólnym katalogu

(katalogu o nazwie pakietu. Np. Pliki źródłowe (*.java) pakietu AWT zawierają wiersze (katalogu o nazwie pakietu. Np. Pliki źródłowe (*.java) pakietu AWT zawierają wiersze „package„package java.awt;”java.awt;” Po ich skompilowaniu pliki (*.class) znajdować się będą w Po ich skompilowaniu pliki (*.class) znajdować się będą w katalogu JAVA/AWT (lub JAVA\AWT w zależności od systemu operacyjnego)katalogu JAVA/AWT (lub JAVA\AWT w zależności od systemu operacyjnego)

• Edytor Eclipse posiada tzw. asystenta importów, który automatycznie tworzy i Edytor Eclipse posiada tzw. asystenta importów, który automatycznie tworzy i organizuje deklaracje importóworganizuje deklaracje importów

1515

Page 16: Referat nr. 1 „Style kodowania” Łukasz Kozień

PakietyPakiety

• PrzykładPrzykład

1616

../edu/agh/hss/Kwadrat.java

package edu.agh.hss;

public class Kwadrat {

...

}

../edu/agh/hss/Punkt.java

package edu.agh.hss;

public class Punkt {

...

}

Program.java

import edu.agh.hss.Punkt;

public class Program {

Punkt p = Punkt();

public static void main(String[] s) {

...

}

}

Page 17: Referat nr. 1 „Style kodowania” Łukasz Kozień

PakietyPakiety

• KolizjeKolizjeJeśli program importuje z użyciem znaku * dwie biblioteki zawierające te Jeśli program importuje z użyciem znaku * dwie biblioteki zawierające te

same same nazwy np.nazwy np.importimport com.firma.* com.firma.*importimport java.util.* java.util.*

Załóżmy że Załóżmy że com.firmacom.firma zawiera klasę zawiera klasę VectorVector, którą również zawiera , którą również zawiera java.utiljava.util, co powoduje potencjalną kolizję, co powoduje potencjalną kolizję

Jednak kolizja będzie miała miejsce dopiero wtedy, gdy użyjemy kodu który Jednak kolizja będzie miała miejsce dopiero wtedy, gdy użyjemy kodu który ją ją wywoławywoła

np.np. Vector v = Vector v = newnew Vector();Vector();Dlatego iż kompilator nie wie do której klasyDlatego iż kompilator nie wie do której klasy Vector Vector ma się odnieść. ma się odnieść.

Jest jednak rozwiązanie, jeśli chcemy stworzyć Jest jednak rozwiązanie, jeśli chcemy stworzyć Vector Vector z biblioteki z biblioteki java.utiljava.util należy należy dokładnie określić położenie tej klasydokładnie określić położenie tej klasy

java.util.Vector v = java.util.Vector v = newnew java.util.Vector(); java.util.Vector();• UwagaUwaga

Zawsze gdy tworzymy pakiet, niejawnie określamy strukturę katalogów Zawsze gdy tworzymy pakiet, niejawnie określamy strukturę katalogów przez nadanie mu nazwy. Pakiet musi znajdować się w katalogu wskazywanym przez przez nadanie mu nazwy. Pakiet musi znajdować się w katalogu wskazywanym przez jego nazwę i powinien być dostępny przy przeszukiwaniu katalogów za pomocą jego nazwę i powinien być dostępny przy przeszukiwaniu katalogów za pomocą zmiennej zmiennej CLASSPATHCLASSPATH

1717

Page 18: Referat nr. 1 „Style kodowania” Łukasz Kozień

Logowanie – java.util.loggingLogowanie – java.util.logging

• Logowanie – proces polegający na generacji i gromadzeniu informacji dotyczących Logowanie – proces polegający na generacji i gromadzeniu informacji dotyczących działającego programudziałającego programu

W działającym i przetestowanym programie informacje te mogą opisywać postępy W działającym i przetestowanym programie informacje te mogą opisywać postępy działania programu (rejestrować poszczególne czynności wykonywane podczas działania programu (rejestrować poszczególne czynności wykonywane podczas program)program)

Logowanie (rejestracja) jest też bardzo użyteczna podczas testowania i uruchamiania Logowanie (rejestracja) jest też bardzo użyteczna podczas testowania i uruchamiania programówprogramów

• Obsługa logowania jest możliwa dzięki bibliotece Obsługa logowania jest możliwa dzięki bibliotece java.util.loggingjava.util.logging

• Istnieją również inne biblioteki, za pomocą których możliwa jest rejestracja jak np.. Istnieją również inne biblioteki, za pomocą których możliwa jest rejestracja jak np.. LOG4JLOG4J

1818

Page 19: Referat nr. 1 „Style kodowania” Łukasz Kozień

Logowanie – java.util.loggingLogowanie – java.util.logging

• Prosty program generujący logiProsty program generujący logi

– Wynik działania programu (konsola)Wynik działania programu (konsola)

1919

Projekt.java

import java.util.logging.Logger;

public class Projekt {

private static Logger logger =

Logger.getLogger("InfoLogging");

public static void main(String[] s) {

logger.info("Rejestracja komunikatu");

}

}

2003-10-22 01:12:19 Projekt main

INFO: Rejestracja komunikatu

nazwa klasy

nazwa metody

Page 20: Referat nr. 1 „Style kodowania” Łukasz Kozień

Logowanie – java.util.loggingLogowanie – java.util.logging

• Poprzedni przykład nie daje gwarancji na to, iż nazwa klasy oraz metody będą Poprzedni przykład nie daje gwarancji na to, iż nazwa klasy oraz metody będą poprawne, aby to zrobić możemy użyć metody poprawne, aby to zrobić możemy użyć metody logp()logp()

2020

Projekt.java

import java.util.logging.Level;

import java.util.logging.Logger;

public class Projekt {

private static Logger logger =

Logger.getLogger("InfoLogging");

public static void main(String[] s) {

logger.logp(Level.INFO, "Projekt", "main", "Rejestracja komunikatu");

}

}

poziom rejestracji nazwa klasy nazwa metody rejestrowany komunikat

Page 21: Referat nr. 1 „Style kodowania” Łukasz Kozień

Logowanie – java.util.loggingLogowanie – java.util.logging

• Poziomy rejestracjiPoziomy rejestracji

Istnieje wiele poziomów raportowania, jest możliwość zmiany używanego poziomu Istnieje wiele poziomów raportowania, jest możliwość zmiany używanego poziomu podczas działania programu. (domyślny jest poziom INFO)podczas działania programu. (domyślny jest poziom INFO)

– Poziomy rejestracji przedstawia tabelaPoziomy rejestracji przedstawia tabela

2121

Poziom Rezultat

OFFOFF Żadne komunikaty nie są prezentowane

SEVERESEVERE Prezentowane są wyłącznie komunikaty na poziomie SEVERE

WARNINGWARNING Prezentowane są wyłącznie komunikaty na poziomie WARNING i >

INFOINFO Prezentowane są wyłącznie komunikaty na poziomie INFO i >

CONFIGCONFIG Prezentowane są wyłącznie komunikaty na poziomie CONFIG i >

FINEFINE Prezentowane są wyłącznie komunikaty na poziomie FINE i >

FINERFINER Prezentowane są wyłącznie komunikaty na poziomie FINER i >

FINESTFINEST Prezentowane są wyłącznie komunikaty na poziomie FINEST i >

ALLALL Prezentowane są wszystkie rejestrowane komunikaty

Page 22: Referat nr. 1 „Style kodowania” Łukasz Kozień

Logowanie – java.util.loggingLogowanie – java.util.logging

• LogRecordLogRecord

– Jest to klasa, która zawiera wszystkie informacje dotyczące logów. Wszystkie Jest to klasa, która zawiera wszystkie informacje dotyczące logów. Wszystkie metody tej klasy zostały utworzone zgodnie z konwencją „get” i „set” (wszystkie metody tej klasy zostały utworzone zgodnie z konwencją „get” i „set” (wszystkie metody zaczynają się od „set” lub „get”)metody zaczynają się od „set” lub „get”)

– Aby pobrać informacje z obiektu LogRecord posługujemy się metodami Aby pobrać informacje z obiektu LogRecord posługujemy się metodami pobierającymi, niektóre z nich to:pobierającymi, niektóre z nich to:

• getLoggerName() Nazwa rejestratoragetLoggerName() Nazwa rejestratora

• getMessage()getMessage() Komunikat Komunikat

• getMillis() Czas w milisekundachgetMillis() Czas w milisekundach

• getSourceClassName() Nazwa klasy źródłowejgetSourceClassName() Nazwa klasy źródłowej

• getSourceMethodName() Nazwa metody źródłowejgetSourceMethodName() Nazwa metody źródłowej

• getThreadID() Id wyjątkugetThreadID() Id wyjątku

• getThrown()getThrown() Wyjątek Wyjątek

– Aby wprowadzić informacje do obiektu LogRecord korzystamy z metod Aby wprowadzić informacje do obiektu LogRecord korzystamy z metod zaczynających się od „set”zaczynających się od „set”

– Dokładny spis metod wraz z objaśnieniami znajduje się w dokumentacjiDokładny spis metod wraz z objaśnieniami znajduje się w dokumentacji

2222

Page 23: Referat nr. 1 „Style kodowania” Łukasz Kozień

Logowanie – java.util.loggingLogowanie – java.util.logging

• HandlerHandler

W bardzo łatwy sposób można stworzyć własny obiekt obsługi, wystarczy W bardzo łatwy sposób można stworzyć własny obiekt obsługi, wystarczy stworzy klasę dziedziczącą z Handler i zdefiniować metodę publish() stworzy klasę dziedziczącą z Handler i zdefiniować metodę publish() (oraz metody flush()(oraz metody flush() i close(), zapewniające poprawną obsługę strumienia używanego do publikowani komunikatów) i close(), zapewniające poprawną obsługę strumienia używanego do publikowani komunikatów)

Istnieją jednak, już gotowe, predefiniowane klasy obsługi:Istnieją jednak, już gotowe, predefiniowane klasy obsługi:

– StreamHandler StreamHandler Zapisuje sformatowane rekordy w strumieniu wyjściowym (Zapisuje sformatowane rekordy w strumieniu wyjściowym (OutputStreamOutputStream)) – ConsoleHandlerConsoleHandler Zapisuje sformatowane rekordy w standardowym strumieniu błędów (Zapisuje sformatowane rekordy w standardowym strumieniu błędów (System.errSystem.err))

– FileHandlerFileHandler Zapisuje sformatowane rekordy rejestracyjne do wybranego pliku lub do grupyZapisuje sformatowane rekordy rejestracyjne do wybranego pliku lub do grupy zmienianych plików dziennika zmienianych plików dziennika

– SocketHandler SocketHandler Wykorzystuje protokół TCP, przesyła sformatowane rekordy na port o podanym Wykorzystuje protokół TCP, przesyła sformatowane rekordy na port o podanym numerze numerze

– MemoryHandlerMemoryHandler Gromadzi rekordy rejestracyjne w pamięciGromadzi rekordy rejestracyjne w pamięci

2323

Page 24: Referat nr. 1 „Style kodowania” Łukasz Kozień

Logowanie – java.util.loggingLogowanie – java.util.logging

• Zapisywanie logów do pliku ( i również wyświetlanie ich na konsoli )Zapisywanie logów do pliku ( i również wyświetlanie ich na konsoli )

2424

Projekt.java

import java.util.logging.FileHandler;

import java.util.logging.Logger;

public class Projekt {

private static Logger logger =

Logger.getLogger("LogToFile");

public static void main(String[] s) throws Exception {

logger.addHandler(new FileHandler("LogToFile.xml"));

logger.info("Komunikat ktory znajdzie sie w pliku");

}

}

logger.setUseParentHandlers(logger.setUseParentHandlers(falsefalse); ); // // logi tylko do plikulogi tylko do pliku

Page 25: Referat nr. 1 „Style kodowania” Łukasz Kozień

Logowanie – java.util.loggingLogowanie – java.util.logging

• Domyślnym formatem wyjściowym obiektów FileHandler jest XML. Aby zapisywać logi do pliku tekstowego należy skorzystać z obiektu SimpleFormatter

2525

Projekt.java

import java.util.logging.FileHandler;

import java.util.logging.Logger;

import java.util.logging.SimpleFormatter;

public class Projekt {

private static Logger logger =

Logger.getLogger("LogToFile");

public static void main(String[] s) throws Exception {

FileHandler logFile = new FileHandler("LogToFile.txt");

logFile.setFormatter(new SimpleFormatter());

logger.addHandler(logFile);

logger.info("Komunikat ktory znajdzie sie w pliku");

}

}

Page 26: Referat nr. 1 „Style kodowania” Łukasz Kozień

Logowanie – java.util.loggingLogowanie – java.util.logging

• Dodatek - Rotacyjne zmienianie pliku dziennikaDodatek - Rotacyjne zmienianie pliku dziennika

-zapobiega tworzeniu się za dużych plików z logami-zapobiega tworzeniu się za dużych plików z logami

użycie powyższego kody, spowoduję użycie trzech plików z logami. Kiedy wszystkie użycie powyższego kody, spowoduję użycie trzech plików z logami. Kiedy wszystkie trzy pliki zostaną całkowicie wypełnione, ponownie zacznie być używany pierwszy z trzy pliki zostaną całkowicie wypełnione, ponownie zacznie być używany pierwszy z nich a jego zawartość zostanie nadpisananich a jego zawartość zostanie nadpisana

2626

String pattern = "my%g.log";

int limit = 100000; // 100000 bajtow

int numLogFiles = 3;

FileHandler fh = new FileHandler(pattern, limit, numLogFiles);

// Add to logger

Logger logger = Logger.getLogger("com.mycompany");

logger.addHandler(fh);

Page 27: Referat nr. 1 „Style kodowania” Łukasz Kozień

Logowanie – java.util.loggingLogowanie – java.util.logging

• FiltryFiltry

– Obiekt Obiekt LoggerLogger pozwala na podanie poziomu, na podstawie którego będzie pozwala na podanie poziomu, na podstawie którego będzie decydować, jakie komunikaty będą akceptowane a jakie niedecydować, jakie komunikaty będą akceptowane a jakie nie

Jest to prosty sposób filtrowania, który zupełnie wystarcza, czasami jednak Jest to prosty sposób filtrowania, który zupełnie wystarcza, czasami jednak potrzebne będą bardziej zaawansowane narzędzia filtrujące, które będą potrzebne będą bardziej zaawansowane narzędzia filtrujące, które będą decydowały o odrzuceniu komunikatu na podstawie innych czynników niż poziomdecydowały o odrzuceniu komunikatu na podstawie innych czynników niż poziom

– W tym celu należy stworzyć własny obiekt W tym celu należy stworzyć własny obiekt FilterFilter, który jest interfejsem , który jest interfejsem posiadającym jedną metodę posiadającym jedną metodę isLoggable(LogRecord rekord)isLoggable(LogRecord rekord) zwracającą wartość zwracającą wartość booleanboolean

– Po stworzeniu obiektu Po stworzeniu obiektu FilterFilter należy go zarejestrować w obiekcie należy go zarejestrować w obiekcie LoggerLogger lub lub HandlerHandler przy użyciu metody przy użyciu metody setFilter()setFilter()

– Można np. rejestrować wyłącznie komunikaty o obiektach Kwadrat, mimo iż Można np. rejestrować wyłącznie komunikaty o obiektach Kwadrat, mimo iż przed zastosowaniem filtra rejestrowane są komunikaty również o innych przed zastosowaniem filtra rejestrowane są komunikaty również o innych obiektach np. Trojkatobiektach np. Trojkat

2727

Page 28: Referat nr. 1 „Style kodowania” Łukasz Kozień

Logowanie – java.util.loggingLogowanie – java.util.logging

• FormatterFormatter

– Jest to obiekt formatujący Jest to obiekt formatujący LogRecordLogRecord, który zwraca w postaci łańcucha znaków, który zwraca w postaci łańcucha znaków

– Aby stworzyć własny obiekt Aby stworzyć własny obiekt FormatterFormatter, należy stworzyć klasę dziedziczącą z , należy stworzyć klasę dziedziczącą z Formatter Formatter a następnie przesłonić metodę a następnie przesłonić metodę format(LogRecord rekord)format(LogRecord rekord)

– Trzeba zarejestrować obiekt formatujący w obiekcie obsługi, posługując się Trzeba zarejestrować obiekt formatujący w obiekcie obsługi, posługując się metodą metodą setFormatter()setFormatter()

– Każdy rejestrator posiada domyślny obiekt obsługiKażdy rejestrator posiada domyślny obiekt obsługi

2828

Page 29: Referat nr. 1 „Style kodowania” Łukasz Kozień

LOG4JLOG4J

• LOG4J – jest to biblioteka służąca do logowania i debugowania w projekcieLOG4J – jest to biblioteka służąca do logowania i debugowania w projekcie• Nacisk przy projektowaniu biblioteki został położony na szybkość działaniaNacisk przy projektowaniu biblioteki został położony na szybkość działania• Rozpowszechniana jest na podstawie licencji open-source przez Apache Software Rozpowszechniana jest na podstawie licencji open-source przez Apache Software

FundationFundation• Trzy podstawowe komponenty systemu logowania udostępnianego przez LOG4JTrzy podstawowe komponenty systemu logowania udostępnianego przez LOG4J

– kategorie (categories)kategorie (categories)Pozwalają na podzielenie przestrzeni logowania na kategorie i skonfigurowanie każdej z Pozwalają na podzielenie przestrzeni logowania na kategorie i skonfigurowanie każdej z

kategorii w osobny sposób. Kategorie te zorganizowane są w strukturę hierarchicznąkategorii w osobny sposób. Kategorie te zorganizowane są w strukturę hierarchicznąZ kategorią związany jest jej priorytetZ kategorią związany jest jej priorytetBiblioteka LOG4J pozwala na włączenie lub wyłączenie komunikatów o odpowiednich Biblioteka LOG4J pozwala na włączenie lub wyłączenie komunikatów o odpowiednich

priorytetach dla odpowiednich kategorii.priorytetach dla odpowiednich kategorii.

– przeznaczenia (appenders)przeznaczenia (appenders)Pozwalają na określenie przeznaczenia logów związanych z daną kategorią. Pozwalają na określenie przeznaczenia logów związanych z daną kategorią.

Przeznaczeniem logów może być np., konsola lub plikPrzeznaczeniem logów może być np., konsola lub plikLogi wysyłane do pliku mogą być zawijane (rolling), co chroni nas przed logami o zbyt Logi wysyłane do pliku mogą być zawijane (rolling), co chroni nas przed logami o zbyt

dużej wielkości. Dla zawijanego pliku z logami może być tworzona jego kopia dużej wielkości. Dla zawijanego pliku z logami może być tworzona jego kopia bezpieczeństwa (backup)bezpieczeństwa (backup)

– formaty (layouts)formaty (layouts)Pozwalają na określenie formatu logów powiązanych z danym przeznaczeniem.Pozwalają na określenie formatu logów powiązanych z danym przeznaczeniem.

• Najnowsza wersja biblioteki wraz z dokumentacją może zostać pobrana pod adresem:Najnowsza wersja biblioteki wraz z dokumentacją może zostać pobrana pod adresem:http://jakarta.apache.org/log4jhttp://jakarta.apache.org/log4j

2929

Page 30: Referat nr. 1 „Style kodowania” Łukasz Kozień

LOG4JLOG4J

• Środowisko LOG4J jest w pełni konfigurowalne programowo, jednak lepiej jest Środowisko LOG4J jest w pełni konfigurowalne programowo, jednak lepiej jest używać plików konfiguracyjnych, które mogą być napisane w XML lub w formacieużywać plików konfiguracyjnych, które mogą być napisane w XML lub w formacie

key=valuekey=value

3030

MyApp.java

import org.apache.log4j.Logger;

import org.apache.log4j.BasicConfigurator;

public class MyApp {

static Logger logger = Logger.getLogger(MyApp.class);

public static void main(String[] args) {

// Set up a simple configuration that logs on the console.

BasicConfigurator.configure();

logger.info("Entering application.");

logger.info("Exiting application.");

}

}

Page 31: Referat nr. 1 „Style kodowania” Łukasz Kozień

LOG4JLOG4J

• Plik java wykorzystujący plik konfiguracyjnyPlik java wykorzystujący plik konfiguracyjny

3131

MyApp.java

import org.apache.log4j.Logger;

import org.apache.log4j.PropertyConfigurator;

public class MyApp {

static Logger logger = Logger.getLogger(MyApp.class.getName());

public static void main(String[] args) {

// BasicConfigurator replaced with PropertyConfigurator.

PropertyConfigurator.configure(args[0]);

logger.info("Entering application.");

logger.info("Exiting application.");

}

}

Page 32: Referat nr. 1 „Style kodowania” Łukasz Kozień

LOG4JLOG4J

• Plik konfiguracyjnyPlik konfiguracyjny

• Wyniki działania programuWyniki działania programu

3232

# Set root logger level to DEBUG and its only appender to A1.

log4j.rootLogger=DEBUG, A1

# A1 is set to be a ConsoleAppender.

log4j.appender.A1=org.apache.log4j.ConsoleAppender

# A1 uses PatternLayout.

log4j.appender.A1.layout=org.apache.log4j.PatternLayout

log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

0 [main] INFO MyApp - Entering application.

51 [main] INFO MyApp - Exiting application.

Page 33: Referat nr. 1 „Style kodowania” Łukasz Kozień

LOG4JLOG4J

• Przykładowy plik konfiguracyjny zapisujący logi na konsole i do plikuPrzykładowy plik konfiguracyjny zapisujący logi na konsole i do pliku

3333

log4j.rootLogger=debug, stdout, R

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

# Pattern to output the caller's file name and line number.

log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

log4j.appender.R=org.apache.log4j.RollingFileAppender

log4j.appender.R.File=example.log

log4j.appender.R.MaxFileSize=100KB

# Keep one backup file

log4j.appender.R.MaxBackupIndex=1

log4j.appender.R.layout=org.apache.log4j.PatternLayout

log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n

Page 34: Referat nr. 1 „Style kodowania” Łukasz Kozień

LOG4JLOG4J

• Uwaga !Uwaga !

– Klasy dotyczące logowania powinno się przykrywać własnymi klasami, w celuKlasy dotyczące logowania powinno się przykrywać własnymi klasami, w celu

łatwiejszej późniejszej modyfikacji łatwiejszej późniejszej modyfikacji

3434

Page 35: Referat nr. 1 „Style kodowania” Łukasz Kozień

KONIECKONIEC

3535