350 likes | 573 Views
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
E N D
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 • Linie programu nie powinny być dłuższe niż 80 znaków (długie linie powinny być łamane) // Łamanie linii po przecinku publicvoid zrobCos(String slowo1, String slowo2, String slowo3, String slowo4) throws Exeption { } // Łamanie linii przed operatorem zmienna = zmienna1 * ( zmienna2 + zmienna3 - zmienna4) + zmienna5 * zmienna6; Złamane linie należy wcinać o kilka tabulacji aby kod stał się przejrzysty (tabulacje o rozmiarze 4 znaków) 3
Formatowanie kodu i nazewnictwo • Miejsca w których należy stosować spację: • Po słowie kluczowym po którym występuje nawias if (warunek) { } • Po przecinkach w liście parametrów funkcji • Spacja powinna oddzielać operatory od operandów zmienna += zmienna1 + zmienna2; Wyjątek: zmienna3++; • Spacja powinna oddzielać kolejne elementy w wyrażeniufor for (init; war; krok) { } • W celu oddzielenia operatora rzutowania od rzutowanego wyrażenia (int) zmienna • Nie umieszczaj odstępu pomiędzy nawiasami początkowym i końcowym funkcji czy wyrażeń public voidzrobCos(String zmienna) { } 4
Formatowanie kodu i nazewnictwo • Każdą zmienną należy deklarować w osobnej linii String zmienna1; String zmienna2; • Parametry metod z przerwą po przecinku public voidzrobCos(String zmienna1, String zmienna2) {} • Nawias otwierający listę parametrów metody nie powinien być oddzielony żadną przerwą od nazwy metody (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 ze słów składowych musi się zaczynać od dużej litery class JakasNazwaKlasy { } • 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 litery void nazwaMetody(int zmienna) { } 5
Formatowanie kodu i nazewnictwo • Nazwy pakietów • Pisane jest małymi literami • Jeśli składa się z wielu słów, to wówczas nie wprowadza się żadnego separatora packagejakas.nazwa.pakietu • Nazwa pakietu powinna odpowiadać następującemu szablonowi <high level domain name>.<company name>.<project name>.<module name> <high level domain name> - nazwa domeny najwyższego poziomu com, edu, net, org lub dwuliterowy kod kraju (ISO) <company name> - nazwa firmy lub organizacji realizującej projekt <project name> - nazwa projektu <module name> - nazwa modułu projektu Kolejne elementy są dowolne • Jeśli nie posiadamy własnej domeny, zmuszeni jesteśmy do wymyślenia mało prawdopodobnej kombinacji (własne imię i nazwisko) 6
Formatowanie kodu i nazewnictwo • Stałe pisane są dużymi literami, poszczególne słowa oddzielane są od siebie znakiem podkreślenia public static final NEW_LINE = ”\n”; • Edytor Eclipse sam koloruje nasz kod oraz formatuje zgodnie z przyjętą konwencją • Dokładne informacje można znaleźć w dokumencie Code Conventions for the Java Programming Language, który znajduje się na stronie http://java.sun.com/docs/codeconv/index.html 7
Struktura katalogów w projekcie • Strukturę katalogów w projekcie przedstawia tabela: 8
JAR – Archiwa Javy • JAR (Java ARchive) – własny format Javy, w którym wykorzystywany jest format ZIP • Służy do zbierania grupy plików do pojedynczego, skompresowanego pliku • Format JAR jest niezależny od platformy, nie trzeba się martwić o reprezentację danych • Kompresować do formatu JAR można także pliki graficzne jak i audio • Korzystanie 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, konieczne jest tylko jedno zapytanie serwera, a transfer jest szybszy z powodu kompresji. Przed wprowadzeniem tego formatu przeglądarka sieciowa musiała ponawiać żądania ściągnięcia z serwera wszystkich nie skompresowanych plików klas składających się na aplet. • Każdy wpis w pliku JAR może być zaopatrzony w podpis cyfrowy w celu zachowania bezpieczeństwa • Archiwum JAR składa się z pojedynczego pliku zawierającego zbiór plików skompresowanych oraz wykaz (ang. manifest) 9
JAR – Archiwa Javy • Narzędzie jarrozprowadzane jest razem z JDK (Java Developers Kit) Suna, automatycznie kompresuje pliki wskazane przez użytkownika • Wywołuje się z wiersza poleceń jar [opcje] plik_docelowy [wykaz] plik[i] • Wykaz opcji: • c Tworzy nowe lub puste archiwum • t Wypisuje zawartość archiwum • x Wydobywa wszystkie pliki • x plik Wydobywa wskazany plik • f Wymusza podanie nazwy pliku. Brak tej opcji, jar zinterpretuje że dane będą pochodziły ze standardowego wejścia, lub że ma wysyłać dane na standardowe wyjście (gdy będzie tworzył plik) • m Pierwszy argument będzie nazwą wykazu stworzonego przez użytkownika • v Zwiększa liczbę prezentowanych informacji – jar będzie wypisywał co robi • 0 Jedynie przechowuje pliki, bez kompresji. (np. można stworzyć plik JAR i dołączyć go do zmiennej środowiskowej CLASSPATH • m Zapobiega automatycznemu utworzeniu wykazu 10
JAR – Archiwa Javy • Jeśli wśród plików danych do kompresji programowi jar znajduje się podkatalog wszystkie zawarte w nim pliki i podkatalogi również zostaną automatycznie dołączone do archiwum a informacja o ścieżce zostanie zapamiętana • Przykłady wywołań programu jar jar cf mojPlikJar.jar *.class Stworzone zostanie archiwum mojPlikJar.jar, zawierające wszystkie pliki klas z katalogu bieżącego, razem z automatycznie wygenerowanym wykazem jar cmf mojPlikJar.jar mojWykaz.mf *.class To samo, ale z włączonym wykazem stworzonym przez użytkownika jar tf mojPlikJar.jar Wypisanie listy plików zawartych w mojPlikJar.jar jar tvf mojPlikJar.jar Bardziej szczegółowe informacje o plikach (opcja v) jar cvf mojAplet.jar audio klasy obrazy Zakładając że audio, klasy i obrazy to podkatalogi, pliki w nich zawarte zostaną włączone do pliku mojAplet.jar • Wady programu jar • Nie można dodać ani usunąć plików z istniejącego pliku JAR, trzeba go stworzyć od zera (jeżeli się używa polecenia jar, gdyż można dodać pliki np. WinZipem) 11
JAR – Archiwa Javy • 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 dodać wtedy do archiwum własny plik manifestu. • Plik manifestu • Przykładowy plik: • Plik ten może zawierać również inne pola np. Signature-Version, Class-Path , Extension-List, Main-Class • Możemy uruchomić program spakowany do archiwum JAR poprzez polecenie: java –jarnazwa_pliku.jar jednak aby program się uruchomił należy dodać do pliku manifestu linijkę: Main-Class: nazwa klasy z metodą main (klasa jaka ma być wywołana) • Można np. pod Windowsem skojarzyć pliki *.jar z wykonywalnymi i uruchamiać jak zwykłego programy 12
JAR – Archiwa Javy • Przykład 13
Pakiety • Pakiety (Package) w Javie są to podzbiory bibliotek, które mają podobne funkcje • Pakiety mogą zwierać interfejsy • Ważniejsze pakiety w Javie to • java.lang.* - Pakiet zawierający wszystkie podstawowe klasy Javy. Nie musi być jawnie importowany, gdyż kompilator czyni to w sposób automatyczny • java.util.* - Pomocnicze klasy użytkowe (np. generacja liczb losowych, operacje na ciągach znaków, ...) • java.io.* - obsługa wejścia/wyjścia • java.net.* - Zawiera klasy konieczne do tworzenia oprogramowania wykorzystującego sieć • java.awt.* - Klasy służące do tworzenia graficznego interfejsu użytkownika(GUI) • java.applet.* - Pakiet zawierający klasy używane podczas tworzenia appletów • Użycie słowa kluczowego import, służy do włączenia całej biblioteki np. importjava.util.*; Powoduje wprowadzenie do programu całej biblioteki util • 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 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 zamieszanie 14
Pakiety • Jeżeli chcemy importować pojedynczą klasę, możemy wymienić jej nazwę w instrukcji import import java.util.ArrayList; Można teraz używać ArrayList, natomiast inne klasy pakietu java.util nie będą dostępne • Możemy również używać pełnej nazwy java.util.ArrayList (można to robić bez instrukcji import) • Gdy tworzymy bibliotekę z której będą korzystały inne programy Javy trzeba zapobiec konfliktom nazw klas (patrz. „Formatowanie kodu i nazewnictwo”) • Każdy plik źródłowy definiujący pakiet rozpoczyna się następującą linią: package <nazwa.pakietu> Instrukcja package musi stanowić w pliku pierwszy element nie będący komentarzem • 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 „packagejava.awt;” Po ich skompilowaniu pliki (*.class) znajdować się będą w 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 organizuje deklaracje importów 15
Pakiety • Przykład 16
Pakiety • Kolizje Jeśli program importuje z użyciem znaku * dwie biblioteki zawierające te same nazwy np. import com.firma.* import java.util.* Załóżmy że com.firma zawiera klasę Vector, którą również zawiera java.util, co powoduje potencjalną kolizję Jednak kolizja będzie miała miejsce dopiero wtedy, gdy użyjemy kodu który ją wywoła np. Vector v =newVector(); Dlatego iż kompilator nie wie do której klasy Vector ma się odnieść. Jest jednak rozwiązanie, jeśli chcemy stworzyć Vector z biblioteki java.util należy dokładnie określić położenie tej klasy java.util.Vector v = new java.util.Vector(); • Uwaga Zawsze gdy tworzymy pakiet, niejawnie określamy strukturę katalogów 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ą zmiennej CLASSPATH 17
Logowanie – java.util.logging • Logowanie – proces polegający na generacji i gromadzeniu informacji dotyczących działającego programu W działającym i przetestowanym programie informacje te mogą opisywać postępy działania programu (rejestrować poszczególne czynności wykonywane podczas program) Logowanie (rejestracja) jest też bardzo użyteczna podczas testowania i uruchamiania programów • Obsługa logowania jest możliwa dzięki bibliotece java.util.logging • Istnieją również inne biblioteki, za pomocą których możliwa jest rejestracja jak np.. LOG4J 18
Logowanie – java.util.logging • Prosty program generujący logi • Wynik działania programu (konsola) nazwa klasy nazwa metody 19
Logowanie – java.util.logging • Poprzedni przykład nie daje gwarancji na to, iż nazwa klasy oraz metody będą poprawne, aby to zrobić możemy użyć metody logp() poziom rejestracji nazwa klasy nazwa metody rejestrowany komunikat 20
Logowanie – java.util.logging • Poziomy rejestracji Istnieje wiele poziomów raportowania, jest możliwość zmiany używanego poziomu podczas działania programu. (domyślny jest poziom INFO) • Poziomy rejestracji przedstawia tabela 21
Logowanie – java.util.logging • LogRecord • 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 zaczynają się od „set” lub „get”) • Aby pobrać informacje z obiektu LogRecord posługujemy się metodami pobierającymi, niektóre z nich to: • getLoggerName() Nazwa rejestratora • getMessage() Komunikat • getMillis() Czas w milisekundach • getSourceClassName() Nazwa klasy źródłowej • getSourceMethodName() Nazwa metody źródłowej • getThreadID() Id wyjątku • getThrown() Wyjątek • Aby wprowadzić informacje do obiektu LogRecord korzystamy z metod zaczynających się od „set” • Dokładny spis metod wraz z objaśnieniami znajduje się w dokumentacji 22
Logowanie – java.util.logging • Handler W bardzo łatwy sposób można stworzyć własny obiekt obsługi, wystarczy stworzy klasę dziedziczącą z Handler i zdefiniować metodę publish() (oraz metody flush() i close(), zapewniające poprawną obsługę strumienia używanego do publikowani komunikatów) Istnieją jednak, już gotowe, predefiniowane klasy obsługi: • StreamHandler Zapisuje sformatowane rekordy w strumieniu wyjściowym (OutputStream) • ConsoleHandlerZapisuje sformatowane rekordy w standardowym strumieniu błędów (System.err) • FileHandlerZapisuje sformatowane rekordy rejestracyjne do wybranego pliku lub do grupy zmienianych plików dziennika • SocketHandler Wykorzystuje protokół TCP, przesyła sformatowane rekordy na port o podanym numerze • MemoryHandlerGromadzi rekordy rejestracyjne w pamięci 23
Logowanie – java.util.logging • Zapisywanie logów do pliku ( i również wyświetlanie ich na konsoli ) logger.setUseParentHandlers(false); // logi tylko do pliku 24
Logowanie – 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 25
Logowanie – java.util.logging • Dodatek - Rotacyjne zmienianie pliku dziennika -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 trzy pliki zostaną całkowicie wypełnione, ponownie zacznie być używany pierwszy z nich a jego zawartość zostanie nadpisana 26
Logowanie – java.util.logging • Filtry • Obiekt Logger pozwala na podanie poziomu, na podstawie którego będzie decydować, jakie komunikaty będą akceptowane a jakie nie 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ą decydowały o odrzuceniu komunikatu na podstawie innych czynników niż poziom • W tym celu należy stworzyć własny obiekt Filter, który jest interfejsem posiadającym jedną metodę isLoggable(LogRecord rekord) zwracającą wartość boolean • Po stworzeniu obiektu Filter należy go zarejestrować w obiekcie Logger lub Handler przy użyciu metody setFilter() • Można np. rejestrować wyłącznie komunikaty o obiektach Kwadrat, mimo iż przed zastosowaniem filtra rejestrowane są komunikaty również o innych obiektach np. Trojkat 27
Logowanie – java.util.logging • Formatter • Jest to obiekt formatujący LogRecord, który zwraca w postaci łańcucha znaków • Aby stworzyć własny obiekt Formatter, należy stworzyć klasę dziedziczącą z Formatter a następnie przesłonić metodę format(LogRecord rekord) • Trzeba zarejestrować obiekt formatujący w obiekcie obsługi, posługując się metodą setFormatter() • Każdy rejestrator posiada domyślny obiekt obsługi 28
LOG4J • LOG4J – jest to biblioteka służąca do logowania i debugowania w projekcie • Nacisk przy projektowaniu biblioteki został położony na szybkość działania • Rozpowszechniana jest na podstawie licencji open-source przez Apache Software Fundation • Trzy podstawowe komponenty systemu logowania udostępnianego przez LOG4J • kategorie (categories) Pozwalają na podzielenie przestrzeni logowania na kategorie i skonfigurowanie każdej z kategorii w osobny sposób. Kategorie te zorganizowane są w strukturę hierarchiczną Z kategorią związany jest jej priorytet Biblioteka LOG4J pozwala na włączenie lub wyłączenie komunikatów o odpowiednich priorytetach dla odpowiednich kategorii. • przeznaczenia (appenders) Pozwalają na określenie przeznaczenia logów związanych z daną kategorią. Przeznaczeniem logów może być np., konsola lub plik 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 bezpieczeństwa (backup) • formaty (layouts) Pozwalają na określenie formatu logów powiązanych z danym przeznaczeniem. • Najnowsza wersja biblioteki wraz z dokumentacją może zostać pobrana pod adresem: http://jakarta.apache.org/log4j 29
LOG4J • Ś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 formacie key=value 30
LOG4J • Plik java wykorzystujący plik konfiguracyjny 31
LOG4J • Plik konfiguracyjny • Wyniki działania programu 32
LOG4J • Przykładowy plik konfiguracyjny zapisujący logi na konsole i do pliku 33
LOG4J • Uwaga ! • Klasy dotyczące logowania powinno się przykrywać własnymi klasami, w celu łatwiejszej późniejszej modyfikacji 34
KONIEC 35