Portál AbcLinuxu, 3. května 2024 16:36

Proč právě Java?

19. 2. 2002 | Leoš Literák
Články - Proč právě Java?  

V minulém díle jste se dočetli, proč jsem přešel od PHP. Dnes se dovíte, proč jsem zvolil Javu.

Hlavní důvod, proč jsem zvolil Javu, byl veskrze praktický - pracuji s ní totiž každý den. Proč bych se měl učit něco jiného, když Java mi poskytuje vše potřebné? Pokud jste v něčem dobří, používejte to. Nemá smysl přecházet na nějaký jiný jazyk jen proto, že je to zrovna módní. Důležité jsou jen dvě věci:
  1. vaše produktivita
  2. kvalita kódu
Produktivita znamená, jak rychle dokážete přidat nové vlastnosti či funkce. K čemu vám bude sebelepší knihovna, když s ní neumíte pracovat? Pro mně se takovou černou můrou stal Webwork. Jedná se o velmi hezkou knihovnu poskytující pull verzi Model-View-Controller architektury, ale nedokázal jsem v ní vytvořit ani tu nejjednodušší stránku. Ztratil jsem při jejím učení a experimentech nejméně týden. Takže než přejdete k něčemu novému, ujistěte se, že to stojí za to.

Základem každého projektu je kvalita kódu. Sebelepší design je zhacen, pokud programátor píše hrozně. A naopak, ani nejlepší profík nezachrání špatně navržený design. Kód musí být přehledný, snadno čitelný a rozdělen do logicky souvisejících celků. Pokud budete psát kvalitní kód, ušetříte si spoustu času při ladění kódu, hledání chyb a přidávání nových vlastností.

Naprosto zásadním požadavkem je dokumentace. I když píšete jen pro sebe. Nevěříte? Zkuste se podívat někam doprostřed delšího souboru u projektu, který jste rok neviděli? Jak dlouho vám potrvá, než pochopíte, jaký má ta část účel a s čím je propojena? Ja vím, je to hrozně těžké, zláště když vás tlačí termín. Jenže minuta dokumentace vám ušetří deset minut při pozdější údržbě.

Java mi nabízí dobré podmínky pro splnění těchto požadavků. Ve svém jádře obsahuje několik stovek tříd s podporou všech zásadních funkcí, které programátor potřebuje. Ať už jsou to seznamy, mapy, práce s kalendářem, se soubory, se sokety, s databází, s řetězci, uživatelské rozhraní a tak bych mohl dlouho pokračovat.

Sun si dává záležet na čistotě jazyka, takže vývoj v Javě je intuitivní. Díky hezky navržené hierachii tříd se spousta věcí programuje stejně. Například takový InputStream. Hlavními metodami jsou read() a close(). Použití je snadné. Naučíte se s nimi pracovat třeba při čtení ze standardního vstupu. Později začnete pracovat se soubory a ejhle - rozhraní je stejné. Až se dostanete k soketům či komprimovaným archivům, opět použijete stejné metody a nemusíte se učit nic nového. Takhle je to v Javě se vším - čistota designu a produktivita práce jsou na prvním místě.

Asi bych se měl zmínit i o dalších aspektech jazyka, které zvyšují efektivitu programátora.

  1. Striktní pojetí jazyka. Pokud bych parafrázoval reklamu, pak co je v Cečku povoleno, to je v Javě zakázáno. Na jedné straně se můžete cítit svázáni regulemi jazyka, jenže postupem času zjistíte, že tvůrci jazyka pro to měli dobrý důvod. Java vám nedovolí udělat některé chyby z nepozornosti, tak typické pro C/C++. Spoustu chyb odhalí již při kompilaci. A to je lepší, než když spadne družice kvůli překlepu.
  2. Žádné ukazatele. Nemusíte si pamatovat, kdy použít referenci a kdy dereferenci. Pointery jsou danajským darem pro Cečko. Na jedné straně díky ním můžete psát maximálně efektivní kód, na druhé straně snad polovina chyb pramení z jejich špatného použití. Všechny ty neoprávněné přístupy do paměti či SIGSEGVy kvůli špatné pointerové matematice jsou v Javě nemožné. Každá proměnná buď odkazuje na platný objekt správného typu nebo je rovna null. Inicializované pole obsahuje položku length. A pokud si přesto nedáváte pozor a použijete neexistující prvek, vyskočí NullPointerException či ArrayIndexOutOfBoundsException.
  3. Nutnost přetypovat čísla při ztrátě přesnosti. Například pokud přiřazujete int do byte. Céčko vám díky automatické konverzi vezme cokoliv, Java si vyžádá potvrzení vašeho úmyslu byte b = (byte)i;. Zdá se vám to zbytečná buzerace? V 80% případů potvrdím svůj úmysl doplnění přetypování, ale ve zbylé pětině se zarazím a změním typ deklarované proměnné. A děsím se představy, za jakých okolností by se tato chyba projevila.
  4. V podmínkách musí být jen logické výrazy. Céčko sice díky předpokladu, že nula je false a vše ostatní je true, umožní programátoru neskutečné optimalizace a kejkle, ale zároveň i příšerné chyby. Například tento nekonečný cyklus je v Céčku platný, v Javě jej zamítne už kompilátor:
    int i = 2, j = 2;
    while ( i=j ) i++;
    
    Pro méně pozorné, programátor zapomněl jedno rovnítko, takže se z testu rovnosti stalo přiřazení nenulové hodnoty. A to v Cečku nabývá vždy hodnoty true. Kompilátor Javy by našel číselný výraz na místě, kde očekával výraz logický a odmítl by pokračovat.
  5. Vyjímky zásadně zjednodušují řešení chybových stavů a zpřehledňují zdrojový kód. Například programujete odmocninu celých čísel. V Cečku byste museli pro záporná čísla buď vracet hodnotu rezervovanou pro chybu či nastavovat globální proměnnou (typicky errno). A pak spoléhat na to, že programátor nezapomene ji otestovat. V Javě prostě hned na začátku při testu platnosti vstupních dat vyhodíte vyjímku a i kdyby ji programátor ignoroval, za běhu programu je možné zjistit, v které části (či dokonce na kterém řádku) je chyba.
  6. Dědičnost a garbage collector. Každý objekt v Javě je potomkem třídy Object. Hierarchie tříd proto tvoří stromovou strukturu. Díky tomu je snadné napsat metodu, jejímž parametrem může být libovolný objekt. Šablony z C++ se mohou zahrabat hanbou! Java nepodporuje vícenásobnou dědičnost, ale rozhraní jsou dostatečnou náhradou této obtížné vlastnosti. Opět vás to přinutí psát čistší kód. A automatický garbage collector je rájem pro zapomnětlivce, kteří zapomínali volat destruktor v C++ a zahltili tak volnou paměť. Pravda, implementace by mohla být efektivnější, ale koncept je výborný.
  7. Javadoc. Psát dokumentaci je díky němu opravdu snadné. Hned jak nadeklarujete metodu, měli byste k ní ihned napsat dokumentaci. Později příkazem javadoc lze extrahovat veškerou dokumentaci do podoby html.
Výše zmíněné vlastnosti jazyka umožňují psát přehledný kód, který neobsahuje některé třídy chyb z nepozornosti. Pokud budete psát v Javě, sníží se nepoměr mezi časem potřebný k napsání aplikace a laděním-údržbou. Java vám dává okamžitě k dispozici obrovské množství knihoven a zároveň vás brzdí při psaní chyb.

A pak je tu ještě jeden aspekt. Pro Javu existuje spousta Open Source knihoven. Pokud potřebujete něco naprogramovat, je dobré se porozhlédnout po internetu, zda vás někdo nepředběhl. Pokud programujete webové aplikace, podívejte se na Jakartu. Jedná se o kolekci nejrůznějších knihoven a frameworků napsaných v Javě. Mezi ně patří referenční implementace servletů Tomcat, knihovna pro práci s XML Xerces či nádherná knihovna pro logování Log4J.

Pro snadné testování kvality kódu je k dispozici framework JUnit. Bez kvalitních unit testů by neměl jít žádný softwarový produkt do reálného provozu. Unit testy by měly vznikat již během psaní kódu, raději však ještě dříve. Viz Extreme Programming.

Nepostradatelným pomocníkem každého programátora v Javě je Ant. Ant opět patří do rodiny open source projektů hostovaných na Jakartě. Ant je obdobou make, ale rozdíl mezi nimi je asi jako mezi trakařem a moderní dodávkou. Konfigurace probíhá skrze XML a je docela přehledná. Ant obsahuje desítky zabudovaných funkcí, další jsou dostupné ve volitelném balíčku. Základními funkcemi jsou například kompilace, manipulace se souborovým systémem (copy, mkdir, delete), práce s komprimovanými archívy (zip, jar, arj, gzip, tar) či CVS. Mezi volitelnými funkcemi najdete FTP, podpora .NET, JUnit či práce s archivy RPM a CAB.

Seriál AbcLinuxu pro programátory (dílů: 4)

První díl: AbcLinuxu pro programátory aneb od PHP k Javě, poslední díl: Strč prst skrz AbcLinuxu - II.
Předchozí díl: AbcLinuxu pro programátory aneb od PHP k Javě
Následující díl: Strč prst skrz AbcLinuxu - I

Další články z této rubriky

LLVM a Clang – více než dobrá náhrada za GCC
Ze 4 s na 0,9 s – programovací jazyk Vala v praxi
Reverzujeme ovladače pro USB HID zařízení
Linux: systémové volání splice()
Programování v jazyce Vala - základní prvky jazyka

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.