PHP5 - különbség abszrakt és interface között
vki meg tudná mondani, mi a gyakorlati különbésg az absztrakt és az interface osztályok között? ugye absztakt osztályt nem lehet példányosítani, és az utódoszályoknak meg kelle valósítani valamennyi absztrakt metódust.
viszont az interface dokumentációjában is hasonlókat találtam (a példányosítást nem említették, de mivel nem tartalmaznak megvalósítást, így gondolom ez itt sem "játszik"), bár igazából mindkettőről elég rövid leírás található...
előre is köszi!
■ viszont az interface dokumentációjában is hasonlókat találtam (a példányosítást nem említették, de mivel nem tartalmaznak megvalósítást, így gondolom ez itt sem "játszik"), bár igazából mindkettőről elég rövid leírás található...
előre is köszi!
néhány dolog
Namost, az absztrakt osztály azért nem tudod példányosítani, mert egyes részei még nincsenek kifejtve. Interface esetén semmi sincs kifejtve, mindet neked kell megtenni.
Absztrakt osztályból lehet származtatni más osztályt, míg interfacet az osztály nem örököl, hanem megvalósít. Ezért egy osztály csak egy absztrakt osztályból származhat, viszont több interfacet is megvalósíthat.
Ja és a kettő nem zárja ki egymást.
interface vs absztrakt osztály
ezen kívül egy osztály implementálhat több interface-t is, viszont csak egy osztályt terjeszthet ki.
ezen kívül szerintem is csak egy hajszál választja el a kettőt.
szerk: azt hiszem Szabolcs szebben írta le a lényeget. :)
Egy hajszál?
Az abztrakt osztályt arra használjuk, hogy közös őse legyen a leszármazottainak, tehát ne kelljen minden leszármazottban ugyanazt megcsinálni. A közös részek mennek az absztrakt ősbe, a leszármazottak pedig csak az ettől való eltéréssel foglalkoznak. Így elkerülhető a redundáns kódolás.
Ezzel szemben az interfész egy felületet nyújt. Ráadásul itt nem a hagyományos értelemben vett öröklődés a cél, hanem az, hogy az alkalmazás két pontja egy absztrakt felületen (interfészen) keresztül tudjon egymáshoz kapcsolódni, és ne kelljen ezen kívül semmit se tudni a másikról.
Ha elkalandozol a tervezési minták (design patterns) felé, akkor nagyon szép példákat találhatsz a témában.
néha igen
a tervezési minták jól dolgok (van is egy jó könyvajánló itt), de weben néha kicsit ágyúval verébre hatásuk van. néha fel is bukkan egy-egy a tervezési minták ész nélküli használata miatti teljesítményprobléma, mint fórumtéma. ennek ellenére jópárat magam is használok, sokkal könnyebb fejleszteni, átláthatóbb, stb.
nekem is hasonlóak az érzéseim
design pattern létjogosultsága weben
Üdv,
Felhő
MVC?
arra szerettem volna kilyukadni, hogy webes alkalmazások fejlesztése során nagyátlagban pont a tervezési minták használatával válnak túl méretessé a programok. És pont az általad leírtak miatt gondolom ezt: "Ez független nyelvtől, ezek egyszerűen jól kitalált sémák..." nyelvtől független, de azért valljuk be, a webes szerverprogramozás alapszemlélete jelentősen eltér a desktopos esemény-vezérelt programozástól, ahol igazán van létjogosultsága a tervezési mintáknak.
De ez már szerintem nagyon OFF, főleg így karácsony előtt.. :)
indoklás?
Szóval nem a szerveroldali prograozás szemlélete a lényeg, hanem a Te szmeléleted, amibe vagy belefér vagy nem a tervezési minták használata.
Üdv,
Felhő
kösz hogy felhoztad...
Általános problémára nyújt megoldást persze, de weben azért igen csak más az általános probléma. egy ÁTLAGOS webes projekt során azért annyira sok osztályt nem kell írni, nincsenek annyira bonyolul algoritmusok.
Másrészről mint írtam alapvetően az objektumorientált paradikmákkal vannak "problémáim" webes környezetben. Egy hagyományos alkalmazás során létrehozol egy objektumot, és az a program futásáig él(vagy amíg meg nem szünteted). Nyilván szerveroldali szkript esetén is, de itt a program futása igen csak rövid időd jelent, és az objektumok közi kommunikáció sem olyan hangsúlyos, mert egy kérés során csupán néhány műveletet hajt végre a script. Ebből adódóan úgy érzem, sokszor már-már túl nagy absztrakcióval lehet csak ráhúzni egy feladatra egy-egy tervezési mintát. Amít írtam az - szerintem - az átlagos alkalmazások során van így(egyszerű portálmotor stb.), valószínű Te többször kapsz bonyolultabb feladatokat, ahol lehet tényleg jól jönnek a tervezési minták.
minták egy átlagos alkalmazásban
De a framework szintjén igen: singleton, factory, front controller, composite (pl. form és elemei), decorator (pl. page és a layout), observer (pl. loggolás), strategy (ez kb. bárhol előforduhat, ahol valamilyen logikát kiemelsz), proxy (pl. ott van bármilyen webservice-t kezelő cuccban), iterator (pl. egy resultset), adapter (pl. elfeded a phpmailer sajátosságait, hogy bármikor tudd swiftmailerre cserélni).
Ezek szernintem elég alap dolgok bármilyen oldal esetén (portált említettél!). Persze lehet mindent oldalt egyesével leprogramozni, de szerintem az nem egy járható út. És akkor ott van még a DB kérdése, ott is azért könnyen előjöhet valamilyen minta. Pl. egy valamilyen szintű DAO bármilyen egyszerű projekt esetén hasznos tud lenne, szépen elfedi a DB kezelő kódokat a többi résztől, valamint ezeket az amúgy alkalmazásban szétszórva jelentkező kódokat szépen egybe fogja. És ez megint nem csak egy öncélű OOP hülyeség: gyakran látom projektekben, hogy egy DB változtatást tök nehéz végig vezetni a projekten, mert a lekérdezések szét vannak szórva a különböző projektekben, valamint hasonló dolgok le vannak többször programozva, mert nem egy helyen vannak az összetartozó dolgok.
Üdv,
Felhő
Igen, csak kérdés, hogy mennyiben tekinthető egy weblap...
Csak amennyire komolyan veszed
mire gondolsz?
Üdv,
Felhő
Ez a thread belehalt a karácsonyba?
nagyon köszi!
Dokumentáció
Másrészt pedig sokszor látszik, hogy a PHP fejlesztőktől közepes OO alapokat feltételez a dokumentáció, mint ahogy (hozzám hasonlóan) sokan C++ és Java után/mellett PHP-zünk. Egyébként a PHP5 erősen a Java (nagyon szép) logikáját nyúlja le :-)
ui: én szívem szerint Java-s vagyok.
ez így van
Hogy ellent mondjak magamnak is: mostanában nagyon sok kezdővel találkoztam, akik php-n tanultak programozni, és phpval is tértek rá az oopra. (az egy más kérédés, hogy szerintem ez nagyon nem megfelelő tanulónyelv...).
Ha van lehetőség, örömmel beszállok, de annak nem látom értelmét, hogy mindeki írogasson vmit a saját blogjában. A weblaboron szerintem elég profi tartalmak vannak, és nagyon sokan értenek ehhez, így itt szerintem jól működhetne egy saját wiki.
Wiki
Weblabor Wiki (2006.11.22.)
láthatóság
Az interfész összes metódusa és attribútuma public, mert ez jellemzően valamilyen tulajdonságot ad hozzá egy meglévő osztályhoz (madár osztály implementálja a repülés interfészt, vagy kicsit webesebb példánál maradva egy listázó objektum megvalósítja (implementálja) a lapózhatóság, felsorolhatóság (iterator) interfészt).
Remélem sikerült még valamit hozzátennem,
Dani