Mint mindent, ezt is túlzásba lehet vinni. A szakmát elnézve egyelőre úgy látom túl keveset vannak használva a tervezési minták, a túltervezés szörnyetegével való riogatást elég korainak érzem.
Én elsősorban abból indultam ki, hogy itt, a Weblaboron naponta látok SQL, esetleg PHP API kérdéseket, de olyat így hirtelen nem tudok felidézni (a közelmúltból biztosan nem), amikor egy szolgáltatás APIjának megtervezéséhez vagy egy feladathoz választandó mintákkal kapcsolatban kért volna valaki segítséget (esetleg két konkurens megoldás előnyeit/hátrányait latolgatta).
Persze lehet hogy mindenki ezt intuitívan tudja és nem kell kérdeznie. Az is lehet hogy a többség leszarja. (Én feltételeztem a másodikat ;)
Én se nagyon találkozom olyan kóddal, ahol túlzásba vitték volna a dolgot. Ha mégis, már az is értékelendő, hiszen legalább az igyekezet megvolt, a tanulás és jobb szakemberré válás iránti vágy, és nem a teljes ignorancia, a jóóleszaz hozzáállás manifesztálódása egy nagy tál spagettikódban. Rosszabb esetben ideológiával alátámasztva :).
Tehát akinek a kódjában nincs túlzásba víve az absztrakciók halmozása, az ignoráns, spagettikódot író, ideologizáló patópál? Az is az, aki megvárja, hogy mivé forrja ki magát egy technika, és igyekszik más tapasztalataiból okulni?
Ezen kiforratlan technikák egy része tudtommal több évtizedes, más részüket évek óta sikerrel használják. Biztos találsz majd kettőt-hármat, amire ez nem igaz, kíméld meg magad attól, hogy begépeled őket :).
Amik ellen általában keresztesháborút vívsz. Nem hiszem, hogy a tervezési minták, az OOP vagy akár a tesztek írása egy pár hónapos, éppen hirtelen felkapott és hájpolt, múló hóbort lenne. Persze nem vagyok nagy szakértő a témában.
Komolyan elgondolkodtam, de én ilyennel nem igazán találkoztam még a munkám során... Olyannal viszont elég sokkal, ahol szenvedtek a rossz minőségű, merev, vagy teszt nélküli megoldásoktól. Elég nagy cégnél is láttam projecte(ke)t (többek között) emiatt teljesen megcsúszni, állandó bugfixálásba torkollni, majd leépülni.
A tesztekkel kapcsolatban egyelőre semleges állásponton vagyok, látom az előnyeiket és hátrányaikat; jelen pillanatban úgy gondolom, hogy nélkülük is lehet stabil programot írni, legalábbis az eddigi tapasztalataim ezt mutatják.
A tervezési mintákról azt gondolom, hogy ha az ember jól dolgozik, a programban automatikusan "ki fognak rajzolódni" a fejlesztés során (ez a blogmark is erről szól).
Az OOP-ről továbbra is lesúlytó a véleményem, egy nagyon ingatag lábakon álló paradigma, amiről, ha megkérdezünk két kollegát, mindketten mást és mást mondanak. Az öröklődés és a polimorfizmus egy merev, csak vertikálisan bővíthető struktúrát hoz létre, az adatok és a hozzájuk tartozó függvények "coupled" kódot eredményeznek, amitől máshol mindenáron meg akarnak szabadulni a szakemberek, és ha ezek után megnézzük, mi is marad az OOP-ből, hát, nem túl sok minden.
És ennek ellenére elismerem, hogy mégiscsak lehet jó programot OOP alapokon fejleszteni, ilyenekkel dolgozom nap mint nap, mert valaki ezzel a módszerrel is tud jó munkát kiadni a kezéből, másnak meg más elképzelések jobban fekszenek. Nem vagyunk egyformák.
Nem akarok megint belemenni, de szerintem olvass el pár alap könyvet a témában. Clean code, GOF pl. Konzekvensen és tényszerűen nem igaz, amit írsz az OOP-ről (pl hogy csak vertikálisan bővíthető, meg hogy coupled), a többi meg már többszörösen ki lett tárgyalva. Ami nem nekem baj, csak eléggé meglepő, hogy láthatóan sokat olvasol mindenféle témában és nagyon komoly energiát fektetsz abba, hogy harcolj valami ellen, amit viszont nem vagy hajlandó olyan mélységben megismerni, hogy valójában tudj róla vitatkozni. Ez így csak arra jó, hogy ha olyan olvassa aki esetleg csak ismerkedik a témával, azt teljesen összezavard.
Fontos: nem azt írtam, hogy az OOP per se vertikálisan bővíthető kódot eredményez, hanem azt, hogy ez akkor áll fenn, ha polimorfizmust használunk. Lényeges különbség.
az adatok és a hozzájuk tartozó függvények "coupled" kódot eredményeznek
Az encapsulationt magyarul "egységbe zárásnak" szokás fordítani, (vagyis hogy egy objektum annyival több egy rekordnál, hogy nem csak az összetartozó adatstruktúrát, de a hozzájuk - szorosan - kapcsolódó kódot is tartalmazza).
A strong coupling vs. loose coupling témaköre - legjobb tudásom szerint - inkább arról szól, hogy interfésztől függjünk és ne implementációtól (így az adott implementáció később cserélhető anélkül, hogy a tőle függő kódon változtathatnánk).
Miért korlátozunk le bárkit, hogy az adott adatstruktúrán csak a mi függvényeinkkel lehet műveleteket végezni? Miért korlátozunk le bárkit, hogy az adott függvényekkel csak a mi adatstruktúránkon végezhetünk műveleteket?
Ez már a saját API tervezéseden múlik (vagyis lehet gettered/settered minden adathoz). A lényeg, hogy megteheted.. ;)
Az alap elgondolás, hogy az implementációt (egy függvény tartalmát) később változtathasd. Ha publikus adattagjaid vannak, azoknak a működését nem tudod lecserélni, csak a függvényekért. - Egyes nyelvekben léteznek propertyk, amik kívülről adattagoknak látszanak, belülről viszont valójában függvények (aminek tartalma módosítható).
Tipikus példám szokott lenni:
class Előadás {
public kezdetiIdő;
public hossz;
}
Most tételezzük fel, hogy megváltozik az adatszerkezet:
class Előadás {
public kezdetiIdő;
public befejezésiIdő;
}
A kód, ami eddig dolgozott az objektumunkkal már működésképtelen. Ezzel szemben a következő objektum:
class Előadás {
private kezdetiIdő;
private hossz;
public getKezdésiIdő() { return kezdésiIdő; }
public getHossz() { return hossz; }
}
könnyen módosítható:
class Előadás {
private kezdetiIdő;
private befejezésiIdő;
public getKezdésiIdő() { return kezdésiIdő; }
public getBefejezésiIdő() { return befejezésiIdő; }
public getHossz() { return befejezésiIdő - kezdésiIdő; }
}
... és így az interfész nem törik el.
A struktúra (private láthatóság) garantálja, hogy az adatokra csak ebben a fájlban (azon belül ebben a classban) hívatkozol. Tehát ahelyett, hogy az egész programodat át kéne fésülni megváltoztatandó kódért, itt tudod hogy ha a classod lefordul akkor máshol már tuti nem lesz gond.
Lehet, hogy én értek félre valamit, de nekem a fentiek ellenkeznek azzal, amit tgr írt múltkor:
Ettől teljesen eltérő kérdés, hogy van-e állapota egy függvénynek/objektumnak. Általában igaz, hogy minél kevesebbnek van, annál jobb (könnyebb érvelni a kód helyességéről), OOP-ben ezt tipikusan úgy oldod meg, hogy szétbontod a kódot value objectekre, amikben csak állapot van, logika nincs, és service-ekre, amikben csak logika van, állapot nincs.
Az idézett tanácsok jó megközelítést képviselnek egy adatvezérelt (web)alkalmazás üzleti logikájának implementálásánál. A fenti példa osztálya nagyon hasonlít egy tipikus value objectre. Arról hogy ott megengedhető-e ilyen szintű logika implementálása eltérő vélemények léteznek (néha praktikus, néha kevésbé).
Az alkalmazást fenntartó infrastruktúra (pl. az ORM) nagyságrendekkel bonyolultabb problémákat old meg, mint amik az alkalmazás logikáját képezik. A tgr által írt ökölszabály tipikusan az adatközpontú műveletekre vonatkozik. Az OOP irányelvei általánosabb érvényűek.
Fontos: nem azt írtam, hogy az OOP per se vertikálisan bővíthető kódot eredményez, hanem azt, hogy ez akkor áll fenn, ha polimorfizmust használunk. Lényeges különbség.
Nem értem ezt az állítást. Mit jelent az, hogy csak vertikálisan bővíthető, ha polimorfizmust használunk? Polimorfizmus != öröklődés. Az öröklés+override egy módja a polimorfizmus elérésének. Egy másik az implementálás. És végülis a kompozíció is egyfajta polimorfizmus.
Az encapsulation vs coupled dolgot sem értem. A kód mindig coupled a használt változókhoz, ha ragaszkodsz hozzá, hogy ebben az amúgy nem használt kontextusban használjuk ezt a jelzőt. A coupled azt jelenti, amit vbence is írt.
Túltervezés
Relatív
Pontosan
Aktivitás
Persze lehet hogy mindenki ezt intuitívan tudja és nem kell kérdeznie. Az is lehet hogy a többség leszarja. (Én feltételeztem a másodikat ;)
1nf3rn0-nak szoktak ilyen
Én se nagyon találkozom olyan
Tehát akinek a kódjában nincs
Ha ezt olvasod ki abból, amit
Ezen kiforratlan technikák egy része tudtommal több évtizedes, más részüket évek óta sikerrel használják. Biztos találsz majd kettőt-hármat, amire ez nem igaz, kíméld meg magad attól, hogy begépeled őket :).
Ki mondta, hogy vannak több
Amik ellen általában
Sosem állítottam, hogy ezek
Komolyan elgondolkodtam, de
A tesztekkel kapcsolatban
A tervezési mintákról azt gondolom, hogy ha az ember jól dolgozik, a programban automatikusan "ki fognak rajzolódni" a fejlesztés során (ez a blogmark is erről szól).
Az OOP-ről továbbra is lesúlytó a véleményem, egy nagyon ingatag lábakon álló paradigma, amiről, ha megkérdezünk két kollegát, mindketten mást és mást mondanak. Az öröklődés és a polimorfizmus egy merev, csak vertikálisan bővíthető struktúrát hoz létre, az adatok és a hozzájuk tartozó függvények "coupled" kódot eredményeznek, amitől máshol mindenáron meg akarnak szabadulni a szakemberek, és ha ezek után megnézzük, mi is marad az OOP-ből, hát, nem túl sok minden.
És ennek ellenére elismerem, hogy mégiscsak lehet jó programot OOP alapokon fejleszteni, ilyenekkel dolgozom nap mint nap, mert valaki ezzel a módszerrel is tud jó munkát kiadni a kezéből, másnak meg más elképzelések jobban fekszenek. Nem vagyunk egyformák.
Nem akarok megint belemenni,
Olvasok tovább. Hátha egyszer
Fontos: nem azt írtam, hogy az OOP per se vertikálisan bővíthető kódot eredményez, hanem azt, hogy ez akkor áll fenn, ha polimorfizmust használunk. Lényeges különbség.
Encapsulation
A strong coupling vs. loose coupling témaköre - legjobb tudásom szerint - inkább arról szól, hogy interfésztől függjünk és ne implementációtól (így az adott implementáció később cserélhető anélkül, hogy a tőle függő kódon változtathatnánk).
Kérdések
API tervezés
Az alap elgondolás, hogy az implementációt (egy függvény tartalmát) később változtathasd. Ha publikus adattagjaid vannak, azoknak a működését nem tudod lecserélni, csak a függvényekért. - Egyes nyelvekben léteznek propertyk, amik kívülről adattagoknak látszanak, belülről viszont valójában függvények (aminek tartalma módosítható).
Tipikus példám szokott lenni:
A struktúra (private láthatóság) garantálja, hogy az adatokra csak ebben a fájlban (azon belül ebben a classban) hívatkozol. Tehát ahelyett, hogy az egész programodat át kéne fésülni megváltoztatandó kódért, itt tudod hogy ha a classod lefordul akkor máshol már tuti nem lesz gond.
Szétbontás
Tanácsok
Az alkalmazást fenntartó infrastruktúra (pl. az ORM) nagyságrendekkel bonyolultabb problémákat old meg, mint amik az alkalmazás logikáját képezik. A tgr által írt ökölszabály tipikusan az adatközpontú műveletekre vonatkozik. Az OOP irányelvei általánosabb érvényűek.
Fontos: nem azt írtam, hogy
Az encapsulation vs coupled dolgot sem értem. A kód mindig coupled a használt változókhoz, ha ragaszkodsz hozzá, hogy ebben az amúgy nem használt kontextusban használjuk ezt a jelzőt. A coupled azt jelenti, amit vbence is írt.
Öröklődés