Static vs Instance
2010-11-26T11:42:58+01:00
2010-11-28T09:55:51+01:00
2022-06-29T07:40:44+02:00
  • Szia
    Ha tényleg 10 év tapasztalat áll mögötted, akkor valami nagyon nem kerek oo-ban. Ajánlani tudom a C++ -t, mert az talán rendbe tenné a szemléletedet. Ha egy osztály minden tulajdonságát és metódusát static kulcsszóval illeted, azzal statikus helyfoglalásúvá teszed az osztályt, vagyis nem kell példányosítani, ezért tudsz rá hivatkozni osztálynév::metódusnév() formában. Vannak esetek, amikor ez hasznos. Singleton minta, amint fentebb is írták ilyen. Értelme, hogy a program futása során adott osztályból csak egy példány létezzen és te a static kulcsszóval ezt kényszeríted ki, azzal a különbséggel, hogy egy statikus osztály (engedd meg, hogy így nevezzem azt a class-t, aminek minden tagja static) a te olvasatodban nem más, mint egy marék globális hatókörbe tett függvény és változó hozzárendelve egy "osztánynév::" névtérhez. Mi ebben a struktúra? Ennyi erővel írhatsz globális hatókörben fv-eket, meg teleszemetelheted a globális névteret... Mivel a static (public) tagjaid mindenhonnan elérhetők, nem is kell hozzá osztályhierarchia. Tehát ha mindent így írsz, az nem oop.
    Példa:
    kétszemélyes kártya jéték. ember vs. gép Játékos osztály tulajdonsága(kézben lévő lapok, kredit). Ebből pedig van kettő, ember és gép játékos. Hogyan tudnád (egy példányban létező) statikus osztállyal külön kezelni ember és gép játékos pontjait és lapjait? Persze lehet, de az majdnem ugyanaz, mintha procedurális kódot írnál. ... NÉzz utána egy kicsit oo megvalósításának C++-ban.

    Szép napot
    Mutasd a teljes hozzászólást!
  • Itt nem a singletonrol volt szó, hanem hogy
    Ha mindenkivel ellentétesen csinálom a dolgokat és működik, akkor mondjátok, hogy jól csinálom, különben hülyék vagytok.

    Természetesen nem azt mondom, hogy ne ÚJÍTSON az ember, ha valami JOBB mint a másik, de azért elvetemült dolgokat ne kiáltsunk már ki jónak
    Mutasd a teljes hozzászólást!
  • Nagyjából elolvastam végig ami itt van, tiszta vicc már :o)

    Szerintem Singleton-t nem lehet static osztályváltozó nélkül megoldani.
    Mutasd a teljes hozzászólást!
  • Huh mennyi hozzászólás :) Nem nagyon programozok PHP-ben. Nem olvastam végéig, lehet hogy valaki írt már a singletonról. A OO-tan akarsz programozni PHP-ben és szeretnéd hogy valamiből csak egyvalami jöjjön végre a későbbiekben, és ezt biztosítani is akarod hogy ne lehessen úgy használni a kódodat, hogy egy későbbi programozó vagy akár Te létrehozzon abból az egy objektumból mégegyet akkor singleton-t szoktak használni. PL: adatbázis driverből csak egyet akarsz létrehozni, vagy ilyesmi. Ennek a megvalíosítását static adataggal szokták.

    De van nagyon sok dedos példa, tudod számolni hogy hány objektumod van egy adott osztályból. Ezt használhatod például arra hogy egy erőfprrást felszabadítasz, ha már senki nem hivatkozik rá. Tudom, :) Php-ben lefutás után eltűnnek az objektumok nem ?
    Mutasd a teljes hozzászólást!
  • Ez csak egy példa.
    (Nem annyira nevetséges. Majd jövő ilyenkor is nevess!)
    Mutasd a teljes hozzászólást!


  • (háttérben az IHM, erre jössz ezzel az egyszerű és aktuális példáddal... ROTFL)
    Mutasd a teljes hozzászólást!
  • Azt pedig, hogy statikus vagy nem statikus, teljes mértékben a megoldandó feladat határozza meg.


    Hát igen. Azért könyörög szegény, hogy mondjuk meg neki a frankót. Ahhoz képest ez a kijelentés túl általános.

    Viszont, ha tényleg odafigyelt volna arra, hogy mit mondunk neki összességében, és nem az orrát húzná mindenen fel, akkor már nagyjából képbe lehetne, hogy mikor kell statikus és mikor nem statikus adattag.

    Én pl. megfogalmaztam az alapelvet:
    Ha kifejezetten olyan tulajdonságról van szó, ami az egész osztályra általánosan érvényes. Míg, ami a példányok egyedi sajátsága, azt azok tulajdonságaként kell megadni.


    Példát is mondtam rá, elég szemléleteset.
    A többiek példája általában azt szemléltette, hogy mikor nem szabad statikus adattagot használni (bár körmönfontan mégiscsak lehetne, de ez hülyeség lenne).

    Szóval itt van még egy-két példa, hogy mikor kell statikus adattag:

    - kézenfekvő pl. hogy olyan konstansok statikusak legyenek, amiket minden példány egységesen használ. Egy egyszerű és sajnos aktuális példa:
    nyugdijKorhatar = 95; // ezt szeretnék! atlepesAllamiba = kotelezo; // lenyúlás: igen!
    Szóval ezek, az osztály minden tagjára egységesen vonatkoznak.

    - ha azt akarod tárolni, hogy melyik példánnyal történt valami pl. egy kiválasztási esemény, akkor azt is statikusként kell deklarálni, mert az osztályból az az egy, ami generálta az eseményt. Ez is osztály tulajdonság, hiszen mindig csak egy példány van kiválasztva. Így logikus, hogy az osztályt kell megkérdeznünk, hogy ugyan mond már meg, melyik példányoddal történt az esemény.

    --------------------------
    Ha 10 év programozói tapasztalat után ezt még mindig nem érti, akkor magára vessen.
    Mutasd a teljes hozzászólást!
  • Na köszönöm a sok fikázást az igazi válaszok helyett!


    Tőled sem látott szerintem senki egy sor kódot sem. Valamelyik hozzászólásodban írtad, hogy készítettél valami háromosztályos akármit, amiben az osztályaid metódusait statikusra alakítottad át. Lássuk - feltéve, hogy nem szupertitkos! Szerintem mindenki többet fog tudni mondani.

    Vagy például Smacky kolléga adott egy nagyon jó példát egy olyan user osztállyal, ami egy SQL eredménytáblából tölt fel egy tömböt felhasználó példányokkal (szerintem egy nagyon is jó példa, és szemlélteti azt, hogy itt csak a saját idegeid borzolására érdemes statikusan megírni az osztályt). Azt próbáld meg átírni statikusra, utána próbáld meg pár szóban leírni azt, hogy volt-e értelme vagy sem. Persze másold is ide nekünk a kódot, kérlek.

    Személy szerint én úgy vagyok vele, hogy eddig talán csak 1-2 esetben találkoztam olyan problémával, amit statikus metódusokkal tudtam csak megoldani. Azt pedig, hogy statikus vagy nem statikus, teljes mértékben a megoldandó feladat határozza meg. Hogy te melyiket használod, az már a te dolgod.
    Mutasd a teljes hozzászólást!
  • Na köszönöm a sok fikázást az igazi válaszok helyett!
    Menjünk aludni!
    Bárcsak ne kérdeztem volna semmit jobban összezavartatok, eddig is megvoltam enélkül... 1-2 kivétellel, csak lehülyéztetek, de valódi válasz az majdnem mindenkinél hiányozott!
    Jó éjt mindenkinek!
    Mutasd a teljes hozzászólást!
  • mivel a desktop programozással szemben

    hagyd már ezt a desktop vs script nyelv dolgot.
    Kit érdekel, hogy a program 30 ms-ig, vagy 30 napig fut? Attól, mert tizedmásodpercek alatt lefut, még ugyanúgy el kell érnem az adatokat, dolgoznom kell vele, le kell programoznom a működést, és esetleg 10 másik programozó írja a kód többi részét, amit használnom kell.
    De esetleg keress rá arra a kifejezésre, hogy "php socket server", és találd ki, hogy az fut-e több ideig, vagy egy vírusirtó (ami desktop app).

    Szóval az a kérdésem hogy döntöm el el melyiket használom

    Pénzfeldobással, ha meg van melletted valaki, akkor kő-papír-ollóval. Esetleg a korábbi 500 válasz elolvasásával, és értelmezésével. Jóéjt.
    Mutasd a teljes hozzászólást!
  • 10 év tapasztalatával mindegy, mindkét a kisujjamban van!
    Érdekelt volna valami lényeges különbség amitől egyiknek vagy másiknak bármi jelentősége lenne mikor kell használni, de eddig semmi ilyen nem volt...
    És én is feladom!
    Jó éjt!
    Mutasd a teljes hozzászólást!
  • Az OOP ott kezdődik, ha a saját magad által írt kódokat saját osztályokba foglalod.

    Igen így csinálom!
    Sőt PHP-ben is!
    Mutasd a teljes hozzászólást!
  • Szóval az a kérdésem hogy döntöm el el melyiket használom?


    A 10 év tapasztalatával! Hogyan, máshogyan?
    Mutasd a teljes hozzászólást!
  • C#-ban is írok, így tudom mi a valódi OOP, mert ott minden erről szól

    Erre az egy mondatodra még hagy reagáljak.
    Az, hogy C#-ban programozik valaki, még nem jelenti, hogy OOP szemléletet követ. Ha fogsz egy Program class-t, meg egy Form1 -et, és hajigálod bele a függvényeket, még nem OOP kódot írsz. Még akkorsem, ha nem egy intval (php) függvényt hívsz meg, hanem egy Convert.ToInt32 -t.
    Az OOP ott kezdődik, ha a saját magad által írt kódokat saját osztályokba foglalod.
    Tehát a C# szintaktikailag követeli meg csak az OOP-t, de attól még ha mindent egy osztályba raksz az ugyanúgy szekvenciális programozás marad.

    én is jóéj, és én is feladom
    Mutasd a teljes hozzászólást!
  • Előnyei vannak mindkettőnek, adott helyzetben azt kell választani, amelyik a jobb megoldást adja.


    Szóval a kérdésem még mindig az mi határozza meg mikor mit használsz, mivel a desktop programozással szemben, a kód végén az objektumnak is van vége, nem él tovább nem módosul nem hat rá más, csak amíg tart a kód, így nincs nagy haszna sem a példányosításnak sem az egybe zárásnak mert szintén strukturáltan és szépen és még 1000 ember által értelmezhető és használható objektum használat nélkül is. Simán rendezett osztályokkal! Szóval az a kérdésem hogy döntöm el el melyiket használom?... Mivel az esetek döntőtöbbségében helyettesíthetőek egymással!
    Mutasd a teljes hozzászólást!
  • Késő van. Jó éjt mindenkinek!
    Mutasd a teljes hozzászólást!
  • Én ezennel feladtam.
    A többieknek is ezt javasolnám
    Mutasd a teljes hozzászólást!
  • könyörgök, miért akarod ennyire feketében vagy fehérben látni a világot? NINCS olyan, hogy valami csak oop-vel, másik dolog meg csak anélkül oldható meg. Olyan sincs, hogy csak példányosított osztályokkal, vagy csak statikus elemekkel.
    Előnyei vannak mindkettőnek, adott helyzetben azt kell választani, amelyik a jobb megoldást adja.

    Fölösleges most itt példálózni, hogy a phpmyadmin-t hányan írják, mégse oop, én se mondom a szakács fórumon, hogy de lehet a levest turmixgéppel is kavargatni.
    Ha neked az kell, kavard turmixgéppel, senki nem tart vissza, hát hajrá. De ha az emberek véleményét kéred ki, ne ugorj már nekik azért, mert elmondják azt.
    Mutasd a teljes hozzászólást!
  • Látod ez a probléma itt.
    Pont a leglényegesebb dolgokat akarod elhagyni.

    10 éve programozom, nagyjából mindent tudok amit tudni kell erről! Több 100 alkalmazást írtam már!


    Igaz, hogy programozol, de lehet hogy érdemesebb lenne kicsit másfelé is eltekinteni, például a fujjjbölcsészet pszichológia felé és elolvasni EZT.
    Mutasd a teljes hozzászólást!
  • Messzemenő és megalapozatlan következtetésekbe bocsátkozol, feleslegesen! Én nem fikázást keresek, hanem építő vitát, mint már írtam mi a különbség a több fejlesztő szempontjából, hogy ugyanazok az osztályok statikusan vagy objektumként vannak használva! Nem számít hogy 1 vagy 100 van a csapatban vagy hogy 1 vagy 20 éve dolgoznak! Teljesen másról beszélünk
    Mutasd a teljes hozzászólást!
  • ez így általánosságban elég rossz érvelés, nem attól függ, hogy valami megvalósítható-e vagy sem, hogy a fordító hogyan dolgozik.

    Lehet én értettelek félre, én úgy értettem, te olyan problémát keresel, ami megoldható objektum orientáltan, nem objektum orientáltan viszont nem.
    Én erre mondtam, hogy szerintem ilyen nem létezhet, már csak azért sem, mert a processzor nem objektum orientáltan dolgozik.

    De várjunk csak, milyen fordítóról beszélünk egyáltalán PHP esetén?

    Persze nem volt a legjobb a szóhasználat, a lényeget leírtam feljebb.
    Mutasd a teljes hozzászólást!
  • Igen, mert az OOP lényege, hogy a valóságot próbálja leírni. Definiálja az osztályokat, meghatározza tulajdonságaikat és viselkedésüket.
    Ha OOP-ben programozol, akkor arra törekszel, hogy a problémát a leginkább valósághűen írd le. Ezáltal mindenkinek, egyszerűbb megértenie a valós működést és kapcsolatokat felfogni.
    Mutasd a teljes hozzászólást!
  • Ha ugyanaz a kódnak a formája, azaz osztályokban van minden,a akkor mi a különbség?...
    Mutasd a teljes hozzászólást!
  • Szerintem semmi köze nincs annak hányan dolgozunk egy projekten, ahhoz, hogy egy osztályt objektumként használunk-e vagy sem!
    Szeretem a csirkemellet is meg 43-as a cipőm, ez számít valamit?..

    Szóval nem dolgoztál még csapatban
    De ha egyedül dolgozol, és egy két éves programodat veszed elő, az is valami ilyesmi. Jobb esetben van valami dokumentációja, vagy legalább a publikus függvények kommentelve vannak, és nem kell beleásnod magad 200K forrásba, hogy az vajon mit is csinálhat, elég csak az interface részt átnézned, a többi meg végezze a dolgát, ahogy akarja. (kivéve persze a debuggolás meg optimalizálás)

    Szerintem nem is lehet, hisz a fordító nem OOP kódot generál.

    ez így általánosságban elég rossz érvelés, nem attól függ, hogy valami megvalósítható-e vagy sem, hogy a fordító hogyan dolgozik. De várjunk csak, milyen fordítóról beszélünk egyáltalán PHP esetén?
    Mutasd a teljes hozzászólást!
  • Valójában nem értem sem a kérdésed sem a problémád :D
    Mutasd a teljes hozzászólást!
  • Te értesz félre.
    Nem mondtam, hogy nem lehet (sőt, ha elolvasod a 00:55-ös hsz-em, egyértelművé válik).
    Én csak azt mondom, hogy egyszerűbb OOP-al.
    Mutasd a teljes hozzászólást!
  • A phpMyAdmin-t jó sokan írják és jó régóta még sem objektumorientált! Szóval én fecskéről beszélek te meg kecskéről! Vagy fordítva!
    Mutasd a teljes hozzászólást!
  • Igen, ugyanis akkor látnád, hogy sokkal mennyit számít, hogy milyen kódot raknak eléd, vagy ha mondjuk a másik által készített kódban változtatni kell valamit, akkor az téged mennyire érint.
    Ugyanis ilyenkor nagyon ki tud bukni az OOP előnye...
    Mutasd a teljes hozzászólást!
  • Abban viszont egyetértek veled, hogy valódi lehet/nem lehet példát senki nem mondott eddig.

    Szerintem nem is lehet, hisz a fordító nem OOP kódot generál.
    Az OOP kizárólag a programozó(k) segítésére, illetve a hibák számának csökkentésére való...
    Mutasd a teljes hozzászólást!
  • Szerintem semmi köze nincs annak hányan dolgozunk egy projekten, ahhoz, hogy egy osztályt objektumként használunk-e vagy sem!
    Szeretem a csirkemellet is meg 43-as a cipőm, ez számít valamit?..
    Mutasd a teljes hozzászólást!
abcd