20 lutego 2008

SCJP - Poprawne identyfikatory i konwencje nazewnicze

Poprawne identyfikatory i konwencje nazewnicze, czyli "Legal Identifiers" oraz "Sun's Java Code Conventions". Tak jak zapowiedziałem w artykule "Przygotowania do SCJP czas zacząć" zaczynam serię artykułów. Dzisiejszy temat wydaje się być banalny, ale jak się okazało i w tej dziedzinie nie wszystko jest jasne i oczywiste - można się czegoś nauczyć.

Każda klasa (no, poza klasami anonimowymi), interfejs, metoda, zmienna czy stała muszą się jakoś nazywać. Właściwe nadawanie nazw ma dwa wymiary. Po pierwsze, nazwa musi być poprawna – bez tego nasz kod się po prostu nie skompiluje – po drugie, nazwa powinna być "ładna", ze względu na czytelność kodu. Poprawność nazwy (identyfikatora) określają następujące zasady:

- Musi zaczynać się od litery (alfabetem jest Unicode, więc dozwolone są litery polskie i każde inne), symbolu waluty, w praktyce ‘$’, albo znaku łączącego, czyli chyba tylko ‘_’, bo ‘-‘ już nie. Każdy kolejny znak identyfikatora może być dodatkowo cyfrą, ale pierwszy nie!

- Nie ma ograniczenia na długość nazwy.

- Identyfikatorem nie może być słowo kluczowe języka, upewnijmy się tutaj, że znamy wszystkie słowa kluczowe, w tym te rzadziej stosowane jak: continue, goto, native, strictfp, transient, volatile, enum.

- Java jest wrażliwa na wielkość liter (ang. case-sensitive), litera ‘f’ nie jest w końcu tym samym co litera ‘F’, tak więc ‘Foo’ jest czym innym niż ‘foo’. Jakby się zastanowić to jest to oczywiste, w końcu typ prymitywny boolean to co innego niż klasa Boolean. Wartością typu boolean też może być tylko true albo false, a nie np. TRUE.

Innym zagadnieniem jest "ładność" (ang. naming convention) nazwy, tj. zgodność z zaleceniami Sun’a. Jeśli chodzi o identyfikatory to można to ograniczyć do następujących zasad:

- Nazwy klas i interfejsów powinny być zlepkiem słów pisanych wielką literą (pierwsza wielka a reszta mała), czyli np. SourceManager ale nie sourceManager czy SOURCE_MANAGER. Taki styl nazewniczy określa się czasem mianem "camel case".

- Podobno, nazwy interfejsów powinny być też zazwyczaj przymiotnikami (ang. adjective), np. Serializable, ale jakoś nie specjalnie pasuje mi to do większości interfejsów typowego programu, ot weźmy takie klasy i interfejsy DAO. W każdym razie na egzamin lepiej wiedzieć jakie jest zalecenie :)

- Metody obowiązują te same zasady co klasy, z tym że pierwsza litera musi być mała a nie wielka, czyli np. getData a nie GetData. Dodatkowo, nazwy powinny być parami czasownik-rzeczownik (ang. verb-noun), np. getData czy setCustomerId. Książka przemilcza problem skrótów w stylu DAO czy ID. Z ogólnych zasad wynika, że właściwą nazwą jest właśnie setCustomerId, ale czy na pewno nie powinno być setCustomerID?

- Zmienne, tak jak metody powinny być zlepkiem słów pisanych wielką literą, z tym wyjątkiem, że pierwsza litera musi być mała. Poza tym, jak zawsze jest zalecenie, aby nazwy były znaczące i możliwie, ale nie przesadnie zwięzłe, np. firstName albo po prostu name.

- Stałe to takie "zmienne" oznaczone modyfikatorami static i final. Zalecane jest, aby identyfikator dla stałej składał się ze słów pisanych samymi wielkimi literami połączonymi znakiem ‘_’, np. MAX_THREADS.

4 komentarze:

koziołek pisze...

Cześć,
dorzucę mały komentarz, bo sam aktualnie siedzę nad tym egzaminem. Bardzo dobrym źródłem wiedzy jest specyfikacja języka Java. Wiele pytań teoretycznych jest wprost z tego dokumentu.

Mariusz Lipiński pisze...

Rozumiem, że mówisz o książce "The Java Language Specification" - http://java.sun.com/docs/books/jls/. Nawet znalazłem to u siebie na dysku w postaci .pdf'a (nigdy nie czytałem jednak). Jak będę miał niedosyt po lekturze "SCJP Sun Certified Programmer for Java 5 Study Guide (Exam 310-055)" to pewnie się za to zabiorę ale mam nadzieję, że nie będzie to konieczne :)

koziołek pisze...

Dokładnie. Książka w przeciwieństwie do "SCPJ... 055" zawiera "czystą" informację. Koniec końców to specyfikacja.

RMK pisze...

Jedno ale, klasy anonimowe posiadają nazwy. Nazwą jest po prostu NazwaKlasyZamykajacej$kolejnyNumerZaczynajacOd0

Do nauki do SCJP polecam programik symulujący egzamin, ja używałem Enthuware, podana książka jest całkiem całkiem.
Specyfikacji języka nie polecam, zbyt trudno złapać powiązanie między tematem opisywanym w specyfikacji, a praktyką potrzebną do kodowania i zdania SCJP. Jedna rzecz która dobrze przeczytać w specyfikacji to informacja o modyfikatorach dostępu, bo wszyscy programiści przyjmują, że dotyczą one klasy, ale naprawdę celem który przyświecał w trakcie ich tworzenia było tworzenie dobrego API dla pakietu.
Stąd można się zdziwić, że coś takiego nie zadziała:
package a;
public class A {
protected int getToster() {
return 7;
}
}

package b;
public class B extends a.A {
public void doSth(A a) {
a.getToster(); /// błąd
}
}