Igor Kulman

Java vs C# z hľadiska pohodlnosti programovania

· Igor Kulman

Programovacie jazyky by podľa môjho názoru mali byť nástroje, ktoré ľudom programovanie čo najviac uľahčujú a robia ho bezpečnejším. Nie všetky programovacie jazyky však majú takýto prístup. Po článku Prečo je Java zaostalý a nefeektívny jazyk som sa rozhodol napísať trochu konkrétnejšie porovnanie pohodlnosti programovania v dvoch mnou aktuálne najviac používaných programovacích jazykoch, a to Java a C#. Nezaoberám sa samozrejme všetkými aspektami oboch jazykov len tými, s ktorými prichádzam pravidelne do styku.

Preťažovanie operátorov

Java narozdiel od C# neumožňuje preťažovanie operátorov. Nie je to síce vec, ktorú by som využíval denne, ale niekedy sa hodí a dokáže kód výrazne sprehľadniť. V Jave by som privítal aspoň možnosť používať operátor [] pri kolekciách, používanie metód get() a set() je značne nepohodlné.

Automatické vlastnosti

Predstavte si, že chcete vytvoriť triedu Customer, ktorá má okrem iného vlastnosť Id, ktorá je ostatným triedam prístupná len na čítanie. V Jave na takýto prípad vytvoríte privátnu premennú a getter.

class Customer 
{ 
  private int Id;  
  public int getId() 
  {  
    return Id; } 
 }
}

V C# si vďaka automatickým vlasnostiam môžete ušetriť námahu.

class Customer 
{  
  public int Id { get; } 
}

Efekt je rovnaký, kód je však jednoduchší a prehľadnejší. Ak by ste napríklad chceli povoliť nastavenie Id len v rámci danej triedy, použijete

class Customer 
{ 
  public int Id { get; private set; } 
}

Takýchto prípadov je oveľa viac. Jednoduché, prehľadné, úsporné.

Scanner

Java obsahuje triedu Scanner na načítavanie a parsovanie vstupov z rozhrania Readable. Pomocou tejto triedy je možné pohodlne načítavať obsah nehomogénnych (v zmysle obsahujúcich dáta rôznych typov). V C# nič také nie je, je možné použiť LINQ, nie je to však až také pohodlné.

LINQ

Za jednu z naväčších výhod jazyka C# oproti Jave pokladám LINQ. LINQ znamená Language INtergrated Query a jedná sa o jednotný spôsob tvorby dopytov nad rôznymi dátovými štruktúrami a dokonca aj databázami. Nezáleží teda, či chcete vybrať nejaký prvok z poľa, zoznamu alebo databázy, vždy používate rovnakú syntax. LINQ zavádza do C# prvky funkcionálneho programovania (.NET obsahuje funkcionálny jazyk F#), ktoré vám uľahčia prácu s mnohými dátovými štruktúrami. Ako umelý príklad majme napríklad pole objektov typu Customer, každý objekt Customer je asociovaný s objektmi Invoice a my chceme z tohto poľa vybrať ID zákazníkov, ktorým končí konto tento mesiac a majú vytvorenú nejakú faktúru. Výsledok by sme chceli vo forme zoznamu kvôli ďalšiemu spracovaniu. S použitím LINQ je to naozaj jednoduché

//Cutomer[] customers; 
List<int> selectedCustomerIds = customers.Where(l=>l.ValidUntil.Year == DateTime.Now.Year && l.ValidUntil.Month == DateTime.Now.Month && l.Invoices.Any() select l.Id).ToList();

Myslím, že zodpovedajúci kód v Jave by bol výrazne zložitejší, dlhší a menej prehľadný. Celkovo v Jave je často potrebné na vyjadrenie rovnakej myšlienky ako v C# použiť viac kódu. V Jave nič ako LINQ zatiaľ neexistuje, do Javy 7 sa chystajú closures, ale či sa tam naozaj dostanú a kedy Java 7 výjde, si myslím nikto netrúfa odhadnúť.

Práca s výnimkami

Java aj C# podporujú výnimky a presadzujú používanie výnimiek ako unifikovaného spôsobu hlásenia chýb. Java však obsahuje pri výnimkách jeden koncept, ktorý by som si dovolil označiť priam až za chybný. Jedná sa o nutnosť ošetrovať všetky checked výnimky, ktoré môžu vo vašich metódach nastať.

Tento koncept sa vám môže zdať v princípe správny, výnimky je potrebné odchytávať a reagovať na nich. Ak viete ako. Väčšina týchto výnimiek sú proste výnimky, na ktoré neviete ako zareagovať, sú nezotaviteľné. Napadne vás pri nich maximálne tak výpis stack trace a väčšina Java programov aj takto naozaj vyzerá, catch vetva obsahuje printStackTrace alebo dokonca žiadny kód.

Prečo nás teda Java núti odchytávať a spracovávať všetky checked výnimky, keď aj tak nevieme,čo s nimi ? Tento koncept len zbytočne núti programátora produkovať menej prehľadný a zložitejší kód bez akejkoľvek pridanej hodnoty. C# vás k ničomu takému nenúti, kód je tak prehľadnejší a jednoduchší.

Dostupné knižnice

Pre Javu je dostupných výrazne viac knižníc ako pre C#. Javisti často tvrdia, že vďaka tomu je Java flexibilná a na všetko existuje viacero rôznych knižníc, medzi ktorými si môžu vyberať a že na platforme .NET nemáte na výber. To však nie je pravda. Aj v .NET máte skoro na všetko možnosť výberu, samotný .NET však na všetko v sebe obsahuje jednu “knižnicu”, ktorá funguje a je s ňou možné daný problém vyriešiť bez hľadania niečoho iného. Ak chcete napríklad vyvíjať webové aplikácie, .NET vám ponúke ASP.NET WebForms, ktoré sú jeho súčasťou ale máte na výber aj ASP.NET MVC a pri ASP.NET MVC máte ďalej na výber rôzne View Engines. V Jave teda máte viac možností, samotná Java však málokedy obsahuje nejakú priamo v sebe, musíte si všetko nájst, odskúšať a vybrať správnu možnosť.

Alebo ak chcete konzumovať webové služby, priamo v .NET existuje riešenie integrované aj vo Visual Studiu použiteľné na pár klikov. Pre Javu existuje riešení viacero (JAX-WS, Axis ..) musíte si však vedieť vybrať a vedieť aj detaily ako to, že Axis ma problémy s typom ArrayList a pod.

Na záver malý tip, ak ste rovnako ako ja nútený používať Javu a môžete (ak vám v tom nebránia ako mne firemné “štandardy”) použiť na tejto platforme jazyk Scala, určite ho skúste, spája výhody objektového a funkcionálneho programovania.