ugrás a tartalomhoz

Veszélyes az objektumközpontú programozás?

jeti · 2006. Júl. 8. (Szo), 16.00
Sziasztok!

Már egy jó ideje programozok PHP-ben, de eddig még soha sem használtam objektumokat. Tőletek hallottam, hogy milyen jó, ezért úgy gondoltam kipróbálom. Elővettem a könyvemet (Tanuljuk meg a PHP4 használatát 24 óra alatt), odalapoztam az Objektumok fejezethez és teljesen meglepődtem!
„Az objektumközpontú programozás veszélyes. Megváltoztatja a programozásról való gondolkodásmódunkat és ha egyszer hatalmába kerít, nem tudunk tőle szabadulni.”
Húha! Ez most jó vagy rossz? A számítógépek 5. generációjába vezették be az Objektum orientált programozást, most a 6. generációban vagyunk.
- Tehát ez az alapja a modern programozásnak? vagy
- Egy régi túlhaladott, elavult technika?
Ahogy elolvastam nem tűnik, olyan ördöngösségnek. (pl.: a var változó definíció nagyon sok helyen van Pascal, Javascript...)
A végén ismét: ~ az objektumközpontú programozás megértése nélkül is jó PHP programozó válhat az emberből.
Előnyök: könnyű átlátható, újrahasznosítható és rugalmas forráskód.
Hátrányok: több erőforrás használat, más gondolkodásmód, amelytől nem szabadulhatunk. :-)
- A PHP5 is ezt az ágat erősíti. (Nem tudom miben több.) Tehát ez a világ legszuperebb dolga? vagy
- Állandóan nagy harc folyik az erőforrások használatának a lecsökkentésében érdekében. Erre pazaroljuk a drága időt?

Szóval az lenne a kérdésem: Tényleg veszélyes az objektumközpontú programozás? Vagy csak a könyv visel egy régebbi álláspontot?
Mivel csak egy könyvem van, ezért nem tudom összehasonlítani, hogy mennyire vegyem figyelembe a leírtakat. Szeretném a véleményeteket kérni ez ügyben. Előre is köszönöm a válaszotokat.
 
1

Nem

-zsolti- · 2006. Júl. 8. (Szo), 16.08
Szerintem elég erősen kiérződik a mondatból az irónia, nem a negatív értelemében kell érteni, hogy "veszélyes". Csak egy szemléltetés, hogy ha valaki egyszer belekóstol, és megérti a lényegét, előnyeit, akkor utána már nehezen fog visszatérni a hagyományos struktúrált tervezéshez.
2

Béna mondat

Bártházi András · 2006. Júl. 8. (Szo), 22.25
Hát, igen szerencsétlen volt az irónia használata (mert kifejezetten az volt), ha további mondataiban nem fejti ki a szerző a gondolatait. Az objektum orientált programozás tekintetében nem hiszem, hogy ilyen kijelentésekre kellene ragadtatnunk magunkat ("nem tudunk tőle szabadulni"): egy igen hasznos módszerről van szó, de semmiképp sem az egyetlen üdvözítő útról.
3

kifejti a szerző

Hojtsy Gábor · 2006. Júl. 8. (Szo), 23.28
Nos, az idézett mondatokkal kezdődik a fejezet.
Az objektumközpontú programozás veszélyes. Megváltoztatja a programozásról való gondolkodásunkat és ha egyszer a hatalmába kerít, nem tudunk tőle szabadulni.
Ezek után 26 oldalon keresztül ismerteti a könyv az objektumok alapjait. Bőven lehetőséget adva annak alátámasztására, hogy megváltoztatja a gondolkodásmódunkat.
4

Erőforrások

sajt · 2006. Júl. 9. (V), 09.30
Ez egy régi vita, hogy az OOP erőforrásigényes-e vagy nem. Azt mondják az okosok, hogy ha jól van megírva a program, akkor nem erőforrásigényesebb, mint mondjuk a strukturált programozás. Egyébként az OOP egy szemlélet, és nem azt jelent, hogy mostantól a var-t is használni kell. Alapjában az a lényege, hogy az adatok, és a rajtuk végezendő műveletek (metódusok) egy egységben vannak.

Egyébként meg keres rá a google-n, rengeteg jobbnál jobb leírás van. Én ezt a 24 órásat nem ajánlom annyira, mert ahogy tudom, ez a php4-hez készült, de a php5-ben jobban ki van domborítva.

Ez egész jónak tünik: http://hu.wikipedia.org/wiki/Objektumorient%C3%A1lt
5

Ne hagyd ki

vbence · 2006. Júl. 9. (V), 13.30
Ha elkezded sokban megkönnyíti a dolgodat. Ez a programozásnak egy fejlettebb szintje, és igen, minél magassabb szintű nyelvben programozol, annál erőforrásigényesebb lesz a kódod, de egy percig sem gondolsz arra, hogy ezért Assemblyben fogsz weboldalt gyártani...

Sokat fejlődtek a PHP objektumorientált képességei az utóbbi időben, ezeket érdemes kihasználni. Szkript nyelv lévén viszont nagyon gyerekcióben jár az OOP támogatás. Szerintem ne hazsnál PHP4hez írt oktatóanyagot azok a dolgok nagyon túlhaladottak.

Az első fázisban amikor rájössz, hogy mennyire jó dolog, mindenre objektumokat fogsz majd írni, ami erőforrásigényessé teszi a kódodat, ne küzdj ellene ez egy fejlődési szakasz, át kell esni rajta, mint a bárányhimlőn... Később, (ha már néhányezer objektumot megírtál :) érezni fogod, mi az, ami objektumba kívánkozik, és mi az, ami nem.

A "generációk" szöveget felejtsd el. Aki eléggé el van telve magától, és könyveket ír, az hajlamos számítógépek 6. generációjáról, 3. szoftverkrízisről meg hasonlókról papolni. Ez boszorkányság, tűzre vele... Ha megfelelő fordítót írsz, akkor Neumann ENIAC-ját is lehet OO-ban programozni.
7

urban legend(?)

Hodicska Gergely · 2006. Júl. 9. (V), 22.56
mindenre objektumokat fogsz majd írni, ami erőforrásigényessé teszi a kódodat

Ezt tudnád indokolni?


Felhő
8

hirtelen példa

vbence · 2006. Júl. 9. (V), 23.51
Az OO eredendően egy nagyobb integrációs fokot tesz lehetővé, ezzel az integrációval élni is akar az ember. A probléma ott kezdődik, hogy ahogy növekszik az integráció foka, az emberközpontúság, úgy távolodunk el a géptől.
Inkább egy szervezet részeiként fognak működni a dolgok, megszűnik a klasszikus modularitás.

Egy példa:
A mostani rendszeremben a user (session) kezelést 3 modullal csinálom:
session_minimal
session_handle
session_maintain
Mindegyik modul az előzőekre épül. Az első a user id-t kérdezi le. Ez minden alkalommal lefut (kell-e login form az oldalra stb). A másodikban lehet a user paramétereit elérni, változtatni (gyakran kell, de távolról se minden oldalon). A harmadikban pedig regisztráció, belépés, kilépés stb. Ezeket ugyebár csak egy-egy php hívja meg.
Ha az OOP-t erőltetném, lenne egy vagy több objektumom amik viszont nem elválaszthatók. (Ilyen módon semmiképpen). Az OO egyszerűen nem alkalmas erre, nem is feladata.

Azt, hogy sebességben a sorrend: Asm, C, referencia alapú nyelvek, nem legenda, hanem tény. Ez pedig nem azért van, mert jobb, vagy rosszabb fordítót készítettek az egyes nyelvekhez, hanem azért, mert minél magasabb szinten gondolkodsz a kód annál idgenebb a gépnek, annál bonyolultabb gépi kód lesz az eredménye. Másik velejárója, hogy optimalizálni is egyre kevésbé tudod a programot, hiszen kicsúsznak a kezedből az erre való eszközök. (Objektum klónozása: milyen copy-konstruktor very a memcpy-t? - és nem dobálózom olyanokkal, hogy "repnz movsw" - de azért megelítem ;)

De miért iratsz le velem ilyen dolgokat?
9

elhamarkodott allításnak érzem

Hodicska Gergely · 2006. Júl. 10. (H), 00.37
Az OO eredendően egy nagyobb integrációs fokot tesz lehetővé

Nem teljesen tiszta, hogy mit értesz "integrációs fok" alatt. Nem kötekedés képpen írom, csak amire elsőre gondolnék, hogy mi lehet, az az absztrakciós szint, de szerintem nem erre gondolsz.

A mostani rendszeremben a user (session) kezelést 3 modullal csinálom:

Miért kell ezeket összekeverni?

Ha az OOP-t erőltetném, lenne egy vagy több objektumom amik viszont nem elválaszthatók. (Ilyen módon semmiképpen).

Ha rosszul tervezed meg/alakítod ki az osztályaidat, akkor igen...

Az OO egyszerűen nem alkalmas erre, nem is feladata.

...de ha jól, akkor nem lesz semmi gondod, És ezért tartom pl. a fenti kijelentést is hibásnak.

Azt, hogy sebességben a sorrend: Asm, C, referencia alapú nyelvek, nem legenda, hanem tény.

Egyrészt mi az, hogy referencia alapú nyelv, hogy jön ide? Másrészt a kijelentésed, amire reagáltam, az nem ASM vs PHP-ről szólt, hanem az volt benne, hogy az OOP programozás erőforrásigényesebb lesz, ami szerintem szintén nem állja meg a helyét. Többször volt szerencsém procedurális kódok refaktorizációjára (ez általában nálam némi "OOP-sítéssel" járt), és jószerivel mindig csökkent a kód mérete, lazy loading megoldásokkal a feleslegesen behúzott kódok mérete, és mindemellett egy könnyebben olvasható és karbantartható/módosítható kódot eredményezett.

Objektum klónozása: milyen copy-konstruktor very a memcpy-t?

Ez utóbbit hol használod PHP esetén? ;)

De miért iratsz le velem ilyen dolgokat?

Csak mert az idézett állítással nem értek egyet, és kíváncsi lettem volna az érveidre.


Felhő
10

ez bizony kötekedés.. :)

vbence · 2006. Júl. 10. (H), 01.28
Nem, nem és nem. Egy OO kódot nem tudsz optimalizálni. Egyszerűen más eszközöket kapsz. Egy oo eszközzel kevésbé tudsz optimalizálni, viszont összetettebb rendszert tudsz kivitlezni benne. Elhiszem, hogy van olyan procedúralapú kód, amin javítani lehet, még azon az áron is, hogy oop-sítjük, de ez nem igazolja álatalában az állítást általánosan.

Egy objektumnak van konstruktora, destruktora, VMTje, meg még ezer "haszntalan" dolog, amit megspórolsz nélküle.

A memcpy-t azért hoztam fel, hogy egy alacsonyabb szintű eszközzel jobban kézbentartod az erőforrásokat. Elveszíted a referenciákat, de kapsz helyette sebességet. És így tovább. Ha magabb szinten dolgozol a gondolataid szárnyalhatnak, de a proci nyög alatta :)

Meggőződésem, hogy egy rendszeren (a php-n) belül is igaz ez. Erre hoztam a user és session kezelést (erről tényleg nem írok most). Egy objektum metódusait (és a hozzá tartozó adattagokat) nem dobálhatod pl használati gyakoriság szerint. Az nem hiszem, hogy logikailag épkézláb objektumokat adna.

A függvényket oda pakolod, ahova szeretnéd, tekintsük ezt az optimalizálás egy formájának. Ahhoz, hogy ezt megtedd oo-ban, ahhoz meg kéne bontanod az objektumokat. Ugyanezt a traumát, ha procedúrákban dolgozol csak akkor szenveded el, ha függvényeket bontasz meg.

Azt próbálom összehordani, hogy a "szemlélettel" változnak az eszközök is, amiket kapsz. Az objektumok egy nagyobb fokú integrációt jelentenek, hiszen egy újabb szerveződési szintet vezetsz be. Ami addig (változók, függvények) a levesben úsztak, azt most csoportosítod, és nevet adsz nekik. Ez egyel több szint, amiben egyszerre kell gondolkodni. Itt már nem copyzunk, hanem copy construkort hazsnálunk, ami az esetek nagyrészében pazarlás, viszont ha abban kezdenél gondolkodni, hogy "most ez az objektum símán másolható, vagy van benne valami valahol, amit újra kell inicializáni"... én biztos nem tudnék.

Egyszerre X szintben tudsz (megbízhatóan, kényelmesen) gondolkodni. Ha bevezetsz egy újat felül, elveszítesz egyet alul. Én legalábbis biztosan...
11

nem, más szemléletmód :)

Hodicska Gergely · 2006. Júl. 10. (H), 02.37
Egy OO kódot nem tudsz optimalizálni.

Már miért ne tudnál? Nem csak az az optimalizálás, hogy alacsony szinten tudsz kódolni. Egy OOP kódit is igény szerint át tudsz alakítani, ha az szükségesnek bizonyul.

viszont összetettebb rendszert tudsz kivitlezni benne

Procedurális alapon is tetszőlegesen összetett rendszert tudsz alkotni. Az másik lap, hogy elég nehéz ilyen alapokon egy ilyet megalkotni, és ha nem jól csinálod, akkor kezelhetetlenné válik a projekt.

Elveszíted a referenciákat, de kapsz helyette sebességet.

Ez többször merül fel, de nem látom az összefüggést. Procedurális alapokon is nyugodtan használhatsz referenciákat.

Meggőződésem, hogy egy rendszeren (a php-n) belül is igaz ez. Erre hoztam a user és session kezelést (erről tényleg nem írok most).

Nekem meg meggyőződésem, hogy ez nem jó példa, és nem megfelelő dekompozíció eredménye.

Egy objektum metódusait (és a hozzá tartozó adattagokat) nem dobálhatod pl használati gyakoriság szerint. Az nem hiszem, hogy logikailag épkézláb objektumokat adna. A függvényket oda pakolod, ahova szeretnéd, tekintsük ezt az optimalizálás egy formájának. Ahhoz, hogy ezt megtedd oo-ban, ahhoz meg kéne bontanod az objektumokat. Ugyanezt a traumát, ha procedúrákban dolgozol csak akkor szenveded el, ha függvényeket bontasz meg.

Simán megteheted ezt OOP alapokon is, csak ismerni kell a lehetőségeket. Számtalan lehetőséged van, hogy futás közben egészíts ki egy objektumot az igényeknek megfelelően. És mindezt bárminemű "trauma" nélkül lehet elérni, csak tervezés/gyakorlat kérdése.

Azt próbálom összehordani, hogy a "szemlélettel" változnak az eszközök is, amiket kapsz.

Ezzel teljesen egyet értek, viszont úgy érzem, hogy nem igazán ismered az OOP nyújtotta lehetőségeket.

Itt már nem copyzunk, hanem copy construkort hazsnálunk, ami az esetek nagyrészében pazarlás

Ezek jóformán alig jelentkeznek, mint overhead. Viszont van egy olyan aspektusa is a dolognak, hogy pl. kevesebb kódot kell az értelmezőnek beolvasnia, értelmeznie, ami által meg akár nyerhetsz is. Plusz a jobban átlátható kód eredményezheti azt is, hogy jobban át fogod látni a problémát, és hatékonyabb kódot fogsz tudni írni. Ez a gondolat kicsit jobban kibontva.

Egyszerre X szintben tudsz (megbízhatóan, kényelmesen) gondolkodni. Ha bevezetsz egy újat felül, elveszítesz egyet alul. Én legalábbis biztosan...

Ha az OOP, mint plusz réteg jelenik itt meg, akkor nem hiszem, hogy ne lehetne úgy OOP kódot írni, hogy ne lehetnél tisztában az alsóbb "réteg" működésével, sőt ez nagyon fontos is, különben tényleg nem fogsz tudni hatékony kódot írni.


Felhő
12

Jajj

Bártházi András · 2006. Júl. 10. (H), 06.26
Ha elkezded sokban megkönnyíti a dolgodat. Ez a programozásnak egy fejlettebb szintje, és igen, minél magassabb szintű nyelvben programozol, annál erőforrásigényesebb lesz a kódod, de egy percig sem gondolsz arra, hogy ezért Assemblyben fogsz weboldalt gyártani...


Szerintem nem így kell megközelíteni az objektum-orientált programozást. Nem egy adu ászról van szó, csak egy programszervezési módszerről. A funkcionális programozás, a névterek használata mind-mind adott esetben hatékonyabb, vagy ugyanolyan jó kódot eredményezhetnek.

Én úgy érzem, hogy amiről te beszélsz, az a "hagyományos" procedurális, és az objektum orientált kód összevetése PHP esetén, és ez is csak egy igen szűk nézőpontból. Az OO nem egyszerűen önmagában jobb, hanem jobb és hatékonyabb tud lenni sok esetben.

Az egésszel csak annyit szeretnék mondani, hogy ne essünk túlzásba az OO dícséretében. Pont. Egyébként kb. egyetlen konkrét előnyt sem írtál le az OO mellett, csak egy darab hátrányt. Tessék konkrétumokról beszélni!
13

Egységbe zárás

janoszen · 2006. Júl. 10. (H), 08.18
Egyik előnye pl. az egységbe zárás, amely lehetővé teszi, hogy kívülről előre specifikált módon el lehessen érni szolgáltatásokat anélkül, hogy ismerni kellene az osztály belső felépítését, valamint az osztálynak lehetősége van private és protected változók/függvények deklarálására, amiket kívülről nem lehet közvetlenül elérni, hanem csak az osztály függvényei használhatják.
6

kipróbálom

jeti · 2006. Júl. 9. (V), 21.23
Köszönöm, akkor nyugodt szívvel esek neki... :-)

Most éppen fejlesztési stádiumban van a honlapom. Szinte az egészet átírom. Sokféle modulom van. (pl.: cikk, vicc, apróhirdetés és blog – ezek egy sémára)
Mivel nagyjából mindegyik ugyanúgy működik, készítek egy cikk osztályt. Ezzel megvan a cikk osztály, és ebből származtatom/örököltetem a többit. A feliratokat, tábla neveket változókba (tulajdonságokba) teszem, így csak a megjelenítő (tag)függvényt kell felülíratni.
Mivel több honlapon használom ezeket, nem kell a változók átvitelével bíbelődni, csak megváltoztatom az objektum tulajdonságát és kész.
Na ez a tervezett, és most jön a megvalósítás.

Valahogy így kell az objektumok világában gondolkodni?
14

prototípus?

Dualon · 2006. Júl. 10. (H), 12.35
Konkrét rendszere válogatja, de ha (előreláthatóan) sok hasonlóságot mutatnak a moduljaid, talán érdemes írni egy modul prototípus osztályt, és azt kiterjeszteni konkrét modulokká.
15

hogy is?

jeti · 2006. Júl. 11. (K), 13.41
Nem prototípus, de lehet, hogy írok egyet, ahol üres a megjelenítő tag függvény.
Múltkor problémát jelentett a mezők adatainak a tárolása. Végül is úgy oldottam meg, hogy az adatokat elmentettem egy php fájlba (egy több dimenziós tömbben). Ha szükségem volt csak beágyaztam a megfelelő helyre.
Itt meg akkor, csak beágyaznám a megfelelő osztályt, létrehozóm az objektumot, feltöltöm a tulajdonságainak megfelelően az adatokkal. Lehet így elég könnyen megváltoztatni, vagy inkább tároljam fájlban (többnyelvűség esete)?

Igazából gondban vagyok, mert nem tudok minden modult „önjáróra” átalakítani. Jelenleg külön fájlban van összes adatmódosítással kapcsolatos függvény (űrlapkészítő, adatfeldolgozó, ellenőrző és ezeket összefogó függvény), az összes alapvetőfüggvény (adatbázis kezelés, hibakezelés) és maga a modul (ez leginkább a megjelenítésért felel). Az előbbi kettőt szinte az összes modul használja. Vannak olyan modulok is amelyek elég nagyok és gyakorlatilag nem használom minden funkcióját, ezért ezeket külön fájlban tárolom. (Pl.: felhasználó kezelés, ez mindig jelen van; de a hirdetési, bannercserés részt ritkán használják)
Vagy legyenek inkább ezek az objektumok? Csak olyan éles határt nem tudok húzni. (Pl.: az alapvetőfüggvények között)

Ha a cikk modul lenne a prototípus, akkor nem csak a megfelelő modult kell beolvasnom, hanem még a cikkekét is. Tehát inkább hozzak létre több osztályt, amelyek kisebb változtatásokban különbőznek, de így legalább nem kell fölösleges részt betölteni.

Ti hogy oldjátok meg ezeket a problémákat?