Kihagyás

Bevezető

Az előadás videója elérhető a itt.

OO programozás – bevezetés

A kurzus célja, hogy elsajátítsuk az objektum orientált gondolkodásmódot, az osztálydiagramok használatát és a Java-t, mint tisztán objektum orientált nyelvet. A Java építve a már meglevő nyelvek előnyeire sok jó tulajdonságot átvett azokból (C, C++, Smalltalk,... ) úgy, hogy közben a célja a komplexitás csökkentése.

Komplexitás

Minél több követelményt kell egy programozási nyelvnek kielégítenie, annál komplexebbek lesznek általában.

komplexitas

A komplexitás kezeléséből adódik, hogy sokkal könnyebb robosztus kódot írni, ami lassabban fut. Viszont gyorsabban meg lehet tanulni a nyelvet, és könnyebb megbízható programot is írni.

A Java nyelv

A Java fő jellemzői:

  • Egyszerű: legalábbis a C++-hoz képest, annak ritkán használt, bonyolult konstrukcióit mellőzi.
  • Objektumorientált: a C++ objektumorientált megoldásából indult ki, hasonlít is rá, azonban bizonyos dolgokat máshogy oldanak meg benne.
  • Előfordított: a Java forrást egy köztes kódra fordítanak, ami egy architektúrától független kód, amelyet a Java virtuális gép fog futtatni az adott gépen.
  • Értelmezett, vagy interpretálható: a Java bájtkódja bármely gépen könnyen interpretálható és futás közben gépi kódra alakítható (JIT compiler).
  • Robusztus: megakadályozza és kiszűri a futtatás közbeni hibákat.
  • Biztonságos: A Javat elsősorban hálózati és elosztott alkalmazásokra szánták, nagy hangsúlyt fektetve a biztonságra. Lehetőség van digitális aláírással ellátott osztályok készítésére is, így biztosak lehetünk az adott kód fejlesztőjében.
  • Semleges architektúrájú: az előfordított kód bármilyen operációs rendszeren, bármilyen processzoron futtatható.
  • Hordozható: azaz a bájtkódot nem kell külön lefordítani minden egyes platformra, bármelyiken működik, ahol van a futtatáshoz szükséges JVM.
  • Többszálú: A program egyidejűleg végrehajtható részei párhuzamosíthatók, ezáltal gyorsabbak lehetnek. A több processzoros gépek lehetőségeit ki tudják használni (feltéve, hogy az operációs rendszer is támogatja).
  • Dinamikus: futtatáskor dőlhet el nagyon sok minden benne.

A Java magas szintű programozási nyelv, nem a kódoláson van a hangsúly, hanem a tervezésen, az elvontabb fogalmak ábrázolásán (pl. interfészek). Webprogramozásban kiemelt szerepe van, illetve sokszor segíti a programozók és programozási eszközök kommunikációját.

Miért ennyire sikeres?

A Java nyelvet úgy tervezték, hogy az a kezdetektől épít más programozási nyelvek tapasztalataira, igyekszik azok rosszabb tulajdonságait elhagyni, a kedvezőeket tovább vinni. Objektumorientált nyelv, ami segíti a valós világ elemeit könnyebben átültetni a programokba.

Sok esetben látszik, hogy adott pontokon azért a nyelv hiányos, ezért az újabb és újabb verziók próbálják kiegészíteni a nyelvi lehetőséget. Nem minden nyelvi elem volt elsőre működőképes, de mára a kezdeti hátrányosságait elhagyta a nyelv. Mivel nagyon sok, és nagyon jó függvény könyvtár létezik, könnyű sokmindent megvalósítani benne egész könnyen. És könnyű így nagy, robosztus programot írni. A hibakezelés nyelvi szinten támogatott, így nem kell olyan apróságokra annyira figyelni, mint a C esetében, ahol egész könnyen tudtunk például egy tömböt túlindexelni. Ezt a Java nem engedi. Maga a Java nyelv könnyen megtanulható, könnyebben lehet benne magas szintű programozóvá válni, mint C++-ban, amely sokkal összetettebb és bonyolultabb nyelv.

Régebben a terv az volt, hogy a Java leváltja majd a C++ nyelvet. Ugyanakkor már a kezdetekben látszott, hogy a Java programok sokkal lassabbak. Köszönhető ez annak, hogy Java esetében általában a bájtkódot kell futtatni. Illetve eleve is sokkal lassabb volt, kezdetben akár 20-50-szer lassabban futott ugyanaz az algoritmus, ha Java-ban volt implementálva, mintha C/C++-ban. Az már persze javult, és egyéb módokon is gyorsítható a Java program végrehajtása, de azért még ha a hatékonyság a cél, akkor érdemesebb a C/C++ nyelvet választani. Ugyanakkor megvannak a feladatok, mint például a web programozás, amire egyértelműen a Java használata javasolt.

A Java platform

Elhangzott már, de nézzük meg részleteiben, milyen komponensek alkotják a Java környezetet.

  • Java API: több ezer használatra kész szoftverkomponens, amely csomagokba szervezett osztályokat és interfészeket tartalmaz
  • Java Virtual Machine: a Java bájtkódot futtató virtuális gép célja, hogy biztosítsa a hordozhatóságot, platform-függetlenséget.
  • JIT (Just in time) fordító: bájtkódot natív kódra fordítja és futtatja, ez olyan esetekben lehet hasznos, ha fontos a program futásának sebessége.

Gépi kód (tárgykód)

Amikor C programot írtunk, azt lefordítva egy olyan kódot kaptunk, ami az adott architektúrán közvetlen futtatható volt. Ezt nevezzük natív kódnak, ez tartalmazza az adott architektúrára leírva azon utasítássorozatot, amit a gépnek végre kell hajtania.

A bájtkód ezzel szemben nem futtatható kód, ez egy köztes kód reprezentáció a magas szintű nyelv és a natív kód között. Csupán annyival magasabb szintű a natív kódnál, hogy platform-független legyen (biztosítsa a hordozhatóságot).

A Java esetében ezt fogja a JVM futtatni. A JIT ezzel szemben lefordítja natív kódra (közben mindenféle optimalizálásokat tesz az adott cél gépre), és ezt a natív kódot fogja futtatni.

Java és az Internet

Ugyan a Java nagyon hasznos önálló programozási problémák megoldása során is, de nagyon sok olyan lehetősége is van, amellyel olyan megoldásokat támogat, amely az internet használatához köthetőek.

A web elemei programozás szempontjából két részre, a kliensre és szerverre oszthatóak. A szerveren van az adat, és átlagosan a feldolgozó programok, a kliens pedig az, aki lekéri és megjeleníti az adatokat. A Java mindkettőre ad megoldást.

Kliens programozás

Kezdetben minden interaktivitás a szerver oldalán volt, a kliens csak statikus HTML oldalakat jelentett, amely a CGI interfész segítségével kért el adatokat a szervertől. Ennek használata bonyolult is volt, ráadásul relatív lassú, így az olyan megoldások felé terelődött az irány, ahol a kliensek képesek voltak tehermentesíteni a szervereket. Tulajdonképpen a web böngészőkre tekinthetünk úgy, mint speciális operációs rendszerekre korlátozott erőforrásokkal, ezen kellett a problémákat megoldani.

Erre egyik megoldás lett a szkript nyelvek elterjedése, ahol a forráskódot beépítették a HTML oldalakban. Speciális problémákra speciális nyelveket hoztak létre. Pl.: JavaScript, Ajax, ActionScript, Dart, TypeScript, ...

A Java a böngészők programozásához az appleteket használta. Ezek olyan böngészőn belül voltak képesek futni, amelyekben volt Java plug-in, ami a lefordított kódot tudta futtatni.
Manapság már nem használt megoldás ez.

Szerver programozás

Legegyszerűbb feladat, ami egy szerverhez kapcsolódhat az egy szimpla fájl elérés. Bonyolultabbak a különböző adatbázis kezelő műveletek (amelyet esetlegesen HTML formázás is kiegészíthet) Hagyományosan erre Perlt, CGI-t használtak, manapság inkább PHP-t, Java-t vagy .NET-et. Java-ban a servletek (kis méretű szerveren tárolt és futó alkalmazások), Java Servlet Pages (JSP, amely célja a tartalom és a dinamikus oldalgenerálás szétválasztása) és a különböző keretrendszerek (pring, Stripes, JBoss Seam, Struts, stb... ) adottak ezen problémák megoldására.

Java alkalmazások

Persze önálló Java alkalmazásokat is lehet írni. Ezek előnye a portabilitás, illetve az, hogy könnyen lehet összetett, akár GUI-val támogatott kódot írni. Illetve arról se feledkezzünk meg, hogy napjainkban az Android alkalmazások nagy részét is írhatjuk Java segítségével.

Programozási irányelvek

Mielőtt a konkrét programozásba fognánk, pár szempont erejéig térjünk ki arra, milyen módon tudjuk a programunk minőségét pozitív irányba befolyásolni.

  • Elegancia: a névhasználat, a kommentek, magyarázatok, példák sokat segíthetnek a programmegértésben, kód indentálása pedig az áttekintésben.
  • Működőképes, utána gyors: előbb működjön jól a program, utána lehet a gyorsaságon javítani.
  • "Oszd meg és uralkodj": bonyolultabb problémákat osszuk egyszerűbb részproblémákra, azok megoldásával érjük el a megoldást!
  • Clean Code: egyértelmű nevekkel segíthetjük a kód megértését akár kommentek nélkül is.
  • Alap a modellezés: modellezés adja meg milyen osztályokra és interfészekre lesz szükség, és azok között milyen kapcsolatok kellenek.
  • Kompakt osztályok: minden osztály lehetőleg egy behatárolható feladatot akarjon megoldani, ne próbáljon egyszerre mindenre megoldást adni.
  • Overloading: Ne terheljük túl egy-egy metódus működését, azaz a bemenő paraméter típusa ne határozza meg, hogy pontosan hogyan kell végrehajtani az adott metódust.
  • Gigantikus osztályok elkerülése: túl nagy osztályok komplexek lesznek, ezeket célszerű feldarabolni.
  • Egységbezárás: "Csúnya dolgot" lehetőleg elzártan oldjunk meg, ne lehessen rá kívülről hivatkozni.
  • Intefészek vs. implementációs osztályok: nem hordozható dolgot rejtsd implementációs osztályba, csak a legszükségesebb dolgokat tedd elérhetővé interfészek által!
  • Kompozíció vs. öröklődés: új osztály készítésekor először a kompozícióval próbálkozz, csak akkor származtass, ha az mindenképp indokolt!
  • Gumi kacsa: kész terveket mondd el másnak, más szakértőnek! Több szem többet lát, hamarabb kijöhetnek a hibák.

Utolsó frissítés: 2024-04-11 07:54:27