1 / 35

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

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

Download Presentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. Spis treści • Formatowanie kodu i nazewnictwo • Struktura katalogów w projekcie • JAR - Archiwa Javy • Pakiety • Logowanie - java.util.logging • LOG4J 2

  3. 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

  4. 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

  5. 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

  6. 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

  7. 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

  8. Struktura katalogów w projekcie • Strukturę katalogów w projekcie przedstawia tabela: 8

  9. 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

  10. 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

  11. 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

  12. 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

  13. JAR – Archiwa Javy • Przykład 13

  14. 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

  15. 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

  16. Pakiety • Przykład 16

  17. 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

  18. 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

  19. Logowanie – java.util.logging • Prosty program generujący logi • Wynik działania programu (konsola) nazwa klasy nazwa metody 19

  20. 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

  21. 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

  22. 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

  23. 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

  24. 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

  25. 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

  26. 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

  27. 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

  28. 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

  29. 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

  30. 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

  31. LOG4J • Plik java wykorzystujący plik konfiguracyjny 31

  32. LOG4J • Plik konfiguracyjny • Wyniki działania programu 32

  33. LOG4J • Przykładowy plik konfiguracyjny zapisujący logi na konsole i do pliku 33

  34. LOG4J • Uwaga ! • Klasy dotyczące logowania powinno się przykrywać własnymi klasami, w celu łatwiejszej późniejszej modyfikacji 34

  35. KONIEC 35

More Related