Osztályok? Mi az értelme?
Pedig ez pont fordítva van.
Persze, amíg csak konzolos képernyőre írogató programról van szó, még talán igaz is lehet az állítás.
De egy komplexebb, nagy programot jóformán képtelenség osztályok nélkül lekészíteni. Illetve lehet, de olvashatatlan és karbantarthatatlan lesz a kód.
Az osztályok összefognak több, egybe tartozó metódust és attribútumot úgy, hogy közben a láthatóságot is meg lehet szabni, valamit lehetőség van az öröklődésre és a polimorfizmusra is.
Látom nem látod át az OOP értelmét. Én is így voltam ezzel, hosszú-hosszú ideig. Majd jött a megvilágosodás, és mást se használok, mint OOP-t. (Objektum Orientált Programozás)
Az egész lényege, hogy osztályokat (csoportokat) alakítasz ki. Nem tudom mennyire értesz az UML kez, de akkor abban kisérletezek neked.
Elősször is. Az osztályok 2 részre és minden elemnek 3 tulajdonsága van.
Részei:
- Attributumok, azaz osztály változók.
- Methódusok, azaz osztály függvényei.
Láthatóság:
- Private (UML jele: -) (saját - csak az adott class látja, se kívülről, se gyermek osztály)
- Protected (UML jele: #) (védett - kívülröl nem, de öröklődési struktúrában látszik)
- Public (UML jele: +) (nyílvános - minden honnan látszik)
- Publicated (nem tudom, hogy ez létezik-e, de elméletben igen. Szóval ez egy kakuktolyás, mert eddig 1 nyelvben se láttam. Lényege: kívülről csak is kizárólag olvasható)
Attribútum: Olyan osztály változók, amiket az láthatóság alapján írhatóak és olvashatóak. Azaz: "private int szam;" akkor ezt csak is kizárólag az az osztály éri el, ahol ez szerepel. Ez alatt azt értve, hogy az adott class minden függvénye eléri, de kíntről nem. Mivel korlátozott az elérhetősége, így "biztonságban van" a változónk.
Ha látni akarsz egy konkrét példát OOP-re akkor így írom őket:
-------------------
Osztály neve
-------------------
Attribútumok <láthatóság> <típus> <név>
-------------------
Methódusok <láthatóság> <név>(<típus> <név>) : <visszaadási érték>
-------------------
Azaz egy MMORPG karakter leprogramozása valahogy így nézhet ki:
-------------------
Character
-------------------
- int eletero
- int mana
- Weapon fegyver //Az osztály neve, is típus, azaz "példányosítható is ide
- Armor pancel
-------------------
+ Character() //Ha fgv. neve class neve is, akkor constructor, így returnja sincs
+ kapottSebzes(int x) : void
-------------------
-------------------
Armor
-------------------
- int felfogas
- int turokepesseg
-------------------
+ kapottSebzes(int x) : void
/* ha ügyanaz a fgv név, nem baj, mert más-más classban van, így nem zavarodik bele a program. */
+ birjaemeg() : boolean
-------------------
-------------------
Weapon
-------------------
- int maxSebzes
- int minSebzes
-------------------
+ sebzesGeneralas() : int
-------------------
Mint látjuk ha 1x példányosítjuk a Character class-t, akkor magával rántja a másik 2-tőt, és minden adat egyedi megoldásokkal (ember és ötlet függően) configurálhatja az adatokat. Azaz tegyük fel létrehozol még egy harcoló osztályt, ami a 2 játékos példányát fogadja, akkor már is van 1 PVP-d. Mivel mind2 rendelkezik fegyverrel + páncéllal. És csak a programozói fantázia szabb határokat.
Másik előnye az OOP-nek:
- Ha törölsz egy osztályt, akkor az általa foglalt memória felszabadul
- Elég 1x megírni egy "váz" osztályt, és azt annyiszór hívod meg ameddig van memóriád. Például az alábbi osztályt annyiszór meghívhatod ahány széketek van. Minden példány külön-külön életet él:
-------------------
Szék
-------------------
- string szín
- int magassag
- int szelesseg
- hosszusag
-------------------
+ kihúz() : void
+ lehajt() : void
+ visszatol() : void
-------------------
- A nevekbe nem zavaródik bele a program. Minden class saját felségterülettel rendelkezik. Azaz lehet hogy egy Class1-ben van egy A nevű függvény, és a Class2-ben is még egy A nevű függvény. Nem gáz. Még fgv. nevekkel se.
C++/PHP Amik tudják az OOP-t, de nem csak kizárólag OOP-t tudnak. Ellentétben a JAVA-val, ami csak is kizárólag OOP-n alapul + csomagokkal.
"csak azt látom hogy osztályoknál mindig jobb megoldás a funkciók használata."
Mintha azt mondanád, hogy a körző használatánál mindig jobb megoldás a grafithegy használata.
Amit #3 leírt, na AZ nem az OOP. Az OOP alapja az osztályhierarchiák, az öröklődés, polimorfizmus.
Az, hogy adatokat összeraksz, és függvényeket adsz hozzá, az nagyon szép és hasznos, de nem ez az OOP.
Viszont jól leírta, mi értelme van az osztályoknak: összetartozó adatok együtt, a hozzájuk tartozó függvényekkel. Illetve a destruktor a C++ legfontosabb hozadéka a C-vel szemben.
"Másik előnye az OOP-nek:
- Ha törölsz egy osztályt, akkor az általa foglalt memória felszabadul "
Osztályt nem törlünk.
Annyira látszik egyes embereknél a szakértelem nélküli okoskodás...
Én annyit mondok, hogy mindenkinek igaza van. A feladatot más-más módon, programozói tervezettel lehet megoldani.
#3 válaszoló szépen kirészletezi a saját maga módján. Igaz az általa felvázolt feladat részfeladatának részfeladatát "mutatta" be. Az is igaz, hogy van 1-2 fogalmi zavar arra fele is.
#iostream
Nem csinál mást mint egyetért vagy valamit tagad. De arra nem venné a fáradtságot, hogy ellen példát fel is hozzon... De lesz ez még így se. :)
#8-nak:
Szerintem megszoktuk már, hogy iostream ilyen. :D
On topic:
Én azt mondanám, hogy sok gépelést spórolsz meg, ha objektum orientáltan programozol.
Absztrakció: (alakzat)
Egy alapprobléma vázát hozzuk létre, melyre a jövő osztályai épülhetnek.
Ezután, az absztrakt osztályokból leszármaztathatunk specifikusabb osztályokat. (2D-s alakzat)
Ezt tovább specializálva létrehozhatunk specifikus alakzat osztályokat (sokszög)
Ezt még tovább tudjuk fejleszteni/specializálni (négyszög)
És még ezt is tudjuk specializálni, egy leszármazott osztállyal(négyzet)
Természetesen, már a legelső osztályban létrehozhatunk olyan függvényeket, amelyekre az összes leszármazott osztálynak szüksége lesz (terület/kerület, kirajzol, pozíció)
Most képzeljük el, hogy ezt mind osztályok nélkül írtuk meg, és az egész kódunk egy nagy katyvasz :)
Továbbá: "osztályoknál mindig jobb megoldás a funkciók használata."
Ez egy kis kutyulás... Az osztályok használnak "funkciókat" azaz függvényeket. Sőt, egyik legfontosabb hasznuk, hogy nem kell (n+1)-szer leírnunk az adott függvényt minden egyes esetre specializáltan, mert már vannak csoportjaink, ami "osztoznak" a függvényen.
Most nem fogok neked regényt írni, egy jegyzet elég vaskos tud lenni ebben a témakörben... Ajánlom, hogy ásd magad jobban bele a dolgokba, és (mint az egyik kolléga példája szemlélteti) egy egyszerű RPG-ben is sokat segít, ha van egy páncél ősosztályunk, amiből tudunk specifikus darabokat leszármaztatni, majd azokat példányosítani.
Ha valami nem világos, ajánlom, hogy nézz bele egy egyetemi jegyzetbe (BME, ELTE, OE). Sok hasznos dolgot firkálnak le :)
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!